MIT6.828_Lab3_PartB_Page Faults, Breakpoints Exceptions, and System Calls

这篇博客详细介绍了操作系统中处理页面错误、断点异常和系统调用的过程。在JOS操作系统中,页面错误通过page_fault_handler()函数处理,断点异常用于调试,系统调用则允许用户进程请求内核服务。博客还涵盖了用户模式启动、内存保护和相关练习,强调了内存保护在防止错误传播和保护内核完整性方面的重要性。
摘要由CSDN通过智能技术生成

Part B: Page Faults, Breakpoints Exceptions, and System Calls

现在,JOS具有了基本的异常处理功能,我们将对其进行优化,以提供用于处理异常或中断的重要操作系统原语。

处理页面故障

页面错误异常(T_PGFLT)是一个特别重要的异常,当处理器发生页面故障时,引起故障的线性(即虚拟)地址会被存储在特殊的处理器控制寄存器CR2中。在trap.c中,我们提供了一个函数page_fault_handler()(仅编写了开头的代码),用于处理页面错误异常。

练习5:修改trap_dispatch()来将页面错误异常调度到page_fault_handler()。修改后,makegrade测试一下,看看是否通过了faultread, faultreadkernel, faultwrite, and faultwritekernel的检查。如果其中任何一个不起作用,找出原因并修复。我们可以使用make run-x或make run-x-nox将JOS引导到特定的用户程序中。 例如,make run-hello-nox运行hello用户程序。

断点异常

断点异常(T_BRKPT)通常用于允许调试器通过用特殊的int 3软件中断指令临时替换相关的程序指令,从而在程序代码中插入断点。
练习6:修改trap_dispatch()使断点异常能够调用内核监视器。要求:通过breakpoint的测试。
上面两个练习都比较简单,代码如下:
在这里插入图片描述
成功通过测试
在这里插入图片描述
练习6还有个挑战,要求修改jos的内核监视器代码来实现单步调试功能,尝试写了一下,还是有点问题,这
里先留个坑,相关参考资料:x86—EFLAGS寄存器详解

问题3:断点测试用例将生成断点异常或常规保护错误,具体生成哪个错误取决于您如何初始化IDT中的
中断描述符(就是trap_init调用SETGATE那一段代码),这是为什么? 为了使断点异常按上述规定工作,您需要如何对其进行设置?什么不正确的设置将导致它触发常规保护故障?

答:在trap_ini

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
// 引入需要的头文件 #include <iostream> // 标准输入输出流 #include <list> // 双向链表 #include <random> // 随机数生成器 using namespace std; int main() { // 使用随机函数生成页面访问序列 random_device rd; // 生成随机种子 mt19937 gen(rd()); // 随机数生成器 uniform_int_distribution<> dis(0, 18); // 生成0-18的均匀分布随机数 list<int> page_access_sequence; // 双向链表,存储页面访问序列 for (int i = 0; i < 54; i++) { // 生成54个随机数,存储在page_access_sequence中 page_access_sequence.push_back(dis(gen)); } // LRU算法,用于页面置换 int M = 6; // 主存储器帧数 list<int> main_memory; // 双向链表,存储主存储器中的页面 int page_faults = 0; // 页面缺失次数 for (auto it = page_access_sequence.begin(); it != page_access_sequence.end(); ++it) { // 遍历页面访问序列 // 检查页面是否已经在主存储器中 auto pos = find(main_memory.begin(), main_memory.end(), *it); // 找到页面位置 if (pos != main_memory.end()) { // 页面已经在主存储器中 // 页面命中,将页面移到链表头部 main_memory.erase(pos); // 删除旧的页面 main_memory.push_front(*it); // 将页面移到链表头部 } else { // 页面不在主存储器中,产生页面缺失 page_faults++; // 增加页面缺失次数 if (main_memory.size() == M) { // 主存储器已满,需要进行页面置换 main_memory.pop_back(); // 移除最久未访问的页面 } main_memory.push_front(*it); // 将新页面加入主存储器 } } // 输出页面置换序列和页面缺失率 cout << "Page replacement sequence: "; for (auto it = main_memory.begin(); it != main_memory.end(); ++it) { // 输出主存储器中的页面 cout << *it << " "; } cout << endl; cout << "Page fault rate: " << (double)page_faults / (double)54 << endl; return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值