日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Linux 2.6 內核引導過程分析

系統 2536 0

Linux 2.6 內核引導過程分析

?

上一篇文章介紹了Linux內核的編譯過程,接下來本文利用生成的內核,介紹Linux的內核的引導過程。

本文以x86為例,x86與嵌入式系統的區別在于多了一個BIOS轉移到BootLoader的過程。

Linux內核引導的過程包含多個階段,接下來將依次解讀:

1. 系統加電階段 1:

系統加電時,處理器會執行一個位于已知位置處的代碼。PC中即我們熟知的BIOS,它保存在主板的閃存中。

BIOS從0xFFFF0處開始執行,首先執行POST(加電自檢),檢查系統必備的引導設備是否存在,如內存/磁盤等硬件設備。然后BIOS進行本地設備的枚舉和初始化。BIOS由兩部分組成:POST代碼和運行時服務,POST完成后會被清出內存,而運行時服務會駐留于內存供目標操作系統調用服務。


Linux 2.6 內核引導過程分析

?

然后BIOS讀取CMOS中的引導設備信息來搜索處于活動狀態的可引導設備(可以是軟盤,CD-ROM,硬盤上某一分區等),從引導設備中讀取第一個扇區,該扇區包含著引導程序。由上圖可知引導包含兩個階段。

當找到第一個引導設備后,第一階段的引導程序就會被裝載入RAM并執行,該引導程序大小一般小于一個扇區,其作用是加載第二階段的引導加載程序,MBR就是熟知的第一階段引導加載器。通常,Linux都是從硬盤上引導的,其中主引導目錄(MBR)中包含主引導加載程序。MBR 是一個 512 字節大小的扇區,位于磁盤上的第一個扇區中(0 道 0 柱面1 扇區)。當 MBR 被加載到 RAM 中之后,BIOS 就會將控制權交給 MBR。

當第二階段的引導加載程序被裝入 RAM 并執行時,通常會顯示一個動畫屏幕,并將 Linux 和一個可選的初始 RAM磁盤(臨時根文件系統)加載到內存中。在加載映像時,第二階段的引導加載程序就會將控制權交給內核映像,然后內核就可以進行解壓和初始化了。在這個階段 中,第二階段的引導加載程序會檢測系統硬件、枚舉系統鏈接的硬件設備、掛載根設備,然后加載必要的內核模塊。

在引導程序GRUB被BIOS裝入到內存并獲得控制權后,讀取/boot/grub.conf中的引導列表選擇默認要啟動的內核鏡像bzImage。根據bzImage中前512byte的bootsect中的setup,vmLinux.bin所占扇區的大小,以及內核是否為大內核鏡像將bootsect->0x00090000, setup->0x00090020, vmLinux.bin -> 0x00100000(big) 0x00010000(else)。

將內核搬到相應的地址后,引導程序跳轉到物理地址0x00090020,即setup所在的物理地址,開始執行setup代碼。

接下來會詳細介紹下兩階段的引導過程及有關GRUB的知識。

1) 第一階段引導加載程序

MBR 中的主引導加載程序是一個 512 字節大小的映像,其中包含程序代碼和一個小分區表(參見圖 2)。前446個字節是主引導加載程序,其中包含可執行代碼和錯誤消息文本。接下來的 64 個字節是分區表,其中包含 4 個分區的記錄(每個記錄的大小是 16 個字節)。MBR 以兩個特殊數字的字節(0xAA55)結束。這個數字會用來進行MBR的有效性檢查。


Linux 2.6 內核引導過程分析

?

主引導加載程序的工作是查找并加載次引導加載程序(第二階段)。它是通過在分區表中查找一個活動分區來實現這種功能的。當找到一個活動分區時,它會掃描分 區表中的其他分區,以確保它們都不是活動的。當這個過程驗證完成之后,就將活動分區的引導記錄從這個設備中讀入 RAM 中并執行它。

2) 第二階段引導加載程序

次引導加載程序(第二階段引導加載程序)可以更形象地稱為內核加載程序。這個階段的任務是加載 Linux內核和可選的初始 RAM 磁盤。

GRUB有關的信息:

在 x86 PC 環境中,第一階段和第二階段的引導加載程序一起稱為 Linux Loader(LILO)或 GRand Unified Bootloader(GRUB)。由于 LILO 有一些缺點,而 GRUB 克服了這些缺點,因此下面讓我們就來看一下 GRUB。

關于 GRUB,很好的一件事情是它包含了有關 Linux 文件系統的知識。GRUB 不像 LILO 一樣使用裸扇區,而是可以從 ext2或 ext3 文件系統中加載 Linux 內核。它是通過將兩階段的引導加載程序轉換成三階段的引導加載程序來實現這項功能的。階段 1 (MBR)引導了一個階段 1.5 的引導加載程序,它可以理解包含 Linux 內核映像的特殊文件系統。這方面的例子包括reiserfs_stage1_5(要從 Reiser 日志文件系統上進行加載)或 e2fs_stage1_5(要從 ext2 或 ext3 文件系統上進行加載)。當階段 1.5 的引導加載程序被加載并運行時,階段 2 的引導加載程序就可以進行加載了。當階段 2 加載之后,GRUB 就可以在請求時顯示可用內核列表(在 /etc/grub.conf 中進行定義,同時還有幾個軟符號鏈接/etc/grub/menu.lst 和 /etc/grub.conf)。我們可以選擇內核甚至修改附加內核參數。另外,我們也可以使用一個命令行的shell 對引導過程進行高級手工控制。將第二階段的引導加載程序加載到內存中之后,就可以對文件系統進行查詢了,并將默認的內核映像和 initrd 映像加載到內存中。當這些映像文件準備好之后,階段 2 的引導加載程序就可以調用內核映像了。

