Bochs源码分析-调试功能

因为学习需要,要看虚拟机Bochs的源代码。写随笔主要为了学习总结,其次是分享大家共同研究,大神勿喷,欢迎评论。

手头资料:bochs源代码,下于:bochs.sourceforge.net,还有喻强写的源码分析电纸书。

Bochs虚拟机一个很重要的功能就是调试,有助于系统程序的开发与研究,虚拟机可以让操作系统在任何时候停止运行,并查看此时计算机内部所有部件的内容与数据状态。在Bochs源码中有关模拟机调试的代码放在bx_debug子目录下,其中调试的主体框架在dbg_main.cpp实现,当然调试没有响应的类(调试类),而是一些响应的调试函数,这些函数是和模拟机主程序一起运行,即位于同一线程。如果编译带有调试功能的Bochs,那么Bochs启动时默认进入调试入口的,调试入口位于dbg_main.cpp下的:int bx_dbg_main(void),它是在main.cpp函数完成模拟机的配置工作和模拟机所有部件的初始化后由int bx_begin_simulation (int argc, char *argv[])中884行跳入bx_dbg_main。bx_dgb_main所做的工作是先进行一些简单的和调试功能有关的初始化然后进入循环bx_dbg_user_input_loop();,不断的接受用户的调试指令,接受指令后进行分析,分析的具体工作parser.cpp中完成,分析完会调用相应的处理函数,具体相应的处理函数全都放在此文件(dbg_main.cpp)中,具体的某些指令可能是让CPU继续运行,代码就会跳转到cpu_loop中去,而在CPU运行取指令、执行指令的循环过程中,可能会触发调试异常又返回到bx_dbg_user_input_loop();中,等待用户的进一步处理,一以便再次获取运行的机会,可以说cpu_loop被包含在bx_dbg_user_input_loop();大的循环中。当然这些具体实现的调试函数是对模拟机的各种类可见,也就是说它可以之间访问CPU类、内存类的所有变量,以查询其状态,就好像模拟机的各种类变量与函数是自己本地变量一样。当然调试功能的实现,是因为X86体系结构本身支持调试功能,在CPU的内部有相应的调试寄存器,如:EFLAGS里面的单步指令位,正因为有了CPU的调试支持,这些函数才能实现,当然Bochs丰富了调试功能,方便用户使用。

posted @ 2013-11-06 22:04  安心编码  阅读(830)  评论(0编辑  收藏  举报