2012-11-08 18 views
1

我正在編寫一個基本的引導加載程序,以使我可以編寫一個簡單的C程序,將其寫入硬盤(無文件系統),並運行它。這就是我想要做的。嘗試啓用保護模式時引導循環

這是我到目前爲止所做的。

第1階段:

  1. 設置堆棧段寄存器
  2. 改變視頻模式640x480x8
  3. 讀取下一個扇區到內存
  4. 遠跳轉到它

舞臺2:

  1. 設置堆棧和段試(做我需要再次做到這一點?)
  2. 設置的GDT(這部分混淆了赫克了我 - TBH我只是複製/粘貼)
  3. 啓用A20門
  4. 進入保護模式

我成功之前已經進入保護模式,但由於某些原因,現在我不能。當我嘗試時,Bochs會進入引導循環,但據我所知,代碼與舊代碼相同。

我試過註釋掉啓用A20和GDT的調用,但是這並沒有阻止啓動循環。

我有我的整個Bootloader代碼here on PasteBin,但我會在這裏把一些東西也:


設置堆棧:

CLI   ;Disable interrupts while setting up the stack 
XOR AX,AX  ;Real mode flat memory model 
MOV DS,AX 
MOV ES,AX 
MOV FS,AX 
MOV GS,AX 
MOV SS,AX 
MOV SP,0xFFFF 
STI   ;Enable interrupts 

啓用A20:

MOV AX,0x2401 
INT 0x15 
RET 

進入保護模式:

MOV EAX,CR0 
OR EAX,1 
MOV CR0,EAX 

GDT代碼有點冗長,我沒有自己寫。但是,正如我所說的,不加載GDT並不會阻止以後的啓動循環。順便說一下......如果你對我的引導程序(這是我的第一個)有任何一般性評論,請隨時提及它們。

回答

2

「啓動循環」可能意味着您的代碼是triple-faulting

既然你在虛擬機上運行,​​我建議嘗試qemu,有兩個原因。首先,維基百科文章說,「在QEMU中,三重故障會在控制檯中產生虛擬機的轉儲,指令指針設置爲觸發第一個異常的指令。」讓模擬器指向你的確切指令失敗將使你的調試速度更快。其次,如果這還不夠,QEMU支持將gdb附加到虛擬CPU,這允許您單步執行代碼,打印寄存器內容以及所有常用的東西。請參閱qemu手冊頁以瞭解-gdb選件。

+0

大聲笑。我發現了這個問題,對我(和其他人)來說應該是真的,真的很明顯。我啓用保護模式,然後使用BIOS視頻中斷0x10寫入啓用保護模式的屏幕。 – user1002358

+0

有趣。 :-)我仍然鼓勵找到自己改進的調試工具;這東西是一個痛苦。 –

+0

爲了記錄,bochs有內置的調試器,我相信它也會將註冊狀態轉儲到控制檯。哦,它也有'gdb'支持;) – Jester