方法之二:以程序流程為線索,一線串珠
從表面上看,Linux的源碼就象一團(tuán)扎亂無章的亂麻,其實它是一個組織得有條有理的蛛網(wǎng)。要把整個結(jié)構(gòu)分析清楚,除了找出線頭,還得理順各個部分之間的關(guān)系,有條不紊的一點一點的分析。
所謂以程序流程為線索、一線串珠,就是指根據(jù)程序的執(zhí)行流程,把程序執(zhí)行過程所涉及到的代碼分析清楚。這種方法最典型的應(yīng)用有兩個:一是系統(tǒng)的初始化過程;二是應(yīng)用程序的執(zhí)行流程:從程序的裝載,到運(yùn)行,一直到程序的退出。
為了簡便起見,遵從循序漸進(jìn)的原理,現(xiàn)就系統(tǒng)的初始化過程來具體的介紹這種方法。系統(tǒng)的初始化流程包括:系統(tǒng)引導(dǎo),實模式下的初始化,保護(hù)模式下的初始化共三個部分。下面將一一介紹。
Linux系統(tǒng)的常見引導(dǎo)方式有兩種:Lilo引導(dǎo)和Loadin引導(dǎo);同時linux內(nèi)核也自帶了一個bootsect-loader。由于它只能實現(xiàn)linux的引導(dǎo),不像前兩個那樣具有很大的靈活性(lilo可實現(xiàn)多重引導(dǎo)、loadin可在dos下引導(dǎo)linux),所以在普通應(yīng)用場合實際上很少使用bootsect-loader。當(dāng)然,bootsect-loader也具有它自己的優(yōu)點:短小沒有多余的代碼、附帶在內(nèi)核源碼中、是內(nèi)核源碼的有機(jī)組成部分,等等。
bootsect-loader在內(nèi)和源碼中對應(yīng)的程序是 /Arch/i386/boot/bootsect.S 。下面將主要是針對此文件進(jìn)行的分析。
幾個相關(guān)文件:
|
引導(dǎo)過程分析:
對于Intel x86 PC , 開啟電源后, 機(jī)器就會開始執(zhí)行ROM BIOS的一系列系統(tǒng)測試動作,包括檢查RAM,keyboard,顯示器,軟硬磁盤等等。執(zhí)行完bios的系統(tǒng)測試之后,緊接著控制權(quán)會轉(zhuǎn)移給ROM中的啟動程序(ROM bootstrap routine);這個程序會將磁盤上的第0軌第0扇區(qū)(叫boot sector或MBR ,系統(tǒng)的引導(dǎo)程序就放在此處)讀入內(nèi)存中,并放到自0x07C0:0x0000開始的512個字節(jié)處;然后處理機(jī)將跳到此處開始執(zhí)行這一引導(dǎo)程序;也即裝入MBR中的引導(dǎo)程序后, CS:IP = 0x07C0:0x0000 。加電后處理機(jī)運(yùn)行在與8086相兼容的實模式下。
如果要用bootsect-loader進(jìn)行系統(tǒng)引導(dǎo),則必須把bootsect.S編譯連接后對應(yīng)的二進(jìn)制代碼置于MBR; 當(dāng)ROM BIOS 把bootsect.S編譯連接后對應(yīng)的二進(jìn)制代碼裝入內(nèi)存后,機(jī)器的控制權(quán)就完全轉(zhuǎn)交給bootsect; 也就是說,bootsect將是第一個被讀入內(nèi)存中并執(zhí)行的程序。


