歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

linux 啟動全接觸

  關於Windows啟動過程介紹的文章可謂多如牛毛,而對於Linux的介紹卻是鳳毛麟角。凡是曾經使用過Linux的用戶可能都會注意到,當計算機啟動時,屏幕上會出現很多信息。一般情況下,這些信息我們可以通過以下的命令看到: cat /var/log/dmesg more 這些信息究竟有什麼含義?這個問題看起來似乎很容易回答,因為只要在Linux參考書裡查找一下,就會找出一個類似於這樣的答案:“這是一些內核啟動信息……”。但是“內核啟動信息”到底是什麼意思呢? 要想對Linux內部工作有所了解,就必須要對Linux內核的體系結構有一個全面的了解。下面我們就去揭開它的秘密。在此,我不想解釋Linux內核的體系結構,只想解釋(或者說是試圖去解釋)計算機系統啟動進程中一些最基本的概念。這裡所說的啟動過程是指從按下開關到提示符出現的整個過程。 啟動指的是什麼 在操作系統的詞匯裡,啟動是指通過處理器執行一些指令,把操作系統的一部分放入到主存中。在啟動過程中,Linux內部的數據結構會被初始化,會被賦給一些初始值,並且某些進程會被創建。因為當計算機電源打開時,所有的硬件設備都處於一種不可預知的狀態,內存也處於一種不活動的隨機狀態,所以,計算機的啟動過程可以說是一個長且復雜的任務。因此,我們必須知道,之所以叫“啟動”主要是因為計算機體系結構的原因。 在此提請讀者注意: 1.對計算機內部的工作和內核的操作有一個基本的了解,對自己非常有益。 2.這篇文章中提到的所有文件,指的都是Linux內核2.4.2-2版本裡的文件。這些文件對於所有的Linux內核來說都是相同的,並且可以在任何一個Linux系統裡找到它們,此處我使用的是Red Hat 7.1。 3.在本文裡,討論范圍限於IBM PC體系結構。 BIOS及其功能 當計算機打開電源時,內存裡包含的是一些隨機的數據,所有的東西都沒有被初始化,操作系統也沒有被加載。開始整個啟動過程的是一個特殊的硬件電路,它觸發CPU的Reset腳的邏輯值。然後,一些CPU的寄存器比如CS(一個分段寄存器:代碼段寄存器,它指向含有程序指令的段),eip(在執行指令過程中,當CPU檢測到一個意外事故發生時,它會做出三種類型的判斷:錯誤、陷阱、中止,這取決於eip寄存器的值,它存儲在內核模塊棧裡)就會被給定一個值。接著,物理地址為0xfffffff0的代碼將被執行。這個地址被存儲在一個只讀存儲器(ROM)裡。BIOS(基本輸入/輸出系統)實際上是一段存儲在ROM裡的程序。它包含了一系列可以被某些操作系統調用,用於處理計算機各種硬件設備的中斷驅動和低級程序。其中微軟的DOS就是這樣的一種操作系統。 Linux是否使用附於計算機系統的BIOS來初始化硬件設備?或者說,是否有其它的東西來完成同樣的任務?不過這個問題沒有那麼簡單,必須要了解一些知識。我們從80386模式開始。Intel微處理器實現地址翻譯(從邏輯地址->線性地址->物理地址)有兩種不同的途徑,分別稱作實模式和保護模式。實模式存在主要是為了使得處理器可以和較老的處理相兼容。事實上,所有的BIOS程序都是在實模式下運行的。但是,Linux內核是在保護模式下運行,而不是在實模式下。因此,一旦初始化完成後,Linux就不再使用BIOS,而是完全由自己來為計算機上的所有硬件提供驅動程序(這點和DOS是不一樣的)。 那麼什麼時候Linux使用保護模式?為什麼BIOS不能使用相同的模式?BIOS使用實模式是因為其在操作過程中使用的是實模式地址,並且在計算機剛打開電源時,只有實模式地址可用。一個實模式地址由段地址和偏移地址組成,因此,相應的物理地址就為段地址×(2×8)+偏移。 那麼,這是不是意味著在整個啟動過程中,Linux就從來不使用BIOS了呢?答案是否定的。在啟動階段,Linux從硬盤或者其它外部設備加載內核時,需要使用BIOS。 讓我們來看一下啟動時BIOS主要做了哪些操作: 1.BIOS要對硬件進行一系列徹底的檢測。這個步驟主要是檢查系統安裝有哪些設備,以及它們工作是否正常。通常把這個步驟叫做自檢(Power-On Self-Test,POST),這時會顯示版本及其它很多相關的硬件信息。 2.BIOS要對硬件進行初始化。這一步非常重要,因為它要保證所有的硬件設備在IRQ(中斷請求)和I/O端口操作時都沒有沖突。等這步完成以後,它會顯示一個已經安裝的PCI設備表。 3.接著到了操作系統,BIOS將查找一個可以引導的操作系統。這取決於BIOS的設置,它可以從軟盤、硬盤或者光盤啟動。 4.一旦發現一個合法的設備,BIOS就會把其第一扇區的內容復制到物理地址,即從0x00007c00開始的內存中,然後跳至剛加載的地址並執行之。


