
當 x86 PC 啟動時,它開始執行稱為 BIOS 的程序,該程序儲存在主機板上的非揮發性記憶體中。 BIOS 的工作是準備硬件,然後將控制權轉移給作業系統。來源附錄 B. 來自實驗室會議這裡在該部分PC的實體位址空間顯示以下映射。
+------------------+ <- 0x00100000 (1MB)
| BIOS ROM |
+------------------+ <- 0x000F0000 (960KB)
為什麼BIOS需要使用它,如果不需要它有什麼用?它與我在開頭提到的儲存在主機板上的非揮發性記憶體中的 BIOS 程式有何關係?雖然在實驗室資源中提到設計是針對 qemu(x86 模擬器)的,但 osdev [http://wiki.osdev.org/Memory_Map_%28x86%29#ROM_Area]關於記憶體佈局也說了同樣的事情。我只是有點困惑。
答案1
DOS及其他實模式作業系統大量使用 BIOS 服務。由於 x86 處理器的實模式綁定到 2^20 = 1Mb 位址空間,i8086 系統的供應商決定 BIOS 必須映射到位址空間的高階(就像現在的上半核心將其虛擬記憶體映射到範圍的末端) :從0xA0000 及更高。
保護模式使這個保留的記憶體成為地址空間中的一個缺口:保護模式程式無法在沒有重大駭客攻擊的情況下從BIOS 呼叫函數,從而使其在保護模式和長模式(每個現代作業系統都在其中運行)下無法使用,但將軟體從RM 傳輸到PM 並不快,所以Intel 工程師留下了一個逃生口,v8086 模式,它允許在保護模式環境內的沙箱中運行舊的實模式程式(例如OS /2 強烈使用v8086 模式和Windows 系統中的DOS 模擬)也依賴此功能),仍需要 BIOS 服務來實現相容性。
此記憶體仍在保護模式下用於某些任務,例如 VGA 終端/圖形輸出(終端記憶體位於 0xB8000,控制台字體也可以在那裡調整,VGA 圖形幀緩衝區位於 0xA8000,iirc)。有時,該記憶體甚至用於 API,例如維貝3,但是,BIOS 映射到 0xA0000 主要是為了向後相容。人們正在努力取代它:UEFI 是對 BIOS 的現代重新思考,現在正在穩步普及。
結論:BIOS 對應到 0xA0000 主要是向後相容的問題人們正在努力用 UEFI 等更現代的引導環境來取代它。
答案2
AFAIK,這主要有歷史原因。程式儲存在晶片上,但為了運行它,程式碼被載入到 RAM(BIOS 影子)中,CPU 可以在其中直接取得指令。這對於在容量最小的較便宜晶片上壓縮 BIOS 映像尤其需要。
停用「BIOS 影子」選項可能會減慢啟動過程,或者很少會導致更嚴重的問題。此外,MS DOS 等作業系統還額外使用 BIOS 例程進行 IO,這是一種 HAL。在當今的多執行緒作業系統中使用這會非常慢且不安全,因此在將控制權移交給作業系統後,該 RAM 仍然處於不活動狀態。
其他系統甚至在該晶片上安裝了內核,例如 Commodore Amiga Kickstart,它也可以作為軟碟使用。