国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

Linux啟動過程全接觸(1)

2024-07-21 02:37:14
字體:
來源:轉載
供稿:網友

  關于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()函數。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 青川县| 芒康县| 肥城市| 丰都县| 霍山县| 张掖市| 黄大仙区| 彭泽县| 灵丘县| 顺平县| 安平县| 庆安县| 东丽区| 砚山县| 安丘市| 满洲里市| 冷水江市| 英超| 玉龙| 霍州市| 石阡县| 衡东县| 九江县| 达尔| 建宁县| 左权县| 莆田市| 台江县| 来凤县| 紫阳县| 井冈山市| 安乡县| 永昌县| 恩平市| 汉寿县| 和平县| 红安县| 馆陶县| 孝昌县| 法库县| 新化县|