解析Linux啓動流程及系統初始化

Linux系統啓動流程:

POST-->BIOS(Boot Sequce)--》MBR(bootloader)-->Kernel(CentOS5:initrd,CentOS6:initramfs)-->/sbin/init(CentOS5:/etc/inittab, CentOS6:/etc/inittab, /etc/init/*.conf)


啓動詳解:

1.POST自檢:第一步就是CPU加電然後尋址,而CPU尋址所需的代碼指令

 來自於ROM->硬件廠商製作(內存分爲ROM+RAM),關於CPU如何找到
 指令代碼的?硬件的設計的思想就是:CPU懂的去特定的位置去尋找
 代碼,而代碼得存貯者ROM就應該在特定的位置。與此同時POST自檢
 還會檢測內存,主板,顯卡,聲卡,網卡等I/O設備,等一切沒有

 問題POST自檢完成!將工作移交給BIOS去處理

2.BIOS:(Boot Sequence)加載可選擇的啓動設備->固件廠商製造

 Bios中存放着各種I/O設備的信息參數、系統時間、啓動尋找順序
 所以必須要檢測Bios是否正常。之後會去加載第一個硬盤設備

3.MBR:硬盤的主引導記錄,存在於0磁道第0扇區,共512字節。其中Bootloader佔據

 446字節,分區表佔據64字節,magic num佔據2字節。MBR將加載Bootloader去開始
 後邊的工作。

4.Bootloader(內核加載器)位於第0磁道第0扇區的446字節是最前邊

 的446字節哦!Bootloader的工作機制:bootloader可以訪問文件系
 統,而內核則作爲文件而存在。所以bootloader可以訪問內核文件,
 深入的說bootloader訪問內核文件時,是將內核文件Vmlinz所在的
 整個分區當作根去訪問的,如訪問/Vmlinz而根"/"本身的存在位置
 是由內核文件自己決定。(因爲每個文件必須要有一個自己的起始路徑)
 能理解這種邏輯嗎?
 現代我們常用的內核加載器是grub(Grand Unified Bootloader)
 以此grub來加載內核。加載內核之前grub所做的工作。

第一步

  grub將內核文件Vmlinz 和 grub自己加載到了/boot上,

     同時也在/boot上存放了所有模塊的驅動程序xxx.img文件

     用ll /boot 查看wKiom1MbDx7Qs6CtAAINSttntAI910.jpg

wKiom1MbEN3gFZd_AALDSsIJJjE774.jpg

            grub目錄中存放着grub.conf自身配置文件,device.map磁盤映射圖(映射分區/boot和/根分區)

wKioL1MbFEiyuiw1AANmvx6euwI563.jpg

wKiom1MbH-LA3TjDAAKSSt21VP8836.jpg

第二步  上邊我們已經提到grub目錄中存放着device.map磁盤映射分區,接下來我們去查看

                   映射的根分區/(內核真正掛載的分區)中的各種模塊所在的路徑

wKioL1MbGV3D0jZfAAF1ZO3YEUE299.jpg

接下來查看路徑下的各個模塊.ko文件

wKiom1MbGnrR6GPNAAI2CXI8D0M027.jpg

 Kernerl

Linux屬於單核系統:Kernel+各種外圍模塊組成
通過grub加載內核後,內核開始自我解壓並工作

通過虛擬根文件系統initrfs 調用init工作


wKioL1MbMObx08qtAAKdPpz2G1Q731.jpg

/etc/rc.d 目錄中存放着123456運行級別的目錄

wKiom1MbMsuzUQtsAAG48flHh_w874.jpg

 以rc3.d爲例,目錄中存放着進程, 進程運行級別 ,進程狀態(K爲開啓、S爲關閉)——>

init就是控制進程是K還是S得總管 (當系統在1 2 3 4 5 6 之間切換時由父進程fork而來的

子進程就會在K與S之間切換狀態)

wKiom1MbNDiTLsMEAASHQhMmw7M707.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章