青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0
簡介: 引導 Linux® 系統的過程包括很多階段。不管您是引導一個標準的 x86 桌面系統,還是引導一臺嵌入式的 PowerPC® 機器,很多流程都驚人地相似。本文將探索 Linux 的引導過程,從最初的引導到啟動第一個用戶空間應用程序。在本文介紹的過程中,您將學習到各種與引導有關的主題,例如引導加載程序、內核解壓、初始 RAM 磁盤以及 Linux 引導的其他一些元素。

早期時,啟動一臺計算機意味著要給計算機喂一條包含引導程序的紙帶,或者手工使用前端面板地址/數據/控制開關來加載引導程序。盡管目前的計算機已經裝備了很多工具來簡化引導過程,但是這一切并沒有對整個過程進行必要的簡化。

讓我們先從高級的視角來查看 Linux 引導過程,這樣就可以看到整個過程的全貌了。然后將回顧一下在各個步驟到底發生了什么。在整個過程中,參考一下內核源代碼可以幫助我們更好地了解內核源代碼樹,并在以后對其進行深入分析。

概述

圖 1 是我們在 20,000 英尺的高度看到的視圖。


圖 1. Linux 引導過程在 20,000 英尺處的視圖
Linux 引導過程在 20,000 英尺處的視圖 

當系統首次引導時,或系統被重置時,處理器會執行一個位于已知位置處的代碼。在個人計算機(PC)中,這個位置在基本輸入/輸出系統(BIOS)中,它保存在主板上的閃存中。嵌入式系統中的中央處理單元(CPU)會調用這個重置向量來啟動一個位于閃存/ROM 中的已知地址處的程序。在這兩種情況下,結果都是相同的。因為 PC 提供了很多靈活性,BIOS 必須確定要使用哪個設備來引導系統。稍后我們將詳細介紹這個過程。

當找到一個引導設備之后,第一階段的引導加載程序就被裝入 RAM 并執行。這個引導加載程序在大小上小于 512 字節(一個扇區),其作用是加載第二階段的引導加載程序。

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

這就是 Linux 引導的整個過程。現在讓我們深入挖掘一下這個過程,并深入研究一下 Linux 引導過程的一些詳細信息。

系統啟動

系統啟動階段依賴于引導 Linux 系統上的硬件。在嵌入式平臺中,當系統加電或重置時,會使用一個啟動環境。這方面的例子包括 U-Boot、RedBoot 和 Lucent 的 MicroMonitor。嵌入式平臺通常都是與引導監視器搭配銷售的。這些程序位于目標硬件上的閃存中的某一段特殊區域,它們提供了將 Linux 內核映像下載到閃存并繼續執行的方法。除了可以存儲并引導 Linux 映像之外,這些引導監視器還執行一定級別的系統測試和硬件初始化過程。在嵌入式平臺中,這些引導監視器通常會涉及第一階段和第二階段的引導加載程序。

提取 MBR 的信息

要查看 MBR 的內容,請使用下面的命令:

dd if=/dev/hda of=mbr.bin bs=512 count=1 #od -xa mbr.bin

這個 dd 命令需要以 root 用戶的身份運行,它從 /dev/hda(第一個 IDE 盤) 上讀取前 512 個字節的內容,并將其寫入 mbr.bin 文件中。od 命令會以十六進制和 ASCII 碼格式打印這個二進制文件的內容。

在 PC 中,引導 Linux 是從 BIOS 中的地址 0xFFFF0 處開始的。BIOS 的第一個步驟是加電自檢(POST)。POST 的工作是對硬件進行檢測。BIOS 的第二個步驟是進行本地設備的枚舉和初始化。

給定 BIOS 功能的不同用法之后,BIOS 由兩部分組成:POST 代碼和運行時服務。當 POST 完成之后,它被從內存中清理了出來,但是 BIOS 運行時服務依然保留在內存中,目標操作系統可以使用這些服務。

