linux2 6 29 啟動過程詳細分析

2021-08-30 19:15:10 字數 1919 閱讀 1687

linux的啟動大體上可以分幾個步驟:

第一部分 grub部分,核心的載入過程。

這裡總結一下別人的思想,因為自己沒怎麼看過grub的原始碼。

1. bios執行int 0x19,載入mbr至0x7c00並跳轉執行,這個mbr在我們通常的系統中就是stage1.s(512b), 位於磁碟的0面0道第一扇區,程式跳到0x7c00處執行

2. stage1執行過程中會載入磁碟0面0道第二扇區的512b的一段程式至0x8000處,就是grub原始碼裡stage2/start.s,這裡start.s是stage1_5或是stage2的總入口,它才是stage1_5或者stage2的真正載入器。

3. 在stage1_5載入之前,stage2是不可能被載入的,因為stage1並不能識別檔案系統

stage1_5究竟被放在哪呢?很多兄弟可能以為它就是/boot/grub/底下的哪些xxfs_stage1_5檔案,但試想一下,要找到boot 分割槽所在的stage1_5檔案,那麼就必須使得stage1具備檔案系統識別功能,而stage1_5本身就是檔案系統的支撐**,它必須載入 stage1_5才能具備這種功能。那麼,我們又回到了那種矛盾體的悖論──要載入stage1_5來找到stage1_5? 呵呵。

所以用來識別boot分割槽檔案系統的stage1_5不能作為檔案來被stage1讀取, 它只能被存放在固定的扇區中。這裡強調"用來識別boot分割槽檔案系統",那是因為並不是所有的stage1_5檔案都被放在固定扇區的,只有boot分 區的檔案系統對應的stage1_5才會被放在固定的扇區中去!比如說,你的boot分割槽的檔案系統是ext2,那麼在安裝grub的stage1的時 候,e2fs_stage1_5就會被存放至乙個固定的扇區集,而其他的如reiserfs_stage1_5就依然作為檔案來存放,以供grub使用 root()命令來識別其他的boot分割槽(那時候,stage2已經被載入了,所以這個不成問題)

最後得出結論,stage1.s被放在0面0道的第1扇區,start.s被放在0面0道的第2扇區,而與boot分割槽相關的檔案系統的xxfs_stage1_5被放在0面0道第3扇區開始的扇區裡,其佔據的扇區數目與該stage1_5檔案的大小有關。而其餘的stage1_5以及stage2都作為檔案被存放在boot分割槽裡。

上面是摘自一位網友的,但是看grub後面的版本比如0.97,好像就不存在所謂的stage1_5了??這是個疑問。

4. 講完了stage1以及stage1_5的執行流程以及位置關係後,就輪到stage2這個大約110kb左右的mini os了。stage2的入口是stage2/asm.s,asm.s在設定好c執行環境之後,會呼叫第乙個c函式init_bios_info(stage2/common.c),這個函式在執行一些底層的初始 化之後,會呼叫stage2的main函式cmain(stage2/stage2.c),這樣stage2這個 mini os正式開始執行了!

針對menu.lst和shell這兩種情況,cmain將:

menu.lst: run_menu()(stage2.c)->run_script()(cmdline.c)->find_command->執行命令函式

shell: enter_cmdline()(cmdline.c)->find_command->執行命令函式

殊途同歸,最後都歸結為命令列的解釋執行

find_command(stage2/cmdline.c)按照menu.lst中或者shell使用者輸入的命令字串,在乙個全域性性struct builtin *builtin_table(stage2/builtin.c)變數中去找到內建命令的函式,然後執行。

值得一提的是grub的shell類似bash的命令補全和命令歷史紀錄。

這裡需要注意的是:stage2要現進入保護模式,把作業系統核心載入到記憶體,然後回到保護模式,把控制權交給核心。

第二部分 linux核心的啟動

1. 核心會從header.s開始執行,具體為什麼會從這裡執行,在以後看完grub原始碼後會詳細解釋

Linux啟動過程

1 開啟 pc電源 pc加電後,乙個特殊的硬體電路會觸發 cpu 的 reset 腳的邏輯值,然後一些 cpu 暫存器,如 cs eip 等被給定乙個值,接著 cpu 跳轉到乙個固定位址開始執行 bios 2 bios 自檢,按設定的裝置啟動 bios 對硬體進行一系列徹底的檢查,如 cpu 型別 ...

Linux 啟動過程

fae 將porting 好的linux 提供,幾乎都在寫應用 空閒時間整理一下 b1202 系統啟動的過程 通過 boot vm 進行啟動 vmlinuz init 程序會讀取 etc inittab etc inittab 先 etc rc.d rc.sysinit 再 etc rc.d rc3...

Linux啟動過程

1.加電時由硬體將bios載入到記憶體末尾.這時是實模式,定址空間為1m.2.由硬體將cs段暫存器強制設定為0xffff,ip指令暫存器設定為0x0000.這樣cs ip指向了oxffff0的位址位置.這個位置就是bios程式的入口位址.3.執行bios程式.在記憶體起始位址0x00000設定1k大...