到此為止,BIOS所要做的工作就全部完成了。 自舉程序及其功用 BIOS調用一個專門的程序,這個程序的任務就是把操作系統的內核調入內存。這個程序就叫做自舉程序(Boot Loader)。在我們繼續下面內容之前,先來看一下啟動系統的不同途徑。 1.從軟盤啟動Linux 從軟盤啟動時,存儲在軟盤第一扇區的指令將被加載並執行。這個指令然後就會把其余的內核復制到內存中。 Linux內核可以裝在1.44MB的軟盤裡,不過為了減少磁盤占用量,它們都進行了壓縮。這個壓縮過程是在編譯時完成的,而解壓縮的過程則由自舉程序完成。 從軟盤啟動Linux時,自舉程序要做的工作非常簡單。它是一個位於/usr/src/linux-2.4.2/arch/i386/boot/bootsect.S的匯編語言文件。當我們編譯Linux內核源代碼,或者獲取一個新的內核時,這個可執行的匯編代碼就會被放在內核程序的前端。由此可見,要制作一個可啟動的Linux軟盤其實很簡單。我們只要從磁盤的第一個扇區拷貝Linux內核,就可以創建一個可啟動軟盤。當BIOS加載軟盤的第一個扇區時,它實際上拷貝的是自舉程序。自舉程序由BIOS調用(跳到物理地址為0x00007c00的位置),然後執行以下的操作: (1)把自已從地址0x00007c00移動到0x00090000; (2)使用地址0x00003ff4,創建“實模式”棧; (3)設置磁盤參數表,這裡使用的是BIOS提供的軟盤驅動程序; (4)通過調用BIOS程序顯示“Loading”信息; (5)自舉程序調用BIOS程序來加載軟盤上內核的setup()函數,並把它放在起始地址為0x00090200的內存中; (6)接下來自舉程序調用一個BIOS程序,這個程序從軟盤加載剩余的內核程序,並將其放入起始地址為0x00010000(所謂的低地址)或者0x00100000(所謂的高地址); (7)然後,跳轉到setup()函數。 2.從硬盤啟動Linux 當系統從硬盤啟動時,啟動過程又有所不同。硬盤的第一個扇區叫做MBR(Master Boot Record),其上存儲著分區表和一個小程序。這個程序加載存儲由操作系統的第一扇區來開始啟動。Linux是一個高度靈活且非常優秀的軟件,所以在MBR裡,它使用一個叫做LILO的程序來代替上述的那個程序。LILO允許用戶選擇所要啟動的操作系統。 一般來說,Linux是從硬盤啟動的。這就需要不同的自舉程序。在Intel系統裡,用得最多的自舉程序就是LILO。對於其它的體系結構,還存在著別的自舉程序。LILO可以安裝在MBR上(請注意:在安裝Red Hat Linux時,有一個步驟會讓用戶選擇把LILO安裝到MBR或者引導扇區)或一個活動分區的引導扇區上。 由於LILO太大,MBR無法容納,所以它被分成兩部分。MBR(或者磁盤分區的引導扇區)包含有一個小的自舉程序,它被BIOS載入到起始地址為0x00007c00的內存中。然後,這個小程序再把自己移到0x0009a000地址處,接著設置實模式棧,最後加載第二部分的LILO自舉程序(請注意:實模式棧地址范圍是0x0009b000 到 0x0009a200)。 第二部分的LILO會從磁盤讀取所有可用的操作系統,並且給用戶列出,以選擇所要啟動的系統。一旦用戶選擇完成,自舉程序就會加載相應的扇區內容到內存中並且執行之。 自舉程序被BIOS調用時(跳到物理地址為0x00007c00處),要執行以下操作: (1)把自已從地址0x00007c00移動到0x00090000; (2)使用地址0x00003ff4,創建“實模式”棧; (3)設置磁盤參數表。這裡使用的是BIOS提供的軟盤驅動程序; (4)通過調用BIOS程序顯示“Loading Linux”信息; (5)自舉程序調用BIOS程序來加載軟盤上內核的setup()函數,並把它放在起始地址為0x00090200的內存中; (6)接下來自舉程序調用一個BIOS程序,這個程序從軟盤加載剩余的內核程序,並將其放入起始地址為0x00010000或者0x00100000; (7)然後,跳轉到setup()函數。



(4)通過調用BIOS程序顯示“Loading Linux”信息; (5)自舉程序調用BIOS程序來加載軟盤上內核的setup()函數,並把它放在起始地址為0x00090200的內存中; (6)接下來自舉程序調用一個BIOS程序,這個程序從軟盤加載剩余的內核程序,並將其放入起始地址為0x00010000或者0x00100000; (7)然後,跳轉到setup()函數。



Copyright © Linux教程網 All Rights Reserved