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