Bochs源码分析 - 5: 从启动到cpu运行之前的一系列初始化

前言

        现在正式开始调试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函数来继续往下分析,下面一段代码引起了我们的好奇,代码片段如下。使用setjmp这种异常处理的小技巧,关于这个技巧,知乎中有一篇文章讲的挺好的:《setjmp是怎么是怎么工作的》。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值