[MIT6.828]LAB2 Challenge 总结

Challenge 1: 大页机制的实现
没有在代码中实现,写了个步骤供参考:
0、先把预定义的PGSIZE之类的宏都更改为与大页相匹配的情况。
1、由于页大小变成了4M,所以要修改从代码,要内核4M处加载。
3、page_init()中内存布局也会发生对应变化,低端4M保留给实模式和IO映射,然后4M-8M是内核代码数据,8M-16M可以用来放置页目录以及物理页面数据结构,其他空闲。
4、用于页面映射的操作的pgdir_walk(),page_insert(),page_remove(),page_lookup(),boot_map_segment()这些函数要修改,首先是物理寻址只需要页目录一层就足够了,其次要给页属性加上PTE_PS标志位用来表示大页。
5、映射物理内存到线性内存的时候需要注意这时候内核栈没有页对齐,而是在内核代码数据这个大页里面,内核栈也可以不用映射,用bootstacktop变量代替。但是数据溢出后会覆盖内核代码及其以前的区域,不能保证安全性(原内核栈数据溢出后会挂死,因为访问了未映射的页)。如果想要使用跟原内核一样的行为,必须修改内核代码,把栈和代码分开,例如放到内核开头的,这时候第3步的内存布局发生变化。在映射完毕的时候也需要注意为了防止溢出影响到别的数据,要用一页的虚拟内存映射为空放到内核栈的下面。

Challenge 2:添加showmappings dump等查看内存/页 的命令
在monitor.c文件中实现了如下命令:
1、showmapping(别名sm):用来显示页面映射状态(monitor.c/show_mapping() pmap.h/pagepri2str())


2、spp:设置页面属性(monitor.c/set_pagepriority() pmap.h/str2pagepri())

3、dump:查看内存的内容(dump()函数)


具体内容见附件,命令使用方法见help命令

Challenge 3: 用户态4G虚拟地址可用的设计方案
1、权限转化方式
只使用调用门来从用户态转向内核态。
2、内核映射方式
首先寻找未被使用的虚拟地址,如果找不到,则兑换出一块内存到硬盘,把兑换信息记录到内核中,把该块地址映射到内核,标志为kenel权限,并更改调用门中或者其他hardcoding的内核地址(为了这里修改方便,内核重要虚拟地址尽量不要写死,可以用宏的方式来实现)。跳转的新映射的内核地址,然后根据已保存信息将旧页恢复(标记为空闲或者把曾经兑换到硬盘的页读入进来)。
3、异常处理机制
用户程序访问到被内核占用的页面,会产生保护错误。在保护错误处理过程中,根据保护错误类型(这里是U/S权限出错)执行2操作。
4、优点:应用程序可以占用全部虚拟空间,提高了应用程序设计的灵活性,以及对需要超大内存空间程序的支持。
5、缺点:增加了内核的复杂度,降低了性能,尤其处理U/S权限保护错误的时候需要做很多操作。
6、总结:32位程序还够用的时候,64位已经大行其道;受限于机器性能,一台机器上同时运行的程序不会非常多,以及绝大多数程序不需要超大虚拟内存;以及上述的缺点使得这种行为意义不大。

Challenge 4: 给内核添加连续物理页分配功能

修改了struct Page结构,使其可以保存连续物理页分配状态,声明了一个page_alloc_list 队列保存已分配物理页,并在init_page()函数里初始化。

在pmap.c中添加了如下函数
1、void *kalloc();分配一个页并返回其内核虚拟地址

2、void *kallocs(size_t size);分配大小为size且在物理内存中连续的页;


3、void kfree(void *ptr);释放内存

4、void kffree(void *ptr);强制释放处于连续分配页中的内存页(从当前地址释放到连续分配的末尾)


5、int kpage_status(physaddr_t pa, physaddr_t *head_pa, int *cnt); 查询位于pa处物理页面的信息


Challenge 5: 添加分配/查看/释放页的命令
在monitor.c中实现了如下命令
1、allocpage: 分配一个或者多个页(alloc_pages()函数)


2、freepage: 释放一个或者多个页(free_pages()函数)


3、pagestatus: 查看指定页面状态(page_status()函数)

修改了mon_help(),和struct command结构体,使得帮助信息更完善。其他地方也做了一些小修改,使得UI更为友好,但是还有很多不足之处没有时间一一完善,其实一个人用的话没必要这么做个详细(尤其是帮助),主要是想和大家多多交流。



EOF

你可能感兴趣的:(设计模式,数据结构,C++,c,C#)