前言
现在正式开始调试bochs源代码,在这之前我也没读过bochs源码,算是从零开始读,自己可能会走入一些误区,有些可能猜错,如果发现之后会来改正。我们先大体走一遍整个系统,不要纠结于各种复杂细节流程。
这篇文章开始分析程序在点击启动后如何开始并且一步步初始化完成初始化,完成相关配置文件。说实话,如下图bochs启动时一系列的配置参数,对像我这种新手来说是相当恐怖的,各种启动参数信息。其实调试过一遍之后,虽然里面很多细节还是不太懂,但是再看这些信息心里踏实多了。
启动前的环境配置
这里使用第二章的环境配置:https://blog.csdn.net/WriteAnything_/article/details/118655446
如果修改过第四章,那么记得把那些配置宏文件给修改过去,然后重新编译,因为我们现在还暂时不需要使用IDA(后续调试bochs时可能会用到)。
在main函数入口处断下
程序开始调试的第一个步骤肯定是现在main函数出口前断下,在 bochs\main.cc 中搜索 main函数,来获取整个函数,这就是程序的入口函数。
int CDECL main(int argc, char *argv[])
{
bx_startup_flags.argc = argc;
bx_startup_flags.argv = argv;
....
return bxmain();
}
该函数没有做什么,启动时也没有传递任何参数,而是调用了一个关键函数 bxmain( ),这似乎才是真正的函数入口,我们继续调试进去看看。
分析 bxmain函数
bx_init_siminterface( ) 函数初始化 SIM
进入bxmian函数中,首先映入眼帘的是一个bx_init_siminterface()函数,该函数初始化bx_real_sim_c类的实体SIM,该SIM可以认为bochs这个类的实体。(之后回来分析这个类,现在我也不太了解)
void bx_init_siminterface()
{
if (SIM == NULL) {
...
SIM = new bx_real_sim_c();
}
.....
}
SetJmp的小技巧
再返回到bxmain函数来继续往下分析,下面一段代码引起了我们的好奇,代码片