一步步编写操作系统21 x86虚拟机bochs 跟踪bios
為了讓大家更好的理解bios是怎樣被執(zhí)行的,也就是計算機(jī)中第一個軟件是怎樣開始的,咱們還是先看下圖3-17。在圖的上面第5行,顯示的是下一條待執(zhí)行的指令,這是程序計數(shù)器(PC)中的值,在x86上的程序計數(shù)器是指cs:ip。大家看,cs是0xf000,ip是fff0,所以最終地址是0xffff0,這是bios的入口地址:低端1M內(nèi)存最頂端的16字節(jié)。忘記的同學(xué)翻看以往文章中有介紹實(shí)模式下的內(nèi)存布局。在右邊的jmp far f000:e05b,是指此內(nèi)存0xffff0處的內(nèi)容,在內(nèi)存中,內(nèi)容不是普通數(shù)據(jù)就是指令,在此處就是條跳轉(zhuǎn)指令。這是咱們之前分析bios時所說的,1M內(nèi)存的最頂端只有16字節(jié),肯定容不下完整bios代碼,必然是條跳轉(zhuǎn)指令。由此可見,果然沒錯,它是跳轉(zhuǎn)到0xf000:e05b的地方了。咱們需要驗證一下內(nèi)存0xffff0處的內(nèi)容是不是jmp far f000:e05b。
驗證的方法有多種,不過先來個簡單粗暴可依賴的,咱們查看此處內(nèi)存的內(nèi)容是什么。內(nèi)容如圖:
由于默認(rèn)xp是以4字節(jié)來顯示,所以xp中斜杠后面指定的數(shù)字2,最終會讓xp顯示8個字節(jié)。提醒一下,咱們bochs模擬的是x86平臺,它是小端字節(jié)序。咱們只看1個4字節(jié),先從低地址看,最低位是ea,這是直接絕對遠(yuǎn)轉(zhuǎn)移jmp far的機(jī)器碼,高位的是0xe05b,這是jmp far的操作數(shù),待跳轉(zhuǎn)到的地址,如果忘記指令格式的同學(xué),趕緊到前面找到IA32指令格式回憶一下。
這與程序計數(shù)器(cs:ip)中指定的內(nèi)容是吻合的,不過咱們還是不太放心,也許您說,萬一0x00e05bea只是普通數(shù)據(jù)呢,我又對機(jī)器碼不熟,不許忽悠我。為了打消您的疑慮,那再用一種方法來驗證一下吧。
在“Debugger control”類中,有個命令U,它用來將內(nèi)存數(shù)據(jù)反匯編成指令。咱們看一下此命令的幫助。help u回車后效果如圖:
大概意思是說,u和disasm是一樣的命令,用哪個都行,其用法是在后面跟需要匯編的指令數(shù),起始線性地址,終止線性地址。由于我們在實(shí)模式下,線性地址就是物理地址。鍵入 u/1 0xffff0回車,效果如圖:
果然沒有忽悠大家,地址0xffff0處的內(nèi)容確實(shí)是指令,并且是jmp far f000:e05b。這下大家對理解bios啟動應(yīng)該更深刻一些了。
以上內(nèi)容來自《操作系統(tǒng)真象還原》,請大家支持正版,多謝。
【再續(xù)】
總結(jié)
以上是生活随笔為你收集整理的一步步编写操作系统21 x86虚拟机bochs 跟踪bios的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云计算底层技术-虚拟网络设备(Bridg
- 下一篇: 消息称特斯拉开启新一轮裁员:“小时工”也