2013-02-26 21 views
1

我正在嘗試開發一個簡單的操作系統。我之前做過一些彙編程序,不得不使用INT 10h來在屏幕上顯示字符。我瞭解UEFI支持傳統BIOS,並且仍然可以使用INT 10h服務。但是,如果我選擇構建純粹的UEFI可引導操作系統,我應該避免使用INT 10h?或者我以錯誤的方式看待事情?在EFI模式下啓動是否意味着我無法訪問BIOS中斷?

換句話說,鑽出的printfstdout(屏幕)最終調用BIOS INT 10h?或者是問題 - 「基於INT 10h的函數調用是SYS_WRITE?」更合適?

我還需要創建一個512字節的引導扇區,並將它們作爲磁盤(或磁盤映像)上的第零個扇區嗎?地點0x7c00是否有意義?

回答

5

如果你的bootloader是UEFI引導程序(你就會知道,如果它是),那麼你可能不使用BIOS都包括INT 0x10的 - 你必須使用UEFI bootservices其提供所有這些BIOS否則將提供的功能到傳統的引導系統。

如果寫UEFI引導程序,但是你的硬件是啓用了UEFI,你的引導程序將在「傳統」模式被加載,你將能夠使用BIOS如故。

或者換句話說,您的啓動映像既可以是UEFI啓動加載器,也可以是舊版BIOS映像。傳統BIOS映像不能使用UEFI,而UEFI引導加載程序不能使用BIOS。

換句話說,向下調用printf到標準輸出(屏幕)是否最終調用BIOS INT 10h?或者是問題 - 「基於INT 10h的SYS_WRITE函數調用?」更合適?

取決於誰寫了你的printf函數(你是操作系統,下面沒有人)。如果你調用Int 0x10並且沒有設置IDT來處理這個事件,那麼調用UEFI來向屏幕寫入一個字符,那麼你只是使用了未定義的行爲。

我還需要創建一個512字節的引導扇區,並將它們作爲磁盤(或磁盤映像)上的第零個扇區嗎?位置0x7c00是否有意義?

不,沒有。 UEFI支持更大的引導加載程序,並且不會在0x7C00加載。如果您想知道哪些內存區域有特殊意義,您必須要求UEFI爲您提供內存映射。

1

PC BIOS不是UEFI編程模型的一部分,所以您不應該在UEFI應用程序中使用它。例如,爲了打印到屏幕,您可以使用UEFI庫中的函數。

從磁盤讀取第一個扇區並將其加載到0x7C00是BIOS特定的引導協議。 UEFI引導程序從文件系統加載。你可以在OSDev Wiki上閱讀更多關於它的信息。

+0

那麼這是否意味着我不應該在我的啓動加載器中使用INT 10h?還是我的操作系統?我的操作系統是否必須使用UEFI庫中的函數?如果我收集了正確的東西,在'exitBootServices()'之後,我無法使用UEFI函數。 – 2013-02-27 15:20:20

+0

您確實不會使用UEFI引導加載程序中的「INT 10h」。儘管你可以在你的操作系統中使用INT 10h,但你很可能想寫一個直接寫入視頻緩衝區的屏幕驅動程序。 – 2013-02-27 18:52:13

+0

@LordLoh。在exitBootServices()之後,您不能再使用引導服務。有些UEFI服務(稱爲UEFI運行時服務)仍然可以調用,例如即使在調用exitBootServices之後也更改屏幕分辨率。 – SecurityMatt 2013-02-27 19:49:29

相關問題