要引導一個操作系統,BIOS 運行時會按照 CMOS 的設置定義的順序來搜索處于活動狀態并且可以引導的設備。引導設備可以是軟盤、CD-ROM、硬盤上的某個分區、網絡上的某個設備,甚至是 USB 閃存。

通常,Linux 都是從硬盤上引導的,其中主引導記錄(MBR)中包含主引導加載程序。MBR 是一個 512 字節大小的扇區,位于磁盤上的第一個扇區中(0 道 0 柱面 1 扇區)。當 MBR 被加載到 RAM 中之后,BIOS 就會將控制權交給 MBR。

 

第一階段引導加載程序

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


圖 2. MBR 剖析
MBR 剖析 

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

 

第二階段引導加載程序

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

GRUB 階段引導加載程序

/boot/grub 目錄中包含了 stage1stage1.5 和 stage2 引導加載程序,以及很多其他加載程序(例如,CR-ROM 使用的是 iso9660_stage_1_5)。

在 x86 PC 環境中,第一階段和第二階段的引導加載程序一起稱為 Linux Loader(LILO)或 GRand Unified Bootloader(GRUB)。由于 LILO 有一些缺點,而 GRUB 克服了這些缺點,因此下面讓我們就來看一下 GRUB。(有關 GRUB、LILO 和相關主題的更多內容,請參閱本文后面的 參考資料 部分的內容。)

關于 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 的引導加載程序就可以調用內核映像了。

內核

GRUB 中的手工引導

在 GRUB 命令行中,我們可以使用 initrd 映像引導一個特定的內核,方法如下:

grub> kernel /bzImage-2.6.14.2
[Linux-bzImage, setup=0x1400, size=0x29672e]
grub> initrd /initrd-2.6.14.2.img
[Linux-initrd @ 0x5f13000, 0xcc199 bytes]
grub> boot
Uncompressing Linux... Ok, booting the kernel.

如果您不知道要引導的內核的名稱,只需使用斜線(/)然后按下 Tab 鍵即可。GRUB 會顯示內核和 initrd 映像列表。

當內核映像被加載到內存中,并且階段 2 的引導加載程序釋放控制權之后,內核階段就開始了。內核映像并不是一個可執行的內核,而是一個壓縮過的內核映像。通常它是一個 zImage(壓縮映像,小于 512KB)或一個 bzImage(較大的壓縮映像,大于 512KB),它是提前使用 zlib 進行壓縮過的。在這個內核映像前面是一個例程,它實現少量硬件設置,并對內核映像中包含的內核進行解壓,然后將其放入高端內存中,如果有初始 RAM 磁盤映像,就會將它移動到內存中,并標明以后使用。然后該例程會調用內核,并開始啟動內核引導的過程。

當 bzImage(用于 i386 映像)被調用時,我們從./arch/i386/boot/head.S 的 start 匯編例程開始執行(主要流程圖請參看圖 3)。這個例程會執行一些基本的硬件設置,并調用./arch/i386/boot/compressed/head.S 中的 startup_32 例程。此例程會設置一個基本的環境(堆棧等),并清除 Block Started by Symbol(BSS)。然后調用一個叫做 decompress_kernel 的 C 函數(在./arch/i386/boot/compressed/misc.c 中)來解壓內核。當內核被解壓到內存中之后,就可以調用它了。這是另外一個 startup_32 函數,但是這個函數在 ./arch/i386/kernel/head.S 中。

 vi arch/x86/{boot/{header.S,compressed/{head_{32,64}.S,misc.c},kernel/head.S}} init/main.c

在這個新的 startup_32 函數(也稱為清除程序或進程 0)中,會對頁表進行初始化,并啟用內存分頁功能。然后會為任何可選的浮點單元(FPU)檢測 CPU 的類型,并將其存儲起來供以后使用。然后調用 start_kernel 函數(在 init/main.c 中),它會將您帶入與體系結構無關的 Linux 內核部分。實際上,這就是 Linux 內核的 main 函數。


圖 3. Linux 內核 i386 引導的主要函數流程 
Linux 內核 i386 引導的主要函數流程  

