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
分享到:
相关推荐
MIT6.828 lab4 报告中包含有具体的基础知识和练习的解析,具有很好的学习价值
MIT 6.828 lab3的完整代码, 经试验可以完美运行,在写报告的时候可以参考一下。
MIT 6.828 JOS lab3 附件里存放的是lab3的源代码,修改后滴……
MIT 6.828 JOS 操作系统Lab1 - Lab5的全部代码。 MIT 6.828 是精典的操作系统公开课程。同时也是我们对系统学习和认知的很好的课程。作者曾经也苦于没有很好的实践方案让自己更深入的了解操作系统和x86体系机构。...
这是JOS mit6.828课程的网站资源,为了学习操作系统,但是害怕这门课的教程总是变来变去,并且配置环镜总是变化,所以把除视频和lab1,lab2...lab7的源代码之外的所有网站的资源全部下载下来了,这样就可以安心的学习...
完成了6个lab必做的execise部分,希望能为大家提供点帮助~
MIT6.828 lab3 报告中包含有具体的基础知识和练习的解析,具有很好的学习价值
MIT6.828 lab5 报告中包含有具体的基础知识和练习的解析,具有很好的学习价值
mit 6.828 lab1答案 printf.c 里面的是代码的实现 打印8进制数字
Operating System Lecture Notes (MIT 6.828) Operating System Lecture Notes (MIT 6.828)
报告中具有详细的基础知识和每个练习的对应解释,具有很好的学习价值
MIT 的JOS系统,资源里面是lab2的修改后源码
无论是自己学习还是工作参考都是很好的资源
报告中具有详细的基础知识和每个练习的对应解释,具有很好的学习价值
MIT 6.828 操作系统讲义 MIT 6.828 操作系统讲义 MIT 6.828 操作系统讲义 ===================
MIT6.828课程JOS的LAB4的源代码。造福大众,从我做起
git qemu mit6.828
1.实现mmio_map_region + page_init微调 2.设置每个cpu的内核堆栈 3.设置CPU的特殊寄存器值 4.设置锁 5.实现RR调度 6
MIT 6.828 操作系统实验.zip
这是MIT6.828的个人学习笔记,纳入非计算机专业出身,可能会有太多纰漏,烦请大神斧正。个人认为,操作系统是计算机专业课之中综合性很强的一门课,牵涉面广,知识点多,相对也非常难学。 大名鼎鼎的6.828的最大的...