一步步编写操作系统21 x86虚拟机bochs 跟踪bios
為了讓大家更好的理解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啟動應該更深刻一些了。
以上內容來自《操作系統真象還原》,請大家支持正版,多謝。
【再續】
總結
以上是生活随笔為你收集整理的一步步编写操作系统21 x86虚拟机bochs 跟踪bios的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云计算底层技术-虚拟网络设备(Bridg
- 下一篇: 消息称特斯拉开启新一轮裁员:“小时工”也