通過調用 start_kernel,會調用一系列初始化函數來設置中斷,執行進一步的內存配置,并加載初始 RAM 磁盤。最后,要調用kernel_thread(在 arch/i386/kernel/process.c 中)來啟動 init 函數,這是第一個用戶空間進程(user-space process)。最后,啟動空任務,現在調度器就可以接管控制權了(在調用 cpu_idle 之后)。通過啟用中斷,搶占式的調度器就可以周期性地接管控制權,從而提供多任務處理能力。

在內核引導過程中,初始 RAM 磁盤(initrd)是由階段 2 引導加載程序加載到內存中的,它會被復制到 RAM 中并掛載到系統上。這個 initrd 會作為 RAM 中的臨時根文件系統使用,并允許內核在沒有掛載任何物理磁盤的情況下完整地實現引導。由于與外圍設備進行交互所需要的模塊可能是 initrd 的一部分,因此內核可以非常小,但是仍然需要支持大量可能的硬件配置。在內核引導之后,就可以正式裝備根文件系統了(通過 pivot_root):此時會將 initrd 根文件系統卸載掉,并掛載真正的根文件系統。

decompress_kernel 輸出

函數 decompress_kernel 就是顯示我們通常看到的解壓消息的地方:

Uncompressing Linux... Ok, booting the kernel.

initrd 函數讓我們可以創建一個小型的 Linux 內核,其中包括作為可加載模塊編譯的驅動程序。這些可加載的模塊為內核提供了訪問磁盤和磁盤上的文件系統的方法,并為其他硬件提供了驅動程序。由于根文件系統是磁盤上的一個文件系統,因此 initrd 函數會提供一種啟動方法來獲得對磁盤的訪問,并掛載真正的根文件系統。在一個沒有硬盤的嵌入式環境中,initrd 可以是最終的根文件系統,或者也可以通過網絡文件系統(NFS)來掛載最終的根文件系統。

 

Init

當內核被引導并進行初始化之后,內核就可以啟動自己的第一個用戶空間應用程序了。這是第一個調用的使用標準 C 庫編譯的程序。在此之前,還沒有執行任何標準的 C 應用程序。

在桌面 Linux 系統上,第一個啟動的程序通常是 /sbin/init。但是這不是一定的。很少有嵌入式系統會需要使用 init 所提供的豐富初始化功能(這是通過 /etc/inittab 進行配置的)。在很多情況下,我們可以調用一個簡單的 shell 腳本來啟動必需的嵌入式應用程序。

 

結束語

與 Linux 本身非常類似,Linux 的引導過程也非常靈活,可以支持眾多的處理器和硬件平臺。最初,加載引導加載程序提供了一種簡單的方法,不用任何花架子就可以引導 Linux。LILO 引導加載程序對引導能力進行了擴充,但是它卻缺少文件系統的感知能力。最新一代的引導加載程序,例如 GRUB,允許 Linux 從一些文件系統(從 Minix 到 Reise)上進行引導。


參考資料

學習

  • 您可以參閱本文在 developerWorks 全球站點上的 英文原文 。

  • Boot Records Revealed 是有關 MBR 和各種引導加載程序很好的資源。這個資源不僅僅是有關 MBR 的資料的匯編,還討論了 GRUB、LILO 和各種 Windows® 引導加載程序的問題。 

  • 請查看 Disk Geometry 頁面來理解磁盤及其結構。您會發現有關磁盤的有用屬性。 

  • live CD 是一個可以從 CD 或 DVD 上引導的操作系統,它不需要使用硬盤。 

  • 引導加載程序之爭:了解 LILO 和 GRUB”(developerWorks,2005 年 8 月)詳細介紹了 LILO 和 GRUB 引導加載程序。 

  • 在 developerWorks 上的 LPI 考試準備 系列教程中,我們可以學習有關引導 Linux 系統的詳細介紹,以及在準備參加系統管理員認證考試時需要準備的 Linux 基礎知識。 

  • LILO 是 GRUB 的先驅,但是我們可能發現它依然可以引導 Linux。 

  • mkintrd 命令用來創建初始的 RAM 磁盤映像。這個命令可以用來構建初始的根文件系統,它可以用來引導允許提前加載訪問真正根文件系統所需要的塊設備的配置。 

  • 在 Debian Linux Kernel Project 中,我們可以找到更多有關 Linux 內核、引導和嵌入式開發的信息。 

  • 在 developerWorks Linux 專區 中可以找到為 Linux 開發人員準備的更多資源。 

  • 隨時關注 developerWorks 技術事件和網絡廣播。 

