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