国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
深入理解linux啟動過程

深入理解linux啟動過程

(2006-09-26 19:53:13)
標簽:

雜談

原文:http://www-128.ibm.com/developerworks/linux/library/l-linuxboot/

linux系統(tǒng)的啟動過程是由很多步驟組成的,但是,無論你是啟動一個標準的x86桌面計算機,還是一個嵌入式PowerPC的目標板,大多數(shù)的流程是驚人得相似的。這篇文章,探索了linux從最初的啟動準備到用戶空間中某個程序被開啟之間的啟動過程,跟隨這個流程,你還能學到其他許多與啟動有關的知識,例如,boot loaders,內核解壓縮,初始化內存盤,以及其他一些linux啟動的部分。
在很早的時候,啟動一個計算機意味著去喂那些包含啟動程序的紙帶,或者通過手工使用前面板那密密麻麻的地址/數(shù)據(jù)/控制開關來加載啟動程序,但是,簡化這個流程并非必須的。
讓我們首先從一個較高的高度上來對linux的啟動做一個全面的分析,然后,我們會回顧一下,在每一個獨立的過程中,發(fā)生了什么事情。在這途中的參考源代碼將幫助你在內核樹中不至于迷失方向,并能繼續(xù)深入挖掘下去。

一、 概述 圖1將是對啟動過程的整體回顧:
當系統(tǒng)一開始被啟動,或者重新啟動時,處理器將在眾所周知的位置執(zhí)行代碼。在個人電腦上,這個位置處于基本輸入輸出系統(tǒng)中,也就是我們所說的BIOS,它是被存儲在主板上的閃存中的。在嵌入式系統(tǒng)中,中央處理器(CPU)則將復位區(qū)域激活,來開始執(zhí)行flash或者ROM中的已知的程序。在其它情況中,基本的過程是一樣的。由于個人電腦提供了眾多靈活的可選設備,BIOS必須確定,由哪一個設備來執(zhí)行啟動過程。在接下來的文章中我們將涉及這方面的更多的內容。
當找到啟動設備時,第一階段所用的boot loader被裝載到RAM中并被執(zhí)行。這里的boot loader在大小上小于一個扇區(qū)的大小,也就是512字節(jié),而它的任務,就是加載第二階段的boot loader。
當負責第二階段的boot loader位于內存中并被執(zhí)行時,通常會顯示一個一閃而過的屏幕,然后linux以及可選的初始化內存盤(一種臨時的根文件系統(tǒng),如果想得到具體的介紹,請訪問http://likunarmstrong.bokee.com/5502266.html)會被裝載到存儲器中。當系統(tǒng)鏡像被加載時,第二階段的boot loader將把控制權轉交給內核鏡像,與此同時,內核開始自解壓并初始化。在這個階段,第二階段的boot loader會檢查系統(tǒng)的硬件,枚舉那些附加的硬件設備,掛載根設備,之后加載需要的內核模塊。完成之后,第一個用戶空間程序(init)開始執(zhí)行,更高層次的系統(tǒng)初始化開始。
這就是從表面上看,linux的啟動過程。好了,現(xiàn)在,讓我們更進一步,更深入地探索linux啟動過程中的一些細節(jié)。

二、 系統(tǒng)的啟動
系統(tǒng)啟動的階段,依賴于linux在哪個硬件設備上啟動。在嵌入式系統(tǒng)中,當系統(tǒng)被打開或者重新啟動的時候,就要使用啟動加載的環(huán)境。這方面的例子包括U-BOOT,RedBoot,和Lucent推出的MicroMonitor。嵌入式平臺通常是綁定了啟動監(jiān)視器的。這些程序位于目標硬件上flash存儲器的特定位置,提供了將linux內核鏡像下載到flash存儲器的方法,并在接下來的過程中執(zhí)行它。除了擁有存儲和啟動linux鏡像的功能外,這些啟動監(jiān)視器還能進行一定程度上的系統(tǒng)檢測和硬件初始化。在一個嵌入式的目標板中,這些啟動監(jiān)視器通常覆蓋了第一階段與第二階段boot loader的功能。


小知識:如何查看你的MBR內容。如果你希望查看你MBR的具體內容,請用以下命令:
# dd if=/dev/hda of=mbr.bin bs=512 count=1
# od -xa mbr.bin
需要以root身份運行的dd命令,讀取你的第一個集成電子驅動器或者IDE驅動器的前512字節(jié),并將他們寫入
mbr.bim文件。od命令則是以十六進制和ASCII碼形式打印出這個二進制文件


在個人電腦中,linux的啟動是從0xFFFF0地址開始的。BIOS的第一步動作就是進行上電自檢(POST)。POST的工作是檢查硬件設備。BIOS的第二步動作就是枚舉本地設備并初始化。
由于BIOS功能使用上的不同,它由兩個部分組成:POST碼runtime服務。POST完成后,它將從存儲器中被清除,但是BIOS runtime服務會被保留,用于目標操作系統(tǒng)。
為了啟動操作系統(tǒng),BIOS的runtime服務將搜索那些激活狀態(tài)的或是可引導啟動的設備,搜索的順序則由CMOS設置決定(也就是我們平時所謂的在BIOS中設置的啟動順序)。一個軟驅,一臺光驅,一個硬盤上的分區(qū),網(wǎng)絡上的設備甚至一個usb 閃存盤都可以作為一個啟動設備。
當然,linux通常是從硬盤啟動的。硬盤上的MBR(主啟動記錄)包含有基本的boot loader,它是一個512字節(jié)大小的扇區(qū),位于磁盤的第一個扇區(qū)(0磁頭0磁道1扇區(qū))。當MBR被裝載到RAM中后,BIOS就會將控制權轉交給MBR。

三、 第一階段boot loader
位于MBR中的主boot loader是一個512字節(jié)的鏡像,其中不僅包含了程序代碼,還包含了一個小的分區(qū)表,如圖2所示。最初的446字節(jié)是主boot loader,它里面就包含有可執(zhí)行代碼以及錯誤消息文本。接下來的64字節(jié)是分區(qū)表,其中包含有四個分區(qū)的各自的記錄(一個分區(qū)占16字節(jié))。MBR通過特殊數(shù)字0xAA55(譯者注:在電子界中AA55確實是具有傳奇色彩的數(shù)字,想知道為什么么?將它展開成二進制形式,看看有什么規(guī)律)作為兩個字節(jié)的結束標志。0x55AA同時也是MBR有效的校驗確認。

主boot loader的工作是尋找并加載第二boot loader。它通過分析分區(qū)表,找出激活分區(qū)來完成這個任務,當它找到一個激活分區(qū)時,它將繼續(xù)掃描剩下的分區(qū)表中的分區(qū),以便確認他們都是未激活的。確認完畢后,激活分區(qū)的啟動記錄從設備中被讀到RAM,并被執(zhí)行。

四、 第二階段boot loader
起著次作用,或者說是第二boot loader,可以更加形象得被稱為內核加載程序。這個階段的任務就是加載linux內核,以及可選的初始化內存盤。


小知識:GRUB階段的boot loaders
在/boot/grub目錄中包含有stage1,stage2和stage1.5的boot loaders,同時還有不少可選的loaders(例如,CD-ROM使用的就是iso9660_stage_1_5)


把第一階段和第二階段的boot loaders聯(lián)合起來,就是在x86個人電腦中,我們所說的linux loader(LILO)或者GRand Unified Bootloader(GRUB)。由于GRUB修正了一些LILO中存在的缺陷,因此下面就讓我們來看看GRUB(如果你希望得到更多的關于GRUB,LILO和與之相關話題的討論資源,請見文后的參考資料)
對于GRUB來說,一個比較好的方面就是它包含了linux文件系統(tǒng)的知識。與LILO使用裸扇區(qū)不同的是,GRUB能夠從ext2或者ext3文件系統(tǒng)中加載linux內核。它是通過將本來兩階段的boot loader轉換成三個階段的boot loader。在第一階段(MBR)中會啟動stage1.5的boot loader來理解linux內核鏡像中的特殊的文件系統(tǒng)格式,例如,reiserfs_stage1-5(用于從reiserf日志文件系統(tǒng)中進行加載)或e2fs+stage1_5(用于從wxt2或ext3文件系統(tǒng)進行加載)。當stage1.5的boot loader被加載并運行時,stage2 的boot loader才能被加載。
當stage2被加載時,GRUB能根據(jù)請求的情況顯示一個可選內核的清單(在 /etc/grub.conf 中進行定義,同時還有幾個軟符號鏈接 /etc/grub/menu.lst 和 /etc/grub.conf)。你可以選擇一個內核,修改其附加的內核參數(shù)。同時,你可以選擇使用命令行的shell來對啟動過程進行更深層次的手工控制。
在第二階段boot loader存在與內存中后,就可以對文件系統(tǒng)進行查詢了,同時,默認的內核鏡像以及初始化內存盤鏡像也被加載到內存中。一切準備完畢之后,第二階段的boot loader就會調用內核鏡像。

五、 內核
(譯者注:在翻譯本章的時候,譯者發(fā)現(xiàn)IBM網(wǎng)站上已有譯好的文章,因此從本章開始以官方網(wǎng)站上的內容為主)。當內核映像被加載到內存中,并且階段 2 的引導加載程序釋放控制權之后,內核階段就開始了。內核映像并不是一個可執(zhí)行的內核,而是一個壓縮過的內核映像。通常它是一個 zImage(壓縮映像,小于 512KB)或一個 bzImage(較大的壓縮映像,大于 512KB),它是提前使用 zlib 進行壓縮過的。在這個內核映像前面是一個例程,它實現(xiàn)少量硬件設置,并對內核映像中包含的內核進行解壓,然后將其放入高端內存中,如果有初始 RAM 磁盤映像,就會將它移動到內存中,并標明以后使用。然后該例程會調用內核,并開始啟動內核引導的過程。

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

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

小知識: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 映像列表。


通過調用 start_kernel,會調用一系列初始化函數(shù)來設置中斷,執(zhí)行進一步的內存配置,并加載初始 RAM 磁盤。最后,要調用 kernel_thread(在 arch/i386/kernel/process.c 中)來啟動 init 函數(shù),這是第一個用戶空間進程(user-space process)。最后,啟動空任務,現(xiàn)在調度器就可以接管控制權了(在調用 cpu_idle 之后)。通過啟用中斷,搶占式的調度器就可以周期性地接管控制權,從而提供多任務處理能力。
在內核引導過程中,初始 RAM 磁盤(initrd)是由階段 2 引導加載程序加載到內存中的,它會被復制到 RAM 中并掛載到系統(tǒng)上。這個 initrd 會作為 RAM 中的臨時根文件系統(tǒng)使用,并允許內核在沒有掛載任何物理磁盤的情況下完整地實現(xiàn)引導。由于與外圍設備進行交互所需要的模塊可能是 initrd 的一部分,因此內核可以非常小,但是仍然需要支持大量可能的硬件配置。在內核引導之后,就可以正式裝備根文件系統(tǒng)了(通過 pivot_root):此時會將 initrd 根文件系統(tǒng)卸載掉,并掛載真正的根文件系統(tǒng)。
initrd 函數(shù)讓我們可以創(chuàng)建一個小型的 Linux 內核,其中包括作為可加載模塊編譯的驅動程序。這些可加載的模塊為內核提供了訪問磁盤和磁盤上的文件系統(tǒng)的方法,并為其他硬件提供了驅動程序。由于根文件系統(tǒng)是磁盤上的一個文件系統(tǒng),因此 initrd 函數(shù)會提供一種啟動方法來獲得對磁盤的訪問,并掛載真正的根文件系統(tǒng)。在一個沒有硬盤的嵌入式環(huán)境中,initrd 可以是最終的根文件系統(tǒng),或者也可以通過網(wǎng)絡文件系統(tǒng)(NFS)來掛載最終的根文件系統(tǒng)。

六、 init的介紹與結束語
當內核被引導并進行初始化之后,內核就可以啟動自己的第一個用戶空間應用程序了。這是第一個調用的使用標準 C 庫編譯的程序。在此之前,還沒有執(zhí)行任何標準的 C 應用程序。
在桌面 Linux 系統(tǒng)上,第一個啟動的程序通常是 /sbin/init。但是這不是一定的。很少有嵌入式系統(tǒng)會需要使用 init 所提供的豐富初始化功能(這是通過 /etc/inittab 進行配置的)。在很多情況下,我們可以調用一個簡單的 shell 腳本來啟動必需的嵌入式應用程序。
與Linux 本身非常類似,Linux 的引導過程也非常靈活,可以支持眾多的處理器和硬件平臺。最初,加載引導加載程序提供了一種簡單的方法,不用任何花架子就可以引導 Linux。LILO 引導加載程序對引導能力進行了擴充,但是它卻缺少文件系統(tǒng)的感知能力。最新一代的引導加載程序,例如 GRUB,允許 Linux 從一些文件系統(tǒng)(從 Minix 到 Reise)上進行引導。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Linux啟動過程詳解-《別怕Linux編程》之八
linux系統(tǒng)啟動過程詳解
系統(tǒng)安裝: GRUB安裝,配置及使用匯總
操作系統(tǒng)啟動過程
Linux服務器啟動過程詳解(引載)_江海川行
Linux 引導過程內幕
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服