2016-05-15 20 views
2

我正在讀Coreboot的一些代碼,它所做的第一件事是進入保護模式,這對intel x86引導程序來說是正常的,之後,它會加載並調用有效負載(在本例中爲seabios) ,seabios會爲硬件設備執行所有必要的初始化過程,其中一些過程需要在實模式下完成,最後BIOS會以0x7c00的形式始終以實模式調用OS引導程序。Coreboot + SeaBios模式開關

我的疑問是:什麼時候在保護模式和實模式(再次)之間切換?

是最終處理器模式:大實模式?

謝謝

+0

Seabios將使用傳統BIOS來完成典型的386級機器。它會使機器進入非現實模式(16位)並跳轉到0x0000:0x7c00,它將加載磁盤的引導扇區。 –

回答

0

我有同樣的問題。根據seabios執行流程手冊[https://www.seabios.org/Execution_and_code_flow] POST的最後階段是引導階段。對bootloader的調用以call_boot_entry()開始,它調用farcall16(),參數爲「0x07c0」。 farcall16將調用匯編函數transition16,它將把cpu切換回實模式,並將跳轉到「0x07c0」。

+0

實際上它以段0x07c0開頭(從軟盤/硬盤啓動時)。在調用'call_boot_entry()'之前,它將該段標準化爲段:偏移對。結果是'bootseg'中的一段0x0000和'bootip'中的0x7c00。當切換到16位真實模式(實際上是非真實模式)時,BIOS已經跳到物理地址0x07c00的0x0000:0x7c00。 –

+0

@MichaelPetch通過說farcall16有參數0x07c0我試圖簡化一些事情,以便回答從32位到16位的轉換髮生的地方。其實有很多細節我跳過了。 – user2921947