linux引導過程

2021-06-21 11:01:47 字數 2911 閱讀 2181

bios是位於主機板的快閃儲存器中某段特殊區域。這個過程主要是是執行bios中從位址0xffff0處開始的**。主要是確定要使用哪個裝置來引導系統, 這個過程的具體步驟為:

(1) 加電自檢(post),即對硬體進行檢測

(2) 本地裝置的列舉及初始化,bios會按照cmos設定的順序來搜尋處於活動狀態並且可以引導的裝置。引導裝置可以是usb,軟盤,cd-rom等,但通常是從硬碟上引導,而硬碟中的第乙個扇區(0道0柱面1扇區)的512bytes是mbr,mbr中存在著主引導引導程式。當mbr被載入到ram中後,bios就將控制權交給了mbr。

利用 dd if=/dev/sda of=mbr.bin bs=512, count=1 就可以提取mbr資訊,再利用od -xa mbr.bin就可以以16進製制,ascii碼的形式列印出mbr的資訊

mbr的主引導程式是乙個512bytes的映像,它包含446bytes的bootloader程式及64bytes分割槽表(4個分割槽)及2bytes的magic number。mbr以0xaa55結束,可以利用這個數字檢查mbr的有效性,mbr結構如下:

mbr中的主引導程式是查詢並載入次引導引導程式,他是通過在分割槽表中查詢乙個活動分割槽實現的,將活動分割槽u的引導記錄從這個裝置中讀入ram中並執行

在x86環境中,第一階段和第二階段的引導引導程式一起稱為 linux loader(lilo)或 grand unified bootloader(grub),關於grub,我們可以檢視/boot/grub下面

[root@localhost grub]# ll

total 274

-rw-rw-r--. 1 root root 63 apr 3 17:32 device.map

-rw-r--r--. 1 root root 13392 apr 3 17:32 e2fs_stage1_5

-rw-r--r--. 1 root root 12632 apr 3 17:32 fat_stage1_5

-rw-r--r--. 1 root root 11760 apr 3 17:32 ffs_stage1_5

-rw-------. 1 root root 809 apr 28 19:52 grub.conf

-rw-r--r--. 1 root root 11768 apr 3 17:32 iso9660_stage1_5

-rw-r--r--. 1 root root 13280 apr 3 17:32 jfs_stage1_5

lrwxrwxrwx. 1 root root 11 apr 3 17:32 menu.lst -> ./grub.conf

-rw-r--r--. 1 root root 11968 apr 3 17:32 minix_stage1_5

-rw-r--r--. 1 root root 14424 apr 3 17:32 reiserfs_stage1_5

-rw-r--r--. 1 root root 1341 nov 15 2010 splash.xpm.gz

-rw-r--r--. 1 root root 512 apr 3 17:32 stage1

-rw-r--r--. 1 root root 126108 apr 3 17:32 stage2

-rw-r--r--. 1 root root 12036 apr 3 17:32 ufs2_stage1_5

-rw-r--r--. 1 root root 11376 apr 3 17:32 vstafs_stage1_5

-rw-r--r--. 1 root root 13976 apr 3 17:32 xfs_stage1_5

他包含了 stage1、stage1_5 和 stage2 引導引導程式,以及很多其他引導程式(例如,cr-rom 使用的是 iso9660_stage_1_5)。

grub 不像 lilo 一樣使用裸扇區,而是可以從 ext2 或 ext3 檔案系統中載入 linux 核心。它是通過將兩階段的引導引導程式轉換成三階段的引導引導程式來實現這項功能的。階段 1 (mbr)引導了乙個階段 1.5 的引導引導程式,它可以理解包含 linux 核心映像的特殊檔案系統。當階段 1.5 的引導引導程式被載入並執行時,階段 2 的引導引導程式就可以進行載入,載入之後,grub 就可以在請求時顯示可用核心列表(在 /etc/grub.conf 中進行定義)。將第二階段的引導引導程式載入到記憶體中之後,就可以對檔案系統進行查詢了,並將預設的核心映像和 initrd 映像載入到記憶體中。當這些映像檔案準備好之後,階段 2 的引導引導程式就可以呼叫核心映像了。

當核心映像被載入到記憶體中,並且階段 2 的引導引導程式釋放控制權之後,核心階段就開始了。核心映像並不是乙個可執行的核心,而是乙個壓縮過的核心映像,我們一般是bzimage,接下來這個過程會經過header.s ,startup等幾個過程初始化一些硬體相關的,這裡自己沒太搞懂,就稍微略過,希望知道的相告。

然後呼叫乙個叫做decompress_kernel的 c 函式,然後中間也有乙個startup步驟,然後就到了init/start_kernel,這個可以參見我另乙個對md開機的回溯中對其的了解。

start_kernel,會呼叫一系列初始化函式來設定中斷,執行進一步的記憶體配置,並載入初始 ram 磁碟。最後,要呼叫 kernel_thread啟動kernel_init 執行緒,裡邊很重要的乙個是有do_basic_setup,主要是對直接編譯進核心的一些模組的載入及初始化等。然後乙個就是在init_post是核心初始化的尾聲,在這裡邊開始呼叫使用者程式的第一只程式init,關於這個程式的一些,可以參考一些網上的blog,所以要注意的是init有分核心的init跟使用者層的init,而使用者層的是在核心init後的尾聲init_post中開始的。

Linux引導過程

1 開機 2 加電自檢 bios,一段程式用於控制管理硬體,並決定啟動順序 所有資料 於cmos晶元 3 mbr引導 尋找啟動裝置上的mbr資訊,搜尋系統所有分割槽位置 4 grub引導 系統選擇選單 boot grub grub.conf 5 載入核心 將啟動核心載入到記憶體中 改區域不可越權訪問...

Linux 引導過程

引導過程的步驟 linux系統典型的引導過程由下面6個不同的階段組成 載入並初始化核心 檢測和配置裝置 建立核心執行緒 操作員干預 執行系統啟動指令碼 多使用者模式執行 系統管理員對以上大多數步驟幾乎沒有什麼控制權。我們通過編輯系統啟動指令碼來影響大多數的引導配置。初始化核心 linux核心本身就是...

Linux 引導過程內幕

linux啟動流程 當 bzimage 用於 i386 映像 被呼叫時,我們從.arch i386 boot head.s的start彙編例程開始執行 主要流程圖請參看圖 3 這個例程會執行一些基本的硬體設定,並呼叫.arch i386 boot compressed head.s中的startup...