計(jì)算機(jī)那些事(2)——開(kāi)機(jī)啟動(dòng)過(guò)程

原文鏈接

首先用一張圖來(lái)大致了解一下計(jì)算機(jī)啟動(dòng)的整個(gè)過(guò)程。


image

上電

按下主機(jī)的電源鍵后虑啤,計(jì)算機(jī)開(kāi)始啟動(dòng)隙弛,主板上電后開(kāi)始初始化其固件(firmware)。固件是一些固化在芯片組上的程序狞山,它會(huì)試圖去啟動(dòng) CPU全闷。如果啟動(dòng)失敗(例如 CPU 壞了或沒(méi)插好)萍启,計(jì)算機(jī)就會(huì)死機(jī)并給出錯(cuò)誤提示(如某些版本的主板固件會(huì)發(fā)出蜂鳴警告)价脾。這種狀態(tài)稱為“zoombie-with-fans”恬总。

如果前一個(gè)階段未出錯(cuò),就開(kāi)始加電工作,在多 CPU 或多核 CPU 情況下陕靠,某一個(gè) CPU 會(huì)被隨機(jī)選取作為啟動(dòng) CPU(bootstrap processor瓢姻,BSP)運(yùn)行 BIOS 內(nèi)部的程序境蔼。其余的 CPU(application processor津畸,AP)保持停機(jī)直到操作系統(tǒng)內(nèi)核顯式地使用它們。

2000 年以前的計(jì)算機(jī)主板上均使用 BIOS堤结,如今絕大多數(shù)計(jì)算機(jī)采用的是 EFI(Mac 用的就是 EFI)或 UEFI唆迁,BIOS 正在逐步被淘汰鸭丛。基于 EFI唐责、UEFI 的開(kāi)機(jī)過(guò)程與傳統(tǒng)的BIOS不盡相同鳞溉,本文將以傳統(tǒng)的 BIOS,Intel CPU 為例介紹開(kāi)機(jī)過(guò)程鼠哥。

此時(shí) CPU 工作模式為實(shí)模式熟菲,該模式下地址總線是 20 位,尋址范圍是 0x00000~0xFFFFF 的 1M 范圍朴恳。這也就解釋了為什么 BIOS 的容量只有 1MB科盛。

Intel CPU 用三種運(yùn)行模式: 實(shí)模式、32 位保護(hù)模式菜皂、64 位保護(hù)模式。實(shí)模式: Intel 8086 的尋址方案厉萝,為了商業(yè)連續(xù)性恍飘,兼容了這古老的方案;保護(hù)模式: 采用了虛實(shí)地址轉(zhuǎn)換方案谴垫。

BIOS 啟動(dòng)之初章母,內(nèi)存是空的。此時(shí) CPU 處于實(shí)模式翩剪,內(nèi)存的地址映射均為硬連接的設(shè)備乳怎。內(nèi)存映射圖如下圖所示:


image

重置向量

CPU 啟動(dòng)后其大多數(shù)寄存器會(huì)被初始化為預(yù)定的值,包括指令寄存器(instruction pointer, EIP)前弯,它保存著 CPU 將要執(zhí)行指令的內(nèi)存地址蚪缀。此時(shí) CPU 會(huì)有一個(gè)特殊行為,其會(huì)對(duì) EIP 的初始值加上一個(gè)基址寄存器的值恕出,生成一個(gè) 32 位的地址 0xFFFFFFF0询枚。之所以稱為特殊行為,是因?yàn)閷?shí)模式下 CPU 只能尋址 1MB 地址空間浙巫,而這個(gè) 32 位地址已經(jīng)大于 1MB 的內(nèi)存限制金蜀。因此,0xFFFFFFF0 也被稱為重置向量(reset vector)的畴,參考上圖 0xFFFFFFF0 處的標(biāo)識(shí)渊抄。

于是,CPU 開(kāi)始執(zhí)行 0xFFFFFFF0 地址處的指令丧裁,該地址處是一條 JUMP 指令护桦,這條指令清空了基址寄存器的值,并讓指令跳回到 BIOS 開(kāi)始處(物理地址為 0xF0000煎娇,參考上圖 0xF0000 處的標(biāo)識(shí))以執(zhí)行 BIOS嘶炭。

BIOS 內(nèi)部可以分成兩個(gè)區(qū)塊: code block(普通程序)抱慌、boot block(引導(dǎo)程序)。上電后眨猎,boot block 會(huì)先被執(zhí)行抑进,它會(huì)檢查 code block 的代碼是否正確,如果正確睡陪,就會(huì)轉(zhuǎn)到 code block 繼續(xù)執(zhí)行下去寺渗。

BIOS 初始化

0xF0000 地址實(shí)際上是 BIOS 中的 boot block 的開(kāi)始處。在這個(gè)階段兰迫,會(huì)初始化部分硬件信殊。系統(tǒng)的 CPU、USB 只有部分被初始化汁果。

BIOS POST(加電自檢)

初始化完成后涡拘,CPU 跳轉(zhuǎn)到 0xA0000 地址處(參考上圖 640KB 處)進(jìn)行 BIOS 加電自檢(power on self test, POST)。這個(gè)過(guò)程會(huì)檢查計(jì)算機(jī)的各項(xiàng)組件据德,如 CPU鳄乏、顯卡、內(nèi)存棘利、鼠標(biāo)橱野、鍵盤(pán)等。如果找不到內(nèi)存或者鍵盤(pán)都有可能讓BIOS停止工作并且打印一些相關(guān)的錯(cuò)誤信息善玫,如果找不到顯卡 BIOS 會(huì)發(fā)出蜂鳴警告(因?yàn)闊o(wú)法顯示畫(huà)面)
當(dāng) CPU 執(zhí)行到 0xC0000 地址處(參考上圖 768KB 處)水援,開(kāi)始尋找其他設(shè)備的 ROM,如果找到任何其他設(shè)備的 BIOS茅郎,它們也會(huì)被執(zhí)行蜗元。
下一步,顯卡就會(huì)顯示 BIOS 界面系冗,并進(jìn)行更深入的檢查许帐。

BIOS 記錄系統(tǒng)設(shè)定值

檢查完成后,BIOS 會(huì)根據(jù)自己的“系統(tǒng)資源表”毕谴,對(duì)系統(tǒng)進(jìn)行進(jìn)一步確認(rèn)成畦,從而確定計(jì)算機(jī)配有哪些資源或設(shè)備。例如 BIOS 支持隨插即用涝开,它會(huì)檢測(cè)并配置隨插即用設(shè)備循帐。
然后 BIOS 會(huì)遵循高級(jí)配置電源接口(Advanced Configuration Power Interface,ACPI)在內(nèi)存中設(shè)置好一系列的數(shù)據(jù)來(lái)描述硬件信息舀武,以便被操作系統(tǒng)內(nèi)核利用拄养。

搜索 MBR

到這一步,BIOS 開(kāi)始嘗試加載操作系統(tǒng)。它會(huì)從硬盤(pán)瘪匿,光驅(qū)跛梗,軟驅(qū),網(wǎng)絡(luò)等幾個(gè)地方依次尋找操作系統(tǒng)(用戶可以在 BIOS 設(shè)定中修改查找的優(yōu)先級(jí))棋弥。如果找不到操作系統(tǒng)核偿,BIOS 會(huì)停機(jī)并給出錯(cuò)誤信息。

假設(shè)在硬盤(pán)上找到了操作系統(tǒng)顽染,它會(huì)首先讀取硬盤(pán)上的大小為 512 Bytes 的 0號(hào)扇區(qū)漾岳,這個(gè)扇區(qū)被稱為 主引導(dǎo)記錄(master boot record,MBR)粉寞,其包含三部分:

  1. 引導(dǎo)程序(Boot Loader)
  2. 硬盤(pán)分區(qū)表(Partition Table)
  3. 結(jié)束標(biāo)志字

BIOS 讀完磁盤(pán)上的 MBR 之后會(huì)把它拷貝到內(nèi)存 0x7C00 地址處尼荆,然后 CPU 跳轉(zhuǎn)到該內(nèi)存地址執(zhí)行 MBR 里的指令。事實(shí)上唧垦,被復(fù)制到物理內(nèi)存的內(nèi)容就是 Boot Loader捅儒。常見(jiàn)的 Boot Loader 有 grub、lilo振亮、spfdisk巧还。下圖可以幫助大家理解 MBR 的結(jié)構(gòu)。

image

關(guān)于磁盤(pán)双炕、分區(qū)表等基礎(chǔ)知識(shí),可參見(jiàn) 計(jì)算機(jī)那些事(1)——磁盤(pán)撮抓。

Boot Loader 執(zhí)行

以常見(jiàn)的 Linux Boot Loader —— grub 為例妇斤。

Grub 加載后首先進(jìn)行 內(nèi)存盤(pán)初始化。Boot Loader 會(huì)將存儲(chǔ)介質(zhì)中的 initrd 文件加載到內(nèi)存丹拯,內(nèi)核啟動(dòng)時(shí)會(huì)在訪問(wèn)真正的根文件系統(tǒng)之前先訪問(wèn)內(nèi)存中的 initrd 文件系統(tǒng)站超。

關(guān)于 initrd
Linux 內(nèi)核需要適應(yīng)多種不同的硬件架構(gòu),但是將所有的硬件驅(qū)動(dòng)編入內(nèi)核是不切實(shí)際的乖酬,而且內(nèi)核也不可能每新出一種硬件結(jié)構(gòu)死相,就將該硬件的設(shè)備驅(qū)動(dòng)寫(xiě)入內(nèi)核。實(shí)際上咬像,Linux 的內(nèi)核鏡像僅包含了基本的硬件驅(qū)動(dòng)算撮,在系統(tǒng)安裝過(guò)程中檢測(cè)系統(tǒng)的硬件信息,根據(jù)安裝信息和系統(tǒng)硬件信息將一部分設(shè)備驅(qū)動(dòng)寫(xiě)入 initrd(bootloader initialized RAM disk县昂。

內(nèi)存盤(pán)初始化完畢之后肮柜, grub 會(huì)根據(jù)配置文件 /boot/grub/grub.cfg 設(shè)定的內(nèi)核鏡像 vmlinuz 所在的路徑,加載內(nèi)核鏡像倒彰,并進(jìn)行解壓縮操作审洞。此時(shí),屏幕一般會(huì)出現(xiàn) “Uncompressing Linux” 的提示待讳。當(dāng)解壓縮內(nèi)核完成后芒澜,屏幕一般會(huì)輸出 “OK, booting the kernel”仰剿。

內(nèi)核加載至內(nèi)存完成后,grub 將控制權(quán)轉(zhuǎn)交給內(nèi)核痴晦。

內(nèi)核啟動(dòng)

在 Boot Loader 配置了 initrd 的情況下南吮,內(nèi)核啟動(dòng)被分成了兩個(gè)階段:

  1. 執(zhí)行 initrd 的文件系統(tǒng)中的 init 腳本。此階段阅酪,內(nèi)核會(huì)將控制權(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 以只讀的方式掛載。這一步完成后辉词,釋放未使用的內(nèi)存必孤,并轉(zhuǎn)換到真正的根文件系統(tǒng)中,進(jìn)行第 2 階段的處理瑞躺。
  2. 執(zhí)行真正的根文件系統(tǒng)中的 /sbin/init 進(jìn)程敷搪,即系統(tǒng)的 1 號(hào)進(jìn)程。此后幢哨,系統(tǒng)的控制權(quán)就全權(quán)交給 /sbin/init 進(jìn)程了赡勘。

系統(tǒng)初始化

/sbin/init 進(jìn)程是系統(tǒng)其它所有進(jìn)程的父進(jìn)程,當(dāng)它接管了系統(tǒng)控制權(quán)后捞镰,它會(huì)根據(jù) /etc/inittab 文件來(lái)執(zhí)行相應(yīng)的腳本闸与,從而完成一系列的系統(tǒng)初始化操作。主要包括以下步驟:

  1. 設(shè)置運(yùn)行等級(jí)岸售。Linux 有運(yùn)行等級(jí)如下:
    • 0:關(guān)機(jī)
    • 1:?jiǎn)斡脩裟J?/li>
    • 2:無(wú)網(wǎng)絡(luò)支持的多用戶模式
    • 3:有網(wǎng)絡(luò)支持的多用戶模式
    • 4:保留践樱,未使用
    • 5:有網(wǎng)絡(luò)支持、有 X-Window 支持的多用戶模式
    • 6:重新引導(dǎo)系統(tǒng)凸丸,即重啟
  2. 執(zhí)行 rc.sysinit拷邢。運(yùn)行等級(jí)設(shè)置完成后,Linux 系統(tǒng)執(zhí)行的第一個(gè)用戶層文件是 /etc/rc.d/rc.sysinit 腳本程序屎慢,其完成的初始化操作主要包括:設(shè)置 PATH瞭稼、設(shè)置網(wǎng)絡(luò)配置/etc/sysconfig/network、啟動(dòng) swap 分區(qū)腻惠、設(shè)置 /proc 等弛姜。
  3. 執(zhí)行不同運(yùn)行級(jí)別的腳本程序。根據(jù)運(yùn)行級(jí)別的不同妖枚,系統(tǒng)會(huì)運(yùn)行 rc0.d ~ rc6.d 中對(duì)應(yīng)的腳本廷臼,從而完成對(duì)應(yīng)的初始化工作,啟動(dòng)對(duì)應(yīng)的服務(wù)。
  4. 執(zhí)行 /etc/rc.d/rc.local荠商。rc.local 是 Linux 運(yùn)行用戶進(jìn)行個(gè)性化設(shè)置的腳本寂恬。
  5. 執(zhí)行 /bin/login。進(jìn)入登錄狀態(tài)莱没。此時(shí)初肉,系統(tǒng)已經(jīng)進(jìn)入到等待用戶輸入 usernamepassword 的階段。

參考

  1. How Computers Boot Up
  2. 即將換掉傳統(tǒng)BIOS的UEFI
  3. Linux啟動(dòng)過(guò)程詳解-《別怕Linux編程》之八
  4. 《Linux 系統(tǒng)架構(gòu)與目錄解析》
  5. INITRD 詳解
  6. inux中init.d文件夾的說(shuō)明
  7. Linux啟動(dòng)過(guò)程分析與優(yōu)化饰躲,浙江大學(xué)碩士畢業(yè)論文
  8. 深入理解linux啟動(dòng)過(guò)程

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牙咏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嘹裂,更是在濱河造成了極大的恐慌妄壶,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寄狼,死亡現(xiàn)場(chǎng)離奇詭異丁寄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)泊愧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)伊磺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人删咱,你說(shuō)我怎么就攤上這事屑埋。” “怎么了痰滋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵摘能,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我即寡,道長(zhǎng)徊哑,這世上最難降的妖魔是什么袜刷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任聪富,我火速辦了婚禮,結(jié)果婚禮上著蟹,老公的妹妹穿的比我還像新娘墩蔓。我一直安慰自己,他們只是感情好萧豆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布奸披。 她就那樣靜靜地躺著,像睡著了一般涮雷。 火紅的嫁衣襯著肌膚如雪阵面。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音样刷,去河邊找鬼仑扑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛置鼻,可吹牛的內(nèi)容都是我干的镇饮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼箕母,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼储藐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嘶是,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钙勃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后俊啼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肺缕,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年授帕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了同木。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跛十,死狀恐怖彤路,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芥映,我是刑警寧澤洲尊,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站奈偏,受9級(jí)特大地震影響坞嘀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惊来,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一丽涩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裁蚁,春花似錦矢渊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至室谚,卻和暖如春毡鉴,著一層夾襖步出監(jiān)牢的瞬間崔泵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工猪瞬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留管削,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓撑螺,卻偏偏與公主長(zhǎng)得像含思,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甘晤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容