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