?

2. 階段1 ~ 階段2:

該階段由文件seup.S生成的代碼塊進行系統設備的探索,將探測到的相關信息保存到內存地址中,在系統最終初始化時由系統使用。探測完成后跳轉到物理地址0x00100000,開始執行由/src/arch/i386/compressed/head.S生成的代碼塊。

?

3. 階段2 ~ 階段3:

該階段由head.S生成的代碼塊執行,0x00100000處及startup_32處,該匯編代碼為調用C語言函數設置相應的參數及棧指針后調用C函數decompress_kernel對壓縮的內核進行解壓縮,并將解壓的內核片段放置到兩個不同物理內存區域中,然后head.s中復制move,搬移的代碼段移動到物理地址0x00010000處。然后跳轉到該地址,執行該代碼塊。

?

4. 階段3 ~ 階段4:

該階段執行復制到物理地址0x00010000的搬遷代碼,該部分的搬遷代碼將位于兩個物理區域的解壓縮內核代碼片段移動到物理地址0x00100000.

?

5. 階段4 ~ 階段5:

執行完move后,跳到0x00100000,執行src/arch/i386/kernel/head.S中的startup_32的代碼段,注意與上面startup_32的不同,開始執行系統核心的初始化。

?

6. 階段5 ~ 系統完全啟動:

在startup_32函數(也就是系統初始化進程init_task,也叫0號進程,idle進程)中。該進程完成了系統內存管理子系統/進程管理子系統,中斷異常子系統,時間度量子系統等初始化工作.會對頁表進行初始化,并啟用內存分頁功能,為FPU檢測CPU類型,調用start_kernel函數,執行與體系結構無關的Linux內核部分.

通過調用 start_kernel,會調用一系列初始化函數來設置中斷,執行進一步的內存配置,并加載初始 RAM 磁盤。

注:在內核引導過程中,初始 RAM 磁盤(initrd)是由階段 2 引導加載程序加載到內存中的,它會被復制到RAM中并掛載到系統上。這個initrd會作為RAM中的臨時根文件系統使用,并允許內核在沒有掛載任何物理磁盤的情況下完整地實現引導。由于與外圍設備進行交互所需要的模塊可能是initrd的一部分,因此內核可以非常小,但是仍然需要支持大量可能的硬件配置。在內核引導之后,就可以正式裝備根文件系統了(通過 pivot_root):此時會將 initrd 根文件系統卸載掉,并掛載真正的根文件系統。initrd 函數讓我們可以創建一個小型的 Linux內核,其中包括作為可加載模塊編譯的驅動程序。這些可加載的模塊為內核提供了訪問磁盤和磁盤上的文件系統的方法,并為其他硬件提供了驅動程序。由于根文件系統是磁盤上的一個文件系統,因此 initrd函數會提供一種啟動方法來獲得對磁盤的訪問,并掛載真正的根文件系統。在一個沒有硬盤的嵌入式環境中,initrd 可以是最終的根文件系統,或者也可以通過網絡文件系統(NFS)來掛載最終的根文件系統。

最后調用kernel_thread()創建一個名為init的內核線程,然后0號進程調用調度器schedule(),釋放了處理器的使用權,成為了系統的idle進程。

在內核線程init獲得處理器后,首先完成對稱多處理器系統中應用處理器的初始化;然后掛載系統的根文件系統,完成系統總線/網絡協議棧等的初始化;最后通過調用execve()開始執行用戶態程序/sbin/init,此時內核線程init轉換成了用戶進程。/sbin/init是系統中所有進程(除idle進程)的祖先,它首先讀取系統的配置文件/etc/inittab,根據該配置文件完成系統的最終初始化.

?

這篇文章也是綜合了我看到的多個資料,每個資料都或多或少的有些遺漏,所以綜合起來,希望能全面。

接下來,我將介紹些有關kernel其他方面的知識。

?

Linux 2.6 內核引導過程分析


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 贺兰县| 易门县| 宜丰县| 洪泽县| 蒙城县| 会理县| 麻江县| 长泰县| 岑溪市| 双峰县| 綦江县| 枞阳县| 奇台县| 衡阳市| 长治市| 旺苍县| 太保市| 贺州市| 旬阳县| 霍邱县| 武冈市| 大方县| 习水县| 大兴区| 崇仁县| 霞浦县| 北安市| 湘潭市| 吴江市| 延吉市| 方城县| 弋阳县| 庆安县| 大港区| 阿拉善左旗| 出国| 阿坝| 垦利县| 娄烦县| 湘潭市| 南通市|