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