探討Linux內核啟動之BIOS啟動階段
Linux內核啟動有很多值得學習的地方,這里我們主要介紹BIOS啟動階段,包括介紹指令寄存器CS:EIP等方面。
Linux內核啟動代碼復雜、龐大,讓人感覺難以入手,正是因為它的復雜性,任何一本教材都會把相關的內容進行分類講解,例如中斷處理,文件系統,等等。然而在閱讀相關章節時,你是不是常常想弄明白某個相關的數據結構是在什么時候建立的?是在什么時候初始化的?本章講解BIOS啟動階段。
Linux內核啟動之BIOS啟動階段
CPU在上電初始化時,指令寄存器CS:EIP總是被初始化為固定的值,這就是CPU復位后的***條指令的地址。斷電后內存中的內容就丟失了,所以這一條指令必須保存在“非易失”的存儲器中。此類存儲器包括ROM,PROM,EPROM,Nor Flash等。早期的BIOS存放在只讀存儲器中,非常不方便修改。現在EPROM和Nor Flash都能夠通過電的方式來進行擦除和編程寫入,所以通常升級BIOS就是利用BIOS芯片的電可擦除編程特性。
對于32位地址總線的系統來說,4GB的物理地址空間至少被劃分為兩個部分,一部分是內存的地址空間,另外一部分地址空間用于對BIOS芯片存儲單元進行尋址。除此之外,隨著系統外部設備的增加以及設備本身的板載存儲空間的增加,16位8086處理器擁有的64KB的IO地址空間早已不夠(通過in/out匯編指令來訪問的I/O端口。),實際上4GB的物理內存地址空間還有一部分用于外部設備的板載存儲空間的尋址。x86復位后工作在實模式下,該模式下CPU的尋址空間為1MB。 CS:IP的復位值是FFFF:0000,物理為FFFF0。主板的設計者必須保證把這個物理地址映射到BIOS芯片上,而不是RAM上。
早期的IBM PC地址空間映射如圖4.1所示。其中高256KB的只讀存儲空間映射到BIOS芯片中,中間的128KB VVDR映射到視頻卡的存儲空間,屏幕上面的像素點受該區域控制,剩下的640KB映射到RAM上面。可以看出對于硬件系統的設計者來說,物理地址空間也是一種資源,而這里所說的映射就是以硬件方式對物理地址資源的分配。
640KB的RAM是BIOS設計者自由使用的區域,如何使用取決于 BIOS軟件的設計者。CPU執行BIOS代碼對系統進行必要的初始化,并在物理地址0開始的1KB內存中建立實模式下的中斷向量表,隨后的一部分內存被用來保存BIOS在啟動階段檢測到的硬件信息。另外BIOS代碼在執行期還需要使用隨后的一部分內存。***BIOS會根據配置把引導設備的***個扇區加載到物理地址0x07C00的地方,然后跳轉到這里繼續執行。通常這是Boot Loader的代碼,Boot Loader接著把內核加載到內存中。前面說過arch/x86/boot/tools/build工具把setup和vmlinux合成一個 bzImage。setup是實模式的代碼,vmlinux是保護模的代碼。以上給大家講解了Linux內核啟動之BIOS啟動階段。
【編輯推薦】