核心啟動流程及相關概念

2021-09-12 08:33:21 字數 3164 閱讀 5024

整個過程基本可以分為post-->bios-->mbr(grub)-->kernel-->init-->runlevel。下面會詳細說明每個過程的作用。

bios(basic input/output system),基本輸入輸出系統,該系統儲存於主機板的rom晶元上,計算機在開機時,會最先讀取該系統,然後會有乙個加電自檢過程,這個過程其實就是檢查cpu和記憶體,計算機最基本的組成單元(控制器、運算器和儲存器),還會檢查其他硬體,若沒有異常就開始載入bios程式到記憶體當中。詳細的bios功能,這邊就不說了,bios主要的乙個功能就是儲存了磁碟的啟動順序,bios會按照啟動順序去查詢第乙個磁碟頭的mbr資訊,並載入和執行mbr中的bootloader程式,若第乙個磁碟不存在mbr,則會繼續查詢第二個磁碟(ps:啟動順序可以在bios的介面中進行設定),一旦bootloader程式被檢測並載入記憶體中,bios就將控制權交接給了bootloader程式。

mbr

mbr(master boot record),主引導記錄,mbr儲存於磁碟的頭部,大小為512bytes,其中,446bytes用於儲存bootloader程式,64bytes用於儲存分割槽表資訊,最後2bytes用於mbr的有效性檢查。

grub

grub(grand unified bootloader),多系統啟動程式,其執行過程可分為三個步驟:

stage1:這個其實就是mbr,它的主要工作就是查詢並載入第二段bootloader程式(stage2),但系統在沒啟動時,mbr根本找不到檔案系統,也就找不到stage2所存放的位置,因此,就有了stage1_5

stage1_5:該步驟就是為了識別檔案系統

stage2:grub程式會根據/boot/grub/grub.conf檔案查詢kernel的資訊,然後開始載入kernel程式,當kernel程式被檢測並在載入到記憶體中,grub就將控制權交接給了kernel程式。

ps:實際上這個步驟/boot還沒被掛載,grub直接識別grub所在磁碟的檔案系統,所以實際上應該是/grub/grub.conf檔案,該配置檔案的資訊如下:

grub.conf: 

#boot=/dev/sda

default=0        #設定預設啟動的title的編號,從0開始

timeout=5       #等待使用者選擇的超時時間

splashimage=(hd0,0)/boot/grub/splash.xpm.gz    #grub的背景

hiddenmenu     #隱藏選單

title centos (2.6.18-194.el5pae)      #核心標題

root (hd0,0)         #核心檔案所在的裝置

kernel /vmlinuz-2.6.18-194.el5pae ro root=label=/     #核心檔案路徑以及傳遞給核心的引數

initrd /initrd-2.6.18-194.el5pae.img                            #ramdisk檔案路徑

kernel

kernel,核心,kernel是linux系統最主要的程式,實際上,kernel的檔案很小,只保留了最基本的模組,並以壓縮的檔案形式儲存在硬碟中,當grub將kernel讀進記憶體,記憶體開始解壓縮核心檔案。講核心啟動,應該先講下initrd這個檔案,

initrd(initial ram disk),它在stage2這個步驟就被拷貝到了記憶體中,這個檔案是在安裝系統時產生的,是乙個臨時的根檔案系統(rootfs)。因為kernel為了精簡,只保留了最基本的模組,因此,kernel上並沒有各種硬體的驅動程式,也就無法識rootfs所在的裝置,故產生了initrd這個檔案,該檔案裝載了必要的驅動模組,當kernel啟動時,可以從initrd檔案中裝載驅動模組,直到掛載真正的rootfs,然後將initrd從記憶體中移除。 

initramfs,在linux2.5**現了initramfs,它的作用和initrd類似,只是和核心編譯成乙個檔案(該initramfs是經過gzip壓縮後的cpio格式的資料檔案),該cpio格式的檔案被鏈結進了核心中特殊的資料段.init.ramfs上,其中全域性變數__initramfs_start和__initramfs_end分別指向這個資料段的起始位址和結束位址。核心啟動時會對.init.ramfs段中的資料進行解壓,然後使用它作為臨時的根檔案系統。

kernel會以唯讀方式掛載根檔案系統,當根檔案系統被掛載後,開始裝載第乙個程序(使用者空間的程序),執行/sbin/init,之後就將控制權交接給了init程式。

init

init,初始化,顧名思義,該程式就是進行os初始化操作,實際上是根據/etc/inittab(定義了系統預設執行級別)設定的動作進行指令碼的執行,第乙個被執行的指令碼為/etc/rc.d/rc.sysinit,這個是真正的os初始化指令碼,簡單講下這個指令碼的任務(可以去看看實際指令碼,看看都做了什麼):

1、啟用udev和selinux;2、根據/etc/sysctl.conf檔案,來設定核心引數;3、設定系統時鐘;4、裝載硬碟對映;5、啟用交換分割槽;6、設定主機名;7、根檔案系統檢測,並以讀寫方式重新掛載根檔案系統;8、啟用raid和lvm裝置;9、啟用磁碟配額;10、根據/etc/fstab,檢查並掛載其他檔案系統;11、清理過期的鎖和pid檔案

執行完後,根據配置的啟動級別,執行對應目錄底下的指令碼,最後執行/etc/rc.d/rc.local這個指令碼,至此,系統啟動完成。

runlevel

runlevel,執行級別,不同的級別會啟動的服務不一樣,init會根據定義的級別去執行相應目錄下的指令碼,linux的啟動級別分為以下幾種

0:關機模式

1:單一使用者模式(直接以管理員身份進入)

2:多使用者模式(無網路)

3:多使用者模式(命令列)

4:保留

5:多使用者模式(圖形介面)

6:重啟

在不同的執行級別下,/etc/rc.d/rc這個指令碼會分別執行不同目錄下的指令碼

這些目錄下的指令碼只有k*和s*開頭的檔案,k開頭的檔案為開機需要執行關閉的服務,s開頭的檔案為開機需要執行開啟的服務。

參考:

核心啟動流程

核心的初始化過程由start kernel函式開始,至第乙個使用者程序init結束,呼叫了一系列的初始化函式對所有的核心元件進行初始化。其中,start kernel rest init kernel init init post等4個函式構成了整個初始化過程的主線。start kernel函式 從...

linux 核心 核心啟動流程

cs是 段暫存器,ip是指令指標暫存器 相當於偏移位址 儲存的是 指令的位址。cs ip共同作用生成了 位址,具體演算法是cs左移4位 ip即是 位址。例如cs 0xf000,ip 0xfff0,則 位址為0xffff0.global globl 命令 global symbol global 使得...

linux核心啟動流程

linux核心啟動流程 計算機在啟動時都是先加電,然後進行硬體檢測並引導作業系統的初始化程式,然後作業系統的初始化程式程負責讀入系統核心並建產系統的執行環境.一這過程相對來說比較復而且與cpu體系結構相關,這裡我們通過linux並以i386的體系結構對這一過程進行較為詳細的說明.1 硬體檢測 當機器...