<strike id="xh1ss"><address id="xh1ss"></address></strike>
  1. <legend id="xh1ss"></legend>
  2. 更多課程 選擇中心

    嵌入式培訓
    達內IT學院

    400-111-8989

    你對Linux內核的體系結構有一個全面的了解嗎?

    • 發布:嵌入式培訓
    • 來源:嵌入式問答
    • 時間:2017-04-25 14:04

    關于Windows啟動過程介紹的文章可謂多如牛毛,而對于Linux的介紹卻是鳳毛麟角。凡是曾經使用過Linux的用戶可能都會注意到,當計算機啟動時,屏幕上會出現很多信息。一般情況下,這些信息我們可以通過以下的命令看到:

    cat/var/log/dmesg|more

    這些信息究竟有什么含義?這個問題看起來似乎很容易回答,因為只要在Linux參考書里查找一下,就會找出一個類似于這樣的答案:“這是一些內核啟動信息……”。但是“內核啟動信息”到底是什么意思呢?

    要想對Linux內部工作有所了解,就必須要對Linux內核的體系結構有一個全面的了解。下面我們就去揭開它的秘密。在此,我不想解釋Linux內核的體系結構,只想解釋(或者說是試圖去解釋)計算機系統啟動進程中一些最基本的概念。這里所說的啟動過程是指從按下開關到提示符出現的整個過程。

    啟動指的是什么

    在操作系統的詞匯里,啟動是指通過處理器執行一些指令,把操作系統的一部分放入到主存中。在啟動過程中,Linux內部的數據結構會被初始化,會被賦給一些初始值,并且某些進程會被創建。因為當計算機電源打開時,所有的硬件設備都處于一種不可預知的狀態,內存也處于一種不活動的隨機狀態,所以,計算機的啟動過程可以說是一個長且復雜的任務。因此,我們必須知道,之所以叫“啟動”主要是因為計算機體系結構的原因。

    在此提請讀者注意:

    1.對計算機內部的工作和內核的操作有一個基本的了解,對自己非常有益。

    2.這篇文章中提到的所有文件,指的都是Linux內核2.4.2-2版本里的文件。這些文件對于所有的Linux內核來說都是相同的,并且可以在任何一個Linux系統里找到它們,此處我使用的是RedHat7.1。

    3.在本文里,討論范圍限于IBMPC體系結構。

    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-OnSelf-Test,POST),這時會顯示版本及其它很多相關的硬件信息。

    2.BIOS要對硬件進行初始化。這一步非常重要,因為它要保證所有的硬件設備在IRQ(中斷請求)和I/O端口操作時都沒有沖突。等這步完成以后,它會顯示一個已經安裝的PCI設備表。

    3.接著到了操作系統,BIOS將查找一個可以引導的操作系統。這取決于BIOS的設置,它可以從軟盤、硬盤或者光盤啟動。

    4.一旦發現一個合法的設備,BIOS就會把其第一扇區的內容復制到物理地址,即從0x00007c00開始的內存中,然后跳至剛加載的地址并執行之。

    到此為止,BIOS所要做的工作就全部完成了。

    自舉程序及其功用

    BIOS調用一個專門的程序,這個程序的任務就是把操作系統的內核調入內存。這個程序就叫做自舉程序(BootLoader)。在我們繼續下面內容之前,先來看一下啟動系統的不同途徑。

    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(MasterBootRecord),其上存儲著分區表和一個小程序。這個程序加載存儲由操作系統的第一扇區來開始啟動。Linux是一個高度靈活且非常優秀的軟件,所以在MBR里,它使用一個叫做LILO的程序來代替上述的那個程序。LILO允許用戶選擇所要啟動的操作系統。

    一般來說,Linux是從硬盤啟動的。這就需要不同的自舉程序。在Intel系統里,用得最多的自舉程序就是LILO。對于其它的體系結構,還存在著別的自舉程序。LILO可以安裝在MBR上(請注意:在安裝RedHatLinux時,有一個步驟會讓用戶選擇把LILO安裝到MBR或者引導扇區)或一個活動分區的引導扇區上。

    由于LILO太大,MBR無法容納,所以它被分成兩部分。MBR(或者磁盤分區的引導扇區)包含有一個小的自舉程序,它被BIOS載入到起始地址為0x00007c00的內存中。然后,這個小程序再把自己移到0x0009a000地址處,接著設置實模式棧,最后加載第二部分的LILO自舉程序(請注意:實模式棧地址范圍是0x0009b000到0x0009a200)。

    第二部分的LILO會從磁盤讀取所有可用的操作系統,并且給用戶列出,以選擇所要啟動的系統。一旦用戶選擇完成,自舉程序就會加載相應的扇區內容到內存中并且執行之。

    自舉程序被BIOS調用時(跳到物理地址為0x00007c00處),要執行以下操作:

    (1)把自已從地址0x00007c00移動到0x00090000;

    (2)使用地址0x00003ff4,創建“實模式”棧;

    (3)設置磁盤參數表。這里使用的是BIOS提供的軟盤驅動程序;

    (4)通過調用BIOS程序顯示“LoadingLinux”信息;

    (5)自舉程序調用BIOS程序來加載軟盤上內核的setup()函數,并把它放在起始地址為0x00090200的內存中;

    (6)接下來自舉程序調用一個BIOS程序,這個程序從軟盤加載剩余的內核程序,并將其放入起始地址為0x00010000或者0x00100000;

    (7)然后,跳轉到setup()函數。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:嵌入式開發學習方法大盤點
    下一篇:嵌入式er的日常!做“技術流”or“意識流”?
    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    黄色一级全祼,欧美一级aa片,一级毛卡片,一级特黄大片,三级片视频 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>