2017-08-17 252 views
2

我一直在寫一個有點基本的引導程序,它在Bochs中像桃子一樣工作。但是,在我的實際機器上,有幾條指令亂碼,引導加載程序失敗。我已經診斷出這種疾病,但沒有很好的治療方法。看來,BIOS(順便說一句,UEFI在兼容模式下)正在尋找BIOS參數塊(BPB),找不到一個(因爲我沒有創建一個),並且蠻橫地覆蓋某些字節,從而搞亂了引導程序。我目前的解決它的方法是通過保留(零)開始我總成從第50個字節我的程序與如何停止BIOS(BPB)覆蓋部分引導加載程序?

resb 50 

這不是一個很好的解決方案,但是。考慮到bootloader只有512字節,這是一個巨大的空間浪費。這大約浪費了10%的空間!所以這裏是我的問題:

有沒有更好的方法來規避/停止/禁用bios覆蓋bootloader的一部分?從我的引導程序中獲取最多字節的最佳方式是什麼?

+0

您需要在引導加載程序開始時創建一個BPB,以便BIOS不會寫入代碼。因爲有些BIOS會在引導程序開始時沒有找到某些特定的指令(JMP通常是最好的選擇),所以會拒絕加載引導程序。一些BIOS甚至可能試圖通過檢查內容和一些BIOS盲目寫入來確定是否有有效的BPB。 –

+0

以上是假設您正在使用USB軟盤模擬。如果使用USB HDD仿真,您可能會發現不需要BPB,但您可能需要一個有效的分區表,並在分區中標記爲可引導的分區以便識別它。 –

+1

可以在本節[SO Answer](https://stackoverflow.com/a/43787939/3857942)(以NASM編寫)中的代碼段_Complete Example with Int 13h Extension Checks_下找到DOS 4.0 BPB。該示例創建了一個假的1.44MB Floppy BPB。 _BPB_包含JMP。因此,從'boot:'標籤到'main'標籤的所有內容都是BPB –

回答

-2

嘗試使用線性幀緩衝區並修改緩衝的顯示起始地址。公共文檔:來自vesa dot org的vbe3.pdf(註冊/登錄)

+0

線性幀緩衝區與bootloader有什麼關係,BIOS對內存地址範圍爲0x07c00到0x07e00的BPB有什麼作用? –

+0

@Dirk嗯,我不知道。我已經在使用線性VGA顯示模式,我將在內存中使用第二個緩衝區,而不是切換地址(我不確定是否可以使用常規VGA而不是VESA)。邁克爾的權利,這與原來的問題沒有多大關係 – travisjayday