獲得產品和技術

  • MicroMonitor 為各種小型的目標設備提供了引導環境。我們可以使用這個監視器在嵌入式環境中引導 Linux。它已經移植到 ARM、 XScale、MIPS、PowerPC、Coldfire 和 Hitachi 的 Super-H 上了。 

  • GNU GRUB 是一個具有眾多選項和靈活性的引導 shell。 

  • LinuxBIOS 是 BIOS 的一個替代品。LinuxBIOS 不但可以引導 Linux,而且它本身就是一個壓縮的 Linux 內核。 

  • OpenBIOS 是另一個可移植的 BIOS 項目,可以在很多體系結構上進行操作,例如 x86、Alpha 和 AMD64。 

  • 在 kernel.org 上可以找到最新的內核樹。 

  • 使用 IBM 試用版軟件 改進您的下一個開發項目,從 developerWorks 上可以直接下載這些軟件。 

 


from:

http://www.ibm.com/developerworks/cn/linux/l-linuxboot/



 

posted on 2010-11-08 19:58 chatler 閱讀(422) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美理论电影网| 国产精自产拍久久久久久| 在线观看成人av电影| 久久亚洲综合色| 老牛嫩草一区二区三区日本| 亚洲高清电影| 亚洲人人精品| 国产精品美女久久久浪潮软件| 亚洲综合色视频| 久久精品99无色码中文字幕| 亚洲电影在线观看| 日韩午夜激情电影| 国产日韩欧美二区| 免费久久99精品国产自在现线| 免费看av成人| 亚洲嫩草精品久久| 久久久www免费人成黑人精品| 亚洲国产一区二区三区高清 | 影音欧美亚洲| 亚洲国产乱码最新视频| 欧美日韩亚洲一区二区三区在线观看| 9l视频自拍蝌蚪9l视频成人| 亚洲免费中文字幕| 精品电影一区| 在线视频一区观看| 亚洲国产99精品国自产| 中文一区二区| 亚洲福利视频一区| 一区二区三区视频观看| 黄色成人小视频| 一区二区三区精品国产| 尤物网精品视频| 亚洲午夜在线观看| 最近看过的日韩成人| 午夜国产精品视频免费体验区| 亚洲高清久久久| 午夜视频一区在线观看| 亚洲精品欧美日韩专区| 久久成人这里只有精品| 一区二区三区四区国产| 久久字幕精品一区| 久久国产精品99久久久久久老狼| 欧美1级日本1级| 久久久久.com| 国产精品卡一卡二| 亚洲国产精品尤物yw在线观看| 国产日韩欧美自拍| 在线亚洲+欧美+日本专区| 亚洲激情一区| 可以看av的网站久久看| 久久精品国产99精品国产亚洲性色 | 一本久久精品一区二区| 久久综合给合| 久久免费精品日本久久中文字幕| 欧美视频在线视频| 亚洲精品久久久久久久久久久久久 | 亚洲精品久久视频| 久久久久一区二区| 久久精品亚洲国产奇米99| 国产精品久久影院| 亚洲网友自拍| 亚洲影院色无极综合| 欧美日精品一区视频| 亚洲人精品午夜| 日韩视频在线观看| 欧美激情在线| 亚洲久久一区| 国产精品99久久久久久www| 欧美国产日韩一区| 亚洲国产一区二区在线| 亚洲精品综合精品自拍| 欧美精品aa| 亚洲另类黄色| 亚洲自拍偷拍麻豆| 国产人成一区二区三区影院| 午夜精品视频在线观看| 久久国产66| 激情五月婷婷综合| 免费欧美电影| 99精品视频免费观看| 午夜精品久久久久| 激情综合网激情| 老**午夜毛片一区二区三区| 亚洲国产精品999| 亚洲视频在线看| 国产麻豆精品久久一二三| 久久成人精品一区二区三区| 欧美成人免费全部| 夜夜精品视频| 国产色婷婷国产综合在线理论片a| 欧美一区二区三区在线免费观看| 久久青草久久| 日韩视频免费大全中文字幕| 国产精品成人av性教育| 欧美亚洲视频| 亚洲国产精品精华液2区45 | 狠狠色伊人亚洲综合网站色| 老色鬼精品视频在线观看播放| 亚洲国产成人tv| 性欧美办公室18xxxxhd| 伊人精品成人久久综合软件| 欧美区日韩区| 欧美自拍偷拍| 99精品热6080yy久久| 久久精品国产久精国产一老狼| 亚洲国产精品一区二区第四页av| 欧美日韩在线不卡一区| 久久国产88| 一区二区三区视频观看| 欧美大片va欧美在线播放| 亚洲欧美精品在线观看| 亚洲电影免费在线| 国产免费观看久久| 欧美精品亚洲一区二区在线播放| 午夜欧美精品久久久久久久| 亚洲国产日韩欧美在线动漫| 久久激情综合| 亚洲一区二区免费视频| 亚洲黄色免费电影| 国产亚洲欧美在线| 欧美性色视频在线| 欧美电影免费| 久久精品视频在线看| 亚洲一区二区三区欧美 | 久久久蜜桃精品| 小嫩嫩精品导航| 在线综合亚洲| 日韩西西人体444www| 影音先锋日韩有码| 国产一区二区精品在线观看| 欧美午夜精品一区二区三区| 欧美大片在线看| 欧美成人dvd在线视频| 欧美在线观看视频一区二区三区| 一区二区三区日韩精品| 亚洲国产精品日韩| 欧美成人免费全部| 男女激情视频一区| 玖玖国产精品视频| 美女久久一区| 女人天堂亚洲aⅴ在线观看| 久久综合中文色婷婷| 久久久五月天| 免费观看在线综合色| 久久综合伊人77777麻豆| 久久久久久91香蕉国产| 久久全球大尺度高清视频| 久久激情视频久久| 久久久久久久一区二区| 久久综合久久综合九色| 久久综合狠狠综合久久综合88 | 欧美伊人久久久久久久久影院| 亚洲免费视频一区二区| 性欧美videos另类喷潮| 欧美一级视频精品观看| 久久国产日本精品| 老司机免费视频一区二区三区| 久久只精品国产| 亚洲第一视频网站| 99精品欧美| 午夜日韩在线| 久久先锋资源| 欧美国产日韩二区| 欧美午夜不卡影院在线观看完整版免费 | 久久黄金**| 欧美刺激午夜性久久久久久久| 亚洲成人自拍视频| 一本色道久久综合狠狠躁篇的优点| 一本一道久久综合狠狠老精东影业 | 亚洲欧美综合| 久久一区二区三区av| 欧美精品一区二区久久婷婷| 国产精品久久久久久久久免费| 国产视频一区二区三区在线观看| 在线成人av| 亚洲天堂av综合网| 久久久久久久精| 亚洲三级免费| 欧美夜福利tv在线| 欧美激情视频网站| 国产精品一区视频网站| 亚洲国产精品一区制服丝袜 | 午夜欧美精品| 欧美a级大片| 制服丝袜亚洲播放| 久久一区亚洲| 国产精品揄拍一区二区| 亚洲日本欧美日韩高观看| 欧美一区二区在线视频| 亚洲国产日韩一区二区| 午夜免费久久久久| 欧美日韩在线大尺度| 怡红院av一区二区三区| 亚洲欧美清纯在线制服| 欧美成人中文字幕| 香蕉久久国产| 国产精品久久久久久户外露出| 亚洲成人资源| 久久久久久国产精品mv| 亚洲天堂激情|