linux啟動過程剖析
farsight2009 發表於 2009-8-6 18:04:00
講師。linux啟動過程的剖析能幫助那些想深入學習linux使用者建立乙個相關linux啟動過程的清晰概念,進而可以進一步研究linux接下來是如何工作的。
linux啟動過程如下:當使用者開啟pc的電源,bios開機自檢,按bios中設定的啟動裝置(通常是硬碟)啟動,接著啟動裝置
上安裝的引導程式lilo或grub開始引導linux,linux首先進行核心的引導,接下來執行init程式,init程式呼叫了
rc.sysinit和rc等程式,rc.sysinit和rc當完成系統初始化和執行服務的任務後,返回init;init啟動了mingetty後,
開啟了終端供使用者登入系統,使用者登入成功後進入了shell,這樣就完成了從開機到登入的整個啟動過程。如圖所示:
下面分步來介紹下linux的啟動過程:
1、bios自檢
當你開啟計算機電源,計算機會首先載入bios資訊,bios資訊是如此的重要,以至於計算機必須在最開始就找到它。這是因為
bios中包含了cpu的相關資訊、裝置啟動順序資訊、硬碟資訊、記憶體資訊、時鐘資訊、pnp特性等等。在此之後,計算機心裡就有譜了,知道應該去讀取哪
個硬體裝置了。
計算機在接通電源之後首先由bios進行自檢,即進行所謂的post(power on self
test),然後依據bios內設定的引導順序從硬碟、軟盤或cdrom中讀入「引導塊」。 在 pc 中,引導 linux 是從 bios
中的位址 0xffff0 處開始的。bios 的第乙個步驟是加電自檢(post)。post 的工作是對硬體進行檢測。bios
的第二個步驟是進行本地裝置的列舉和初始化。給定 bios 功能的不同用法之後,bios 由兩部分組成:post **和執行時服務。當 post
完成之後,它被從記憶體中清理了出來,但是 bios 執行時服務依然保留在記憶體中,目標作業系統可以使用這些服務。
要引導乙個作業系統,bios 執行時會按照 cmos
的設定定義的順序來搜尋處於活動狀態並且可以引導的裝置。引導裝置可以是軟盤、cd-rom、硬碟上的某個分割槽、網路上的某個裝置,甚至是 usb
快閃儲存器。通常,linux 都是從硬碟上引導的,其中主引導記錄(mbr)中包含主引導引導程式。
眾所周知,硬碟上第0磁軌第乙個扇區被稱為mbr,也就是master boot
record,即主引導記錄,它的大小是512位元組,別看地方不大,可裡面卻存放了預啟動資訊、分割槽表資訊。系統找到bios所指定的硬碟的mbr後,就
會將其複製到0×7c00位址所在的物理記憶體中。當 mbr 被載入到 ram 中之後,bios 就會將控制權交給
mbr。其實被複製到物理記憶體的內容就是boot loader,而具體到你的電腦,那就是lilo或者grub了。
提取mbr的資訊
要看mbr的內容,請使用下面的命令
#從/dev/sda上讀取前512個位元組的內容,並將其寫入mbr.bin檔案中
root@farsight:/home/linux# dd if=/dev/sda of=mbr.bin bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 b) copied, 0.000798615 seconds, 641 kb/s
#以十六進製制和ascii碼格式列印這個二進位制檔案的內容
root@farsight:/home/linux# od -xa mbr.bin
0000000 48eb 1090 d08e 00bc b8b0 0000 d88e c08e
k h dle dle so p nul | ? nul ack 9 nul stx s $ j ! ack nul
0000040 be00 07be 0438 0b75 c683 8110 fefe 7507
nul > > bel 8 eot u vt etx f dle soh ~ ~ bel u
…… 這個 dd 命令需要以 root 使用者的身份執行,它從 /dev/hda(第乙個 ide 盤) 上讀取前 512 個位元組的內容,並將其寫入 mbr.bin 檔案中。od 命令會以十六進製制和 ascii 碼格式列印這個二進位制檔案的內容。
2、啟動grub/lilo
當核心映像被載入到記憶體後,核心階段就開始了。 核心映像並不是乙個可執行的核心,而是乙個壓縮過的核心映像。通常它是乙個
zimage(壓縮映像,小於512kb)或bzimage(較大的壓縮映像,大於512kb),它是提前使用zlib進行壓縮的。在這個核心映像前面是
乙個例程,它實現少量硬體設定,並對核心映像中包含的核心進行解壓,然後將其放入高階記憶體中,如果有初始ram磁碟映像,就會將它移動到記憶體中,並標明以
後使用。然後此例程會呼叫核心,並開始啟動核心引導的過程。
在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.
根據grub設定的核心映像所在路徑,系統讀取記憶體映像,並進行解壓縮操作。此時,螢幕一般會輸出「uncompressing
linux」的提示。當解壓縮核心完成後,螢幕輸出「ok, booting the kernel」。
如果不知道要引導的核心的名稱,只需使用/然後按下tab鍵,就會顯示核心和initrd映像列表。
系統將解壓後的核心放置在記憶體之中,並呼叫start_kernel()函式來啟動一系列的初始化函式並初始化各種裝置,完成linux核心環境的建立。至此,linux核心已經建立起來了,基於linux的程式應該可以正常執行了。
4、執行init程序
init程序是所有程序的起點,核心在完成核心引導後,即在本執行緒(程序)空間內載入init程式,它的程序號為1。init程序
是所有程序的發起者和控制者。因為在任何基於unix的系統(比如linux)中,它都是第乙個執行的程序,所以init程序的編號(process
id,pid)永遠是1。如果init出現了問題,系統的其餘部分也就隨之而垮掉了。
init程序有兩個作用:
● 扮演終結父程序的角色:所有的孤兒程序都會被init程序接管。快速執行一下ps -af 命令,可以列出許多父程序id(parent process id,ppid)為1的程序來。
● 進入某個特定的執行級別時執行相應的程式,以此對各種執行級別進行管理,這個作用由/etc/inittab檔案定義的。 核心被載入後,第乙個執行的程式便是/sbin/init,該檔案會讀取/etc/inittab檔案,並依據此檔案來進行初始化工作。
5、通過/etc/inittab檔案進行初始化
Linux系統啟動過程剖析
想要更好的了解linux系統的執行原理,了解系統啟動的流程是非常有必要的。通常,我們按過開機電源之後,會聽到機箱內發出 滴 的一聲,接著螢幕上開始列印出一些字元,然後開始顯示出圖形介面,最後螢幕上會顯示需要輸入使用者名稱和密碼的登陸介面。其實不管是linux還是windows,從使用者感官的體驗來說...
Linux系統啟動過程剖析
想要更好的了解linux系統的執行原理,了解系統啟動的流程是非常有必要的。通常,我們按過開機電源之後,會聽到機箱內發出 滴 的一聲,接著螢幕上開始列印出一些字元,然後開始顯示出圖形介面,最後螢幕上會顯示需要輸入使用者名稱和密碼的登陸介面。其實不管是linux還是windows,從使用者感官的體驗來說...
Linux啟動過程
1 開啟 pc電源 pc加電後,乙個特殊的硬體電路會觸發 cpu 的 reset 腳的邏輯值,然後一些 cpu 暫存器,如 cs eip 等被給定乙個值,接著 cpu 跳轉到乙個固定位址開始執行 bios 2 bios 自檢,按設定的裝置啟動 bios 對硬體進行一系列徹底的檢查,如 cpu 型別 ...