linux启动过程中内核拷贝,轻松识破linux内核启动过程中的“”套路“”
內核啟動流程相關的內容讓很多熱愛linux的小伙伴既愛又恨,因為這是了解linux系統基本構造的良好過程同時由于其本身復雜且底層,腦子中的脈絡不是很清晰,本文就總結了一些優秀博文,以自己的理解來解構一下。
本文的環境是CentOS 6.8,
基本過程:
庖丁解牛:
1.POST
BIOS的功能由兩部分組成,
步驟1:上電自檢POST(Power-on self test),主要負責檢測系統外圍關鍵設備(如:CPU、內 ? ? ? ? ? ? ? ? 存、顯卡、I/O、鍵盤鼠標等)是否正常。例如,最常見的是內存松動的情況,BIOS自 ? ? ? ? ? ? ? ? 檢階段會報錯,系統就無法啟動起來;
步驟2:步驟1成功后,便會執行一段小程序用來枚舉本地設備并對其初始化。這一步主要是根 ? ? ? ? ? ? ? 據我們在BIOS中設置的系統啟動順序來搜索用于啟動系統的驅動器,如硬盤、光盤、U ? ? ? ? ? ? ? ? 盤、軟盤和網絡等。我們以硬盤啟動為例,BIOS此時去讀取硬盤驅動器的第一個扇區 ? ? ? ? ? ? ? ? (MBR,512字節),然后執行里面的代碼。?BIOS的任務就完成后將系統啟動的控制權移交 ? ? ? ? ? ? ? 到MBR部分的代碼。
2.MBR(Master Boot Record):主引導扇區位于整個硬盤的0磁頭0柱面1扇區,包括硬盤主引導記錄MBR(Master Boot Record)和分區表。其中主引導記錄的作用就是檢查分區表是否正確以及確定哪個分區為引導分區,并在程序結束時把該分區的啟動程序,也就是操作系統引導扇區調入內存加以執行。
stage1:stage1是直接被寫入到MBR中去的,這樣機器一啟動檢測完硬件后,就將控制權交給了GRUB的代碼。也就是上圖所看到的前446個字節空間中存放的是stage1的代碼。BIOS將stage1載入內存中0x7c00處并跳轉執行。stage1(/stage1/start.S)的任務非常單純,僅僅是將硬盤0頭0道2扇區讀入內存。而0頭0道2扇區內容是源代碼中的/stage2/start.S,編譯后512字節,它是stage2或者stage1_5的入口
stage1.5它存放在硬盤0頭0道3扇區向后的位置,stage1_5作為stage1和stage2中間的橋梁,stage1_5有識別文件系統的能力,此后grub才有能力去訪問/boot分區/boot/grub目錄下的 stage2文件,將stage2載入內存并執行。
當stage2被載入內存執行時,它首先會去解析grub的配置文件/boot/grub/grub.conf,然后加載內核鏡像到內存中,并將控制權轉交給內核。而內核會立即初始化系統中各設備并做相關的配置工作,其中包括CPU、I/O、存儲設備等。
關于Linux的設備驅動程序的加載,有一部分驅動程序直接被編譯進內核鏡像中,另一部分驅動程序則是以模塊的形式放在initrd(ramdisk)中
default=1#?默認啟動的內核title,?0?表示是第一個
timeout=5#?默認等待時間
splashimage=(hd0,0)/grub/splash.xpm.gz????#?指定菜單的背景圖片的路徑。為xpm格式,采用gzip壓縮,只能為14bits色
hiddenmenu????#?隱藏菜單
title?CentOS?(2.6.32-358.el6.x86_64)????#?標題名,用戶可自定義
root?(hd0,0)????#?指定?grub?的根位置
#?指定?kernel?文件的位置,還要指出?root(系統啟動后)?的位置,掛載方式?ro,這項很關鍵。
#?加載后會啟動?init?進程。
kernel?/vmlinuz-2.6.32-358.el6.x86_64?roroot=/dev/mapper/vg0-root?rd_NO_LUKS?rd_NO_DMLANG=en_US.UTF-8rd_LVM_LV=vg0/swap?rd_NO_MDSYSFONT=latarcyrheb-sun16crashkernel=autord_LVM_LV=vg0/rootKEYBOARDTYPE=pcKEYTABLE=usrhgbcrashkernel=autoquiet?rhgb?quiet
#?在內核啟動過程中裝載根文件系統時有用
initrd?/initramfs-2.6.32-358.el6.x86_64.img
3.kernel:
自身初始化:
探測可識別到的所有硬件設備;
加載硬件驅動程序:(有可能會借助于randisk加載驅動)
以只讀方式掛載根文件系統,防止內核對根文件系統有損壞
運行用戶空間的第一個應用程序:/sbin/init
a.ramfsinitramfs?是以?gzip?壓縮的?cpio?格式的文件。內核啟動時將他作為一個臨時的根文件系統。
#?grub?的?stage2?將initrd加載到內存里,讓后將其中的內容釋放到內容中,
#?內核便去執行init腳本,這時內核將控制權交給了init文件處理。
#?init?它也主要是加載各種存儲介質相關的設備驅動程序。當所需的驅動程序加載完后,
#?會創建一個根設備,然后將根文件系統rootfs以只讀的方式掛載。
#?這一步結束后,釋放未使用的內存,轉換到真正的根文件系統上面去,同時運行/sbin/init程序,
#?執行系統的1號進程。此后系統的控制權就全權交給/sbin/init進程了。
b.
4.系統初始化
一覽眾山小:
總結
以上是生活随笔為你收集整理的linux启动过程中内核拷贝,轻松识破linux内核启动过程中的“”套路“”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql字段是否存在_mysql判断列
- 下一篇: linux 其他常用命令