我正在編寫一個基本的引導加載程序,以使我可以編寫一個簡單的C程序,將其寫入硬盤(無文件系統),並運行它。這就是我想要做的。嘗試啓用保護模式時引導循環
這是我到目前爲止所做的。
第1階段:
- 設置堆棧段寄存器
- 改變視頻模式640x480x8
- 讀取下一個扇區到內存
- 遠跳轉到它
舞臺2:
- 設置堆棧和段試(做我需要再次做到這一點?)
- 設置的GDT(這部分混淆了赫克了我 - TBH我只是複製/粘貼)
- 啓用A20門
- 進入保護模式
我成功之前已經進入保護模式,但由於某些原因,現在我不能。當我嘗試時,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並不會阻止以後的啓動循環。順便說一下......如果你對我的引導程序(這是我的第一個)有任何一般性評論,請隨時提及它們。
大聲笑。我發現了這個問題,對我(和其他人)來說應該是真的,真的很明顯。我啓用保護模式,然後使用BIOS視頻中斷0x10寫入啓用保護模式的屏幕。 – user1002358
有趣。 :-)我仍然鼓勵找到自己改進的調試工具;這東西是一個痛苦。 –
爲了記錄,bochs有內置的調試器,我相信它也會將註冊狀態轉儲到控制檯。哦,它也有'gdb'支持;) – Jester