前言
上一篇文章,我们分析了floppy设备的初始化,本来我们希望看看floppy的工作原理,但是调试时发现其运行cpu,通过BIOS启动指令来调用floppy。(从现在来看这是肯定的,floppy是外设,要想调用必须通过cpu,还是自己对底层不太熟悉)
Bochs的CPU模块特别复杂,函数众多,我们是第一次分析,对其结构还是不太熟悉,我们先尝试来看其执行流程。在分析前,我浏览了一遍喻强老师的《Bochs项目源码分析与注释》,其CPU模块的核心图如下。
CPU模块的分析思路
CPU模块太庞大了,花了很长时间来考虑如何来分析这部分代码。CPU会去读取指令并且解析指令,可CPU执行的第一条指令是哪里呢?经过资料查询,当电源通电时运行的是0xFFF0指令,然后运行BIOS一段程序来初始化各个硬件端口,之后启动bootloader,由bootloader来启动操作系统。
其BIOS代码,还记得我们的配置文件嚒?其中有关于BIOS的配置文件,如下图,这个就是bochs用的bios组件。
romimage: file= D:/code/git_local_code/kkbochs-master/bochs-src/bios/BIOS-bochs-latest
我们将该文件拖到IDA中来进行分析。(这可以编译出来,但是不源码分析了,毕竟我们现在主要的目的是分析CPU,我们通过逆向分析其找到运行的前几个指令即可,而不是分析bios源码,之后可能会涉及这个bios,貌似是SeaBios项目?)
如上的IDA分析图,其运行的前几个指令如下。我们之后将其bochs重新编译为调试器模式,其详细操作在第四章中有所描述,然后用调试模式运行bochs来验证这几个指令是否正确。我这里验证是正确的,就不在这里赘述了。
BIOS_F:FFF0 jmp far ptr start_0
BIOS_F:E05B start_0: ; CODE XREF: sub_F5421+2BC↑J
BIOS_F:E05B ; start↓J
BIOS_F:E05B xo