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