为了让大家更好的理解bios是怎样被执行的,也就是计算机中第一个软件是怎样开始的,咱们还是先看下图3-17。在图的上面第5行,显示的是下一条待执行的指令,这是程序计数器(PC)中的值,在x86上的程序计数器是指cs:ip。大家看,cs是0xf000,ip是fff0,所以最终地址是0xffff0,这是bios的入口地址:低端1M内存最顶端的16字节。忘记的同学翻看以往文章中有介绍实模式下的内存布局。在右边的jmp far f000:e05b,是指此内存0xffff0处的内容,在内存中,内容不是普通数据就是指令,在此处就是条跳转指令。这是咱们之前分析bios时所说的,1M内存的最顶端只有16字节,肯定容不下完整bios代码,必然是条跳转指令。由此可见,果然没错,它是跳转到0xf000:e05b的地方了。咱们需要验证一下内存0xffff0处的内容是不是jmp far f000:e05b。
验证的方法有多种,不过先来个简单粗暴可依赖的,咱们查看此处内存的内容是什么。内容如图:
由于默认xp是以4字节来显示,所以xp中斜杠后面指定的数字2,最终会让xp显示8个字节。提醒一下,咱们bochs模拟的是x86平台,它是小端字节序。咱们只看1个4字节,先从低地址看,最低位是ea,这是直接绝对远转移jmp far的机器码,高位的是0xe05b,这是jmp far的操作数,待跳转到的地址,如果忘记指令格式的同学,赶紧到前面找到IA32指令格式回忆一下。
这与程序计数器(cs:ip)中指定的内容是吻合的,不过咱们还是不太放心,也许您说,万一0x00e05bea只是普通数据呢,我又对机器码不熟,不许忽悠我。为了打消您的疑虑,那再用一种方法来验证一下吧。
在“Debugger control”类中,有个命令U,它用来将内存数据反汇编成指令。咱们看一下此命令的帮助。help u回车后效果如图:
大概意思是说,u和disasm是一样的命令,用哪个都行,其用法是在后面跟需要汇编的指令数,起始线性地址,终止线性地址。由于我们在实模式下,线性地址就是物理地址。键入 u/1 0xffff0回车,效果如图:
果然没有忽悠大家,地址0xffff0处的内容确实是指令,并且是jmp far f000:e05b。这下大家对理解bios启动应该更深刻一些了。
以上内容来自《操作系统真象还原》,请大家支持正版,多谢。
【再续】