時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(5)
1. 從BIOS到KERNEL
BIOS自檢->MBR(GRUB)->KERNEL->KERNEL自解壓->內(nèi)核初始化->內(nèi)核啟動
BIOS自檢
當電腦開機的時候,電腦會進入BIOS,BIOS的工作主要是偵測電腦的周邊配套設備是否工作正常,如CPU的類型、速度、緩存等
主板類型
內(nèi)存的速度,容量
硬盤的大小,類型和工作模式
風扇速度等
主要是為了檢查這些設備在開機的時候是否能通過檢測,如果能通過檢測,說明電腦可以正常的工作。
-----------------------------------------
一、載入啟動程序
BIOS自檢完成后,BIOS會根據(jù)用戶設置的啟動順序來由那個設備來啟動電腦的操作系統(tǒng),這個設備一般是硬盤。
也就是進入到硬盤的MBR區(qū)域(引導扇區(qū)),這個區(qū)域中的有512個字節(jié)的大小,其中前446個字節(jié)中保存的程序是選擇啟動分區(qū),也就是電腦由那個硬盤分區(qū)來載入開機的程序。那么在這個446個字節(jié)的空間中保存的就是啟動程序,然后由這個小程序來加載存儲在其他位置的操作系統(tǒng),也就是啟動grub程序。
當找到啟動設備(硬盤)時,第一階段所用的boot loader(存放在引導扇區(qū))被裝載到RAM中并被執(zhí)行。這里的boot loader在大小上小于一個扇區(qū)的大小,也就是512字節(jié),而它的任務,就是加載第二階段的boot loader。
當負責第二階段的boot loader位于內(nèi)存中并被執(zhí)行時,通常會顯示一個一閃而過的屏幕,然后linux以及可選的初始化內(nèi)存盤(一種臨時的根文件系統(tǒng),如果想得到具體的介紹,請訪問http://likunarmstrong.bokee.com/5502266.html)會被裝載到存儲器中。當系統(tǒng)鏡像被加載時,第二階段的boot loader將把控制權轉(zhuǎn)交給內(nèi)核鏡像,與此同時,內(nèi)核開始自解壓并初始化。在這個階段,第二階段的boot loader會檢查系統(tǒng)的硬件,枚舉那些附加的硬件設備,掛載根設備,之后加載需要的內(nèi)核模塊。完成之后,第一個用戶空間程序(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內(nèi)核鏡像下載到flash存儲器的方法,并在接下來的過程中執(zhí)行它。除了擁有存儲和啟動linux鏡像的功能外,這些啟動監(jiān)視器還能進行一定程度上的系統(tǒng)檢測和硬件初始化。在一個嵌入式的目標板中,這些啟動監(jiān)視器通常覆蓋了第一階段與第二階段boot loader的功能。
/************************************************************************************************/
小知識:如何查看你的MBR內(nèi)容。如果你希望查看你MBR的具體內(nèi)容,請用以下命令:
# dd if=/dev/hda of=mbr.bin bs=512 count=1
# od -xa mbr.bin
需要以root身份運行的dd命令,讀取你的第一個集成電子驅(qū)動器或者IDE驅(qū)動器的前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ū),一臺光驅(qū),一個硬盤上的分區(qū),網(wǎng)絡上的設備甚至一個usb 閃存盤都可以作為一個啟動設備。
當然,linux通常是從硬盤啟動的。硬盤上的MBR(主啟動記錄)包含有基本的boot loader,它是一個512字節(jié)大小的扇區(qū),位于磁盤的第一個扇區(qū)(0磁頭0磁道1扇區(qū))。當MBR被裝載到RAM中后,BIOS就會將控制權轉(zhuǎn)交給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é)的結(jié)束標志。0x55AA同時也是MBR有效的校驗確認。
主boot loader的工作是尋找并加載第二boot loader。它通過分析分區(qū)表,找出激活分區(qū)來完成這個任務,當它找到一個激活分區(qū)時,它將繼續(xù)掃描剩下的分區(qū)表中的分區(qū),以便確認他們都是未激活的。確認完畢后,激活分區(qū)的啟動記錄從設備中被讀到RAM,并被執(zhí)行。
#p#副標題#e#
四、 第二階段boot loader
起著次作用,或者說是第二boot loader,可以更加形象得被稱為內(nèi)核加載程序。這個階段的任務就是加載linux內(nèi)核,以及可選的初始化內(nèi)存盤。
/*******************************************************************/
小知識: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內(nèi)核。它是通過將本來兩階段的boot loader轉(zhuǎn)換成三個階段的boot loader。在第一階段(MBR)中會啟動stage1.5的boot loader來理解linux內(nèi)核鏡像中的特殊的文件系統(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ù)請求的情況顯示一個可選內(nèi)核的清單(在 /etc/grub.conf 中進行定義,同時還有幾個軟符號鏈接 /etc/grub/menu.lst 和 /etc/grub.conf)。你可以選擇一個內(nèi)核,修改其附加的內(nèi)核參數(shù)。同時,你可以選擇使用命令行的shell來對啟動過程進行更深層次的手工控制。
在第二階段boot loader存在與內(nèi)存中后,就可以對文件系統(tǒng)進行查詢了,同時,默認的內(nèi)核鏡像以及初始化內(nèi)存盤鏡像也被加載到內(nèi)存中。一切準備完畢之后,第二階段的boot loader就會調(diào)用內(nèi)核鏡像。
2. 內(nèi)核啟動:創(chuàng)建1#進程并執(zhí)行,由它創(chuàng)建若干內(nèi)核線程(kernel thread),然后裝入并執(zhí)行程序/sbin/init(變成一個用戶進程)。此后,init根據(jù)/etc/inittab配置文件來執(zhí)行相應的腳本進行系統(tǒng)初始化,如設置鍵盤、字體,裝載模塊,設置網(wǎng)絡等。
對于Redhat來說,執(zhí)行的順序為:
/etc/rc.d/rc.sysinit # 由init執(zhí)行的第一腳本
/etc/rc.d/rc $RUNLEVEL # init執(zhí)行指定運行級別($RUNLEVEL為缺省的運行模式)的各腳本;
/etc/rc.d/rc.local #運行模式2、3、5時會運行的腳本
/sbin/mingetty(或getty) # 等待用戶登錄
/etc/inittab中指定了系統(tǒng)的運行級別(RUNLEVEL),init根據(jù)運行級別啟動相關的服務(一些后臺進程),實現(xiàn)不同的功能。
RUNLEVEL值為:0-6
0:halt, 1:單用戶,2:多用戶,3:多用戶并啟動NFS服務
4:保留,5:運行xdm(X window)以圖形界面方式登錄
6:reboot
3./etc/inittab文件
/etc/inittab的文件內(nèi)容如下:
# 設定系統(tǒng)開機預設的RUNLEVEL:
id:3:initdefault:
# 開始進行RUNLEVEL的服務啟動前,使用來偵測與初始化系統(tǒng)環(huán)境的設定文件:
si::sysinit:/etc/rc.d/rc.sysinit
# 7 個不同 run level 的,需要啟動的服務的 scripts 放置路徑:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# 是否允許按下 [ctrl]+[alt]+[del] 就重新開機的設定項目:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# 本機端終端機啟動的個數(shù):
1:2345:respawn:/sbin/mingetty tty1
2:2345:respaw
關鍵詞標簽:Linux啟動流程
相關閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內(nèi)存型號 linux tc實現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關機、重啟、注銷 命令 查看linux服務器硬盤IO讀寫負載