linux 0.11 在 bochs中的调试问题 - 解决缺页中断(page_fault)问题

来源:互联网 发布:java初学者项目案例 编辑:程序博客网 时间:2024/05/22 00:26

linux 0.11 调试时学习linux 0.11一个非常好的方式,但是若没有设置好bochs,会出现page_fault缺页中断,导致不能正常调试。

参考 下面的文章对bochs2.2 进行修改编译后发现并不能解决问题。

{

 这个问题困扰了好长时间,bxrc配置文件不使能stub的情况下,可以正常运行,但是一进入到gdb中,就总是出现page_fault,查了好久终于发出原因,是bochs在检测到int14 对应的信号量SIGSEGV时会向gdb发送信号量,而gdb接收到此信号默认的处理就是停止,打印,于是在进入到init函数后的执行过程中,如果执行的文件如sh总是出现页面不在物理页面的情况下,就会报错,而此时应该是正常现象。解决方案如下:
    重新安装bochs,修改gdbstub.cc中的
    476 if (last_stop_reason == GDBSTUB_EXECUTION_BREAKPOINT ||
    477 last_stop_reason == GDBSTUB_TRACE)
    478 {
    479 write_signal(&buf[1], SIGTRAP);
    480 }
    481 else
    482 {
    483 write_signal(&buf[1], 0);
    484 }
     为
    476 if (last_stop_reason == GDBSTUB_EXECUTION_BREAKPOINT ||
    477 last_stop_reason == GDBSTUB_TRACE)
    478 { 
    479 write_signal(&buf[1], SIGTRAP);
    480 }
    481 else if (last_stop_reason == GDBSTUB_STOP_NO_REASON)
    482 {
    483 write_signal(&buf[1], SIGSEGV);
    484 }
    485 else
    486 {
    487 write_signal(&buf[1], 0);
    488 }
    同时在进入gdb时键入:
       handle SIGSEGV nostop noprint ignore 
    这样gdb接收到此信号时将不停止且不打印处理,使得程序得以继续运行。

}


于是改用bochs 2.6,应用上文介绍的方法进行修改编译后发现时可以忽略掉该信号的;

另外又出现新的问题,在bochs中使用break main命令,发现虚拟机并不会停在main函数,这是个奇怪的问题,于是只能先改用break mem_init了,这是进入main函数后第一个函数,发现可以正常停止,还有就是好像必须在编译目录中启动调试虚拟机才行,要是调试虚拟机不在编译目录启动,就会出问题,不知道什么原因。

gdb也必须在编译目录启动 : gdb -q tools/system,这个必须在编译目录启动!


参考文献:http://www.oldlinux.org/oldlinux/viewthread.php?tid=10761&highlight=

http://oss.lzu.edu.cn/old/modules/newbb/viewpost.php?viewmode=compact&order=DESC&forum=51

https://cms.hit.edu.cn/mod/wiki/view.php?pageid=13

http://www.oldlinux.org/oldlinux/viewthread.php?tid=10837