Linux 啓動過程 原理解析

linux 的啓動過程 
 
系統啓動
粗體
1、系統加電
2、BIOS 自檢 → 本地設備枚舉和初始化
3、POST 代碼從內存中清除,但運行時服務(runtime service)仍然留在內存。
4、BIOS 從 CMOS 的設置中找出第1/2/3 啓動設備(可能有第4個),然後逐個嘗試,
   並在第一個 ”active“狀態的硬盤上讀入其 MBR
 
第一階段引導加載程序
1、MBR 實際上是由3個部分組成 :主引導加載程序(master bootloader code,446 字節)、主分區表  (ppt)、magic nubmer (0xAA55)組成
   主分區表有4個記錄,對應主分區1-主分區4,共64 字節。最後的 magic number 是 2 字節
2、主引導加載程序搜索主分區表,掃描全部4個分區記錄,確保只有1個是被標爲”active“ 的(用 fdisk 可以設置某個分區爲 active 分區)。
   然後讀入該分區的引導扇區(前512 字節)。active 分區一般是 C 盤或者 linux 的第一個分區
3、主引導加載程序的作用就是讀入第2階段的引導加載程序
 
第二階段引導加載程序
1、第2階段引導加載程序的目的是加載內核和 initrd 。GRUB 和 LILO 都是把 boot loader 程序分成兩部分,一部分在 MBR ,一部分在”active" 分區的引導扇區
2、第2階段引導加載程序被讀入內存後,它讀取 root() 命令給出的分區下的 grub/grub.conf ,顯示一個菜單,供用戶選擇
3、GRUB 可以細分爲3個階段,中間的一個是 stage1.5 ,它跟在 stage1 的後面,目的是讓 grub 能夠識別文件系統的類型
 
內核
1、內核自解壓
2、按照 bootloader 向它提供的 initrd 在內存中的地址,把 /dev/initrd 的內容拷貝到 /dev/ram ,並釋放 /dev/initrd 所佔用的內存
3、把 /dev/ram 按 rw 的模式掛載爲初始根文件系統
4、執行其上面的 /linuxrc 或者 /init 腳本,目的是加載驅動模塊
5、在 /linuxrc 和 /init 腳本中,會有 pivot_root ()或者 switchroot 把 /sysroot 下的真正根文件系統設備掛載到 / ,把初始根文件系統掛載到 /initrd 下
6、/linuxrc 和 /init 腳本的後面會 umount /initrd 下的初始根文件系統(即使沒有完全卸載,也會在 /etc/rc.d/rc.sysinit 中把它們全部卸載)
7、接下來是啓動 init 進程。在 2.4 內核中,這個步驟是由內核完成的。但在 2.6 內核中,這個步驟是由 /init 腳本完成的。

Init
1、init  首先執行 /etc/rc.d/rc.sysinit 進行系統的初始化
2、而 rc.sysint 會先執行 /etc/rc.d/init.d/functions ,獲得一些有用的函數,例如 daemon()、action ()、success()、failure()等
3、按照默認運行級別或者 grub 啓動時的 kernel 行給出的運行級別運行 /etc/rcN.d/ 下的腳本,先執行 K 開頭的(按從低到高),再執行S開頭的(從低到高)
    這個過程“有可能”是通過執行 /etc/rc.d/rc 腳本實現的。因爲 rc 腳本是爲改變 runlevel 而做的,那麼從關機(level 0)到 正常(level3/5)應該也算是
    一種特殊的改變 runlevel 的情況吧

4、按照 /etc/inittab 的要求在指定的虛擬控制檯上創建 mingetty 進程,提示輸入用戶名和密碼
5、執行 login 命令,login 命令會做如下工作 :
    a)如果存在 ~/.hashlogin ,則以 "quiet" 的方式登錄,不顯示郵件、不打印 motd
            如果存在 /var/log/lastlog ,則打印最後登錄時時間
    b)設置環境變量,包括 HOME、MAIL、PATH 、SHELL、TERM 等
         PATH 值默認是 /usr/local/bin:/bin:/usr/bin (對於普通用戶而言),
           對於 root 而言,則是 /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 。
     c)如果不是 quiet login ,則打印用戶的郵件數量和 /etc/motd 文件)
     d)啓動 login shell (默認是 /bin/sh),並執行 ~/.bashprofile
       e)~/.bashprofile 會自動執行 ~/.bashrc ,而 ~/.bashrc 又調用 /etc/bashrc
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章