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