我想建立自己的啓動加載程序,然後加載然後從實模式切換到保護模式,加載GDT描述符,然後調用一些階段2代碼。由於我無法弄清楚調試我的程序的好方法,所以讓事情順利進行一直是一場艱苦的戰鬥。出於某種奇怪的原因,我的代碼在將我的引導程序的第二個扇區讀入內存時失敗,地址爲0x1000
。我嘗試使用int 0x13
與al = 0x01
這是一個Get Status of Last Drive Operation
interupt。它返回0x01
,這意味着Invalid Command
這使我更加困惑。從啓動映像加載扇區在啓動加載程序失敗
mov ah, 0 ;reset drive
int 0x13
or ah, ah ;check for error
jnz err ;error handling function (prints ASCII A)
mov ax, 0
mov es, ax
mov bx, 0x1000 ;read sector into 0000:0x1000
mov ah, 0x02 ;read sector
mov al, 1 ;# of sectors to read = 1
mov ch, 0 ;Cylinder = 0
mov cl, 0x02 ;Sector to read = 2 (second as first sector is this code)
mov dh, 0 ;head = 0
;dl should equal the drive number as BIOS automatically detects it
int 0x13
or ah, ah
jnz err ;check for error again (this is where the error occurs)
當計算機啓動時,有人告訴我,BIOS會將驅動器盤符進入所以我所有的中斷應該正確的驅動器上進行的dl
寄存器。我甚至嘗試設置dl
到0x00
這將等於軟驅A:
和BOCHS(CPU模擬器)我將軟盤驅動器A:
設置爲我的啓動映像,但它仍然無法啓動。 QEMU和BOCHS不會正確模擬代碼有什麼原因嗎?我還沒有嘗試將它燒到USB上並從實時BIOS中啓動它。我將發佈我的完整代碼here,以便您可以在必要時查看它。我很抱歉,如果我不夠清楚,我是初學者在操作系統開發。非常感謝!
編輯: 操作系統:Windows 7 x64(開發x32操作系統) 仿真:BOCHS運行由NASM編譯器創建的boot.img。
我回答你的問題嗎? – Stewart 2012-03-28 10:34:06
@Stewart我正在重寫我的引導裝載程序,所以我可以測試它。只要我將新代碼加入其中,我會盡快回復。別擔心:) – user99545 2012-03-28 23:35:38