Linux 系統(tǒng)開機(jī)加電后發(fā)生了什么?
linux系統(tǒng)的啟動(dòng)流程
關(guān)于linux系統(tǒng)的啟動(dòng)流程我們可以按步進(jìn)行劃分為如下:
BIOS
- POST自檢
- BIOS(Boot Sequence)
引導(dǎo)操作系統(tǒng)
- 加載對(duì)應(yīng)引導(dǎo)上的MBR(bootloader)
- 主引導(dǎo)設(shè)置加載其BootLoader
加載操作系統(tǒng)
啟動(dòng)BIOS,準(zhǔn)備實(shí)模式下的中斷向量表和中斷服務(wù)程序
電腦啟動(dòng)后,CPU邏輯電路被設(shè)計(jì)為只能運(yùn)行內(nèi)存中的程序,沒有能力直接運(yùn)行存在于軟盤或硬盤中的操作系統(tǒng),如果想要運(yùn)行,必須要加載到內(nèi)存(RAM)中。
BIOS是如何啟動(dòng)的,CPU硬件邏輯設(shè)計(jì)為在加電瞬間強(qiáng)行將CS值置為0XF000,IP為0XFFF0,這樣CS:IP就指向0XFFFF0這個(gè)位置,這個(gè)位置正是BIOS程序的入口地址。
BIOS程序被固化在計(jì)算機(jī)主機(jī)板上的一塊很小的ROM芯片里。現(xiàn)在CS:IP已經(jīng)指向了0XFFFF0這個(gè)位置,意味著BIOS開始啟動(dòng)。
POST自檢
BIOS的第一步動(dòng)作就是進(jìn)行 上電自檢(POST)
POST的工作是檢查硬件設(shè)備。隨著BIOS程序的執(zhí)行,屏幕上會(huì)顯示顯卡的信息,內(nèi)存的信息等,
初始化設(shè)備
BIOS的第二步動(dòng)作就是 枚舉本地設(shè)備并初始化
有一項(xiàng)對(duì)啟動(dòng)操作系統(tǒng)至關(guān)重要的工作,那就是BIOS在內(nèi)存中建立中斷向量表和中斷服務(wù)程序
BIOS程序在內(nèi)存最開始的位置(0x00000)用1KB的內(nèi)存空間(0x00000~0x003FF)構(gòu)建中斷向量表,在緊挨著它的位置用256KB的內(nèi)存空間構(gòu)建BIOS數(shù)據(jù)區(qū)(0x00400~0x004FF),并在大約57KB以后的位置(0x0e05b)加載了8KB左右的與中斷向量表相應(yīng)的若干中斷服務(wù)程序。
中斷向量表有256個(gè)中斷向量,每個(gè)中斷向量占4個(gè)字節(jié),其中兩個(gè)字節(jié)是CS值,兩個(gè)字節(jié)是IP值。每個(gè)中斷向量都指向一個(gè)具體的中斷服務(wù)程序。
BIOS-runtime服務(wù)按照boot啟動(dòng)順序搜索設(shè)備,尋找BBR
由于BIOS功能使用上的不同,它由兩個(gè)部分組成:POST和runtime服務(wù)。POST完成后,它將從存儲(chǔ)器中被清除,但是BIOS runtime服務(wù)會(huì)被保留,用于目標(biāo)操作系統(tǒng)。
為了啟動(dòng)操作系統(tǒng),BIOS的runtime服務(wù)將搜索那些激活狀態(tài)的或是可引導(dǎo)啟動(dòng)的設(shè)備,搜索的順序則由CMOS設(shè)置決定(也就是我們平時(shí)所謂的在BIOS中設(shè)置的啟動(dòng)順序)。一個(gè)軟驅(qū),一臺(tái)光驅(qū),一個(gè)硬盤上的分區(qū),網(wǎng)絡(luò)上的設(shè)備甚至一個(gè)usb 閃存盤都可以作為一個(gè)啟動(dòng)設(shè)備。
當(dāng)然,linux通常是從硬盤啟動(dòng)的。硬盤上的MBR(主啟動(dòng)記錄)包含有基本的boot loader,它是一個(gè)512字節(jié)大小的扇區(qū),位于磁盤的第一個(gè)扇區(qū)(0磁頭0磁道1扇區(qū))。當(dāng)MBR被裝載到RAM中后,BIOS就會(huì)將控制權(quán)轉(zhuǎn)交給MBR。
引導(dǎo)操作系統(tǒng)內(nèi)核并為保護(hù)模式做準(zhǔn)備
位于MBR中的主 boot loader 是一個(gè)512字節(jié)的鏡像,其中不僅包含了 bootload 程序代碼,還包含了一個(gè)小的分區(qū)表。
最初的446字節(jié)是主 boot loader,它里面就包含有可執(zhí)行代碼以及錯(cuò)誤消息文本。接下來的64字節(jié)是分區(qū)表,其中包含有四個(gè)分區(qū)的各自的記錄(一個(gè)分區(qū)占16字節(jié))。MBR 通過特殊數(shù)字 0xAA55(譯者注:在電子界中 AA55 確實(shí)是具有傳奇色彩的數(shù)字,想知道為什么么?將它展開成二進(jìn)制形式,看看有什么規(guī)律)作為兩個(gè)字節(jié)的結(jié)束標(biāo)志。0x55AA 同時(shí)也是 MBR 有效的校驗(yàn)確認(rèn)。
首先對(duì)CPU發(fā)送 int 0x19 中斷,使CPU運(yùn)行 int 0x19 中斷對(duì)應(yīng)的中斷服務(wù)程序,這個(gè)中斷服務(wù)程序的作用就是把軟盤第一個(gè)扇區(qū)的程序加載到內(nèi)存的指定位置。
主 boot loader 的工作是尋找并加載次 boot loader(內(nèi)核加載程序)
它通過分析分區(qū)表,找出激活分區(qū)來完成這個(gè)任務(wù),當(dāng)它找到一個(gè)激活分區(qū)時(shí),它將繼續(xù)掃描剩下的分區(qū)表中的分區(qū),以便確認(rèn)他們都是未激活的。
確認(rèn)完畢后,激活分區(qū)的啟動(dòng)記錄(次 boot loader)從設(shè)備中被讀到 RAM,并被執(zhí)行。
其中加載過程需要借助 BIOS 提供的int 0x13中斷向量指向的中斷服務(wù)程序來完成。該程序?qū)④洷P第二個(gè)扇區(qū)開始的4個(gè)扇區(qū),即 setup.s 對(duì)應(yīng)的程序加載至內(nèi)存的 SETUPSEG(0x90200)處。
把第一階段和第二階段的 boot loaders 聯(lián)合起來,就是在x86個(gè)人電腦中,我們所說的 linux loader(LILO)或者 GRand Unified Bootloader(GRUB)。由于 GRUB 修正了一些 LILO 中存在的缺陷,因此下面就讓我們來看看 GRUB(如果你希望得到更多的關(guān)于 GRUB,LILO 和與之相關(guān)話題的討論資源,請(qǐng)見文后的參考資料)
對(duì)于 GRUB 來說,一個(gè)比較好的方面就是它包含了 linux 文件系統(tǒng)的知識(shí)。與LILO使用裸扇區(qū)不同的是,GRUB 能夠從 ext2 或者 ext3 文件系統(tǒng)中加載 linux 內(nèi)核。它是通過將本來兩階段的 boot loader 轉(zhuǎn)換成三個(gè)階段的 boot loader。在第一階段(MBR)中會(huì)啟動(dòng) stage1.5 的 boot loader 來理解 linux 內(nèi)核鏡像中的特殊的文件系統(tǒng)格式,例如,reiserfs_stage1-5(用于從reiserf日志文件系統(tǒng)中進(jìn)行加載)或 e2fs + stage1_5 (用于從wxt2或ext3文件系統(tǒng)進(jìn)行加載)。當(dāng) stage1.5 的 boot loader 被加載并運(yùn)行時(shí),stage2 的 boot loader 才能被加載。當(dāng) stage2 被加載時(shí),GRUB能根據(jù)請(qǐng)求的情況顯示一個(gè)可選內(nèi)核的清單(在 /etc/grub.conf 中進(jìn)行定義,同時(shí)還有幾個(gè)軟符號(hào)鏈接 /etc/grub/menu.lst 和 /etc/grub.conf)。你可以選擇一個(gè)內(nèi)核,修改其附加的內(nèi)核參數(shù)。同時(shí),你可以選擇使用命令行的shell來對(duì)啟動(dòng)過程進(jìn)行更深層次的手工控制。
在次 boot loader 存在與內(nèi)存中后,就可以對(duì)文件系統(tǒng)進(jìn)行查詢了,同時(shí)將默認(rèn)的內(nèi)核鏡像以及初始化內(nèi)存盤鏡像也被加載到內(nèi)存中。
一切準(zhǔn)備完畢之后,次 boot loader 就會(huì)調(diào)用內(nèi)核鏡像,完成操作系統(tǒng)的加載。
加載內(nèi)核并從實(shí)模式轉(zhuǎn)換為保護(hù)模式
當(dāng)內(nèi)核映像被加載到內(nèi)存中(加載過程仍然用int 0x13中斷向量),并且次引導(dǎo)加載程序釋放控制權(quán)之后,內(nèi)核階段就開始了。
加載內(nèi)核鏡像
內(nèi)核映像并不是一個(gè)可執(zhí)行的內(nèi)核,而是一個(gè)壓縮過的內(nèi)核映像。通常它是一個(gè) zImage(壓縮映像,小于 512KB)或一個(gè) bzImage(較大的壓縮映像,大于 512KB),它是提前使用 zlib 進(jìn)行壓縮過的。在這個(gè)內(nèi)核映像前面是一個(gè)例程,它實(shí)現(xiàn)少量硬件設(shè)置,并對(duì)內(nèi)核映像中包含的內(nèi)核進(jìn)行解壓,然后將其放入高端內(nèi)存中,如果有初始 RAM 磁盤映像,就會(huì)將它移動(dòng)到內(nèi)存中,并標(biāo)明以后使用。然后該例程會(huì)調(diào)用內(nèi)核,并開始啟動(dòng)內(nèi)核引導(dǎo)的過程。
當(dāng) bzImage(用于 i386 映像)被調(diào)用時(shí),我們從 ./arch/i386/boot/head.S 的 start 匯編例程開始執(zhí)行。
這個(gè)例程會(huì)執(zhí)行一些基本的硬件設(shè)置,并調(diào)用 ./arch/i386/boot/compressed/head.S 中的 startup_32,設(shè)置一個(gè)基本的環(huán)境(堆棧等),并清除 Block Started by Symbol(BSS)。然后調(diào)用一個(gè)叫做 decompress_kernel 的 C 函數(shù)(在 ./arch/i386/boot/compressed/misc.c 中)來解壓內(nèi)核。當(dāng)內(nèi)核被解壓到內(nèi)存中之后,就可以調(diào)用它了。這是另外一個(gè) startup_32 函數(shù),但是這個(gè)函數(shù)在 ./arch/i386/kernel/head.S 中。
進(jìn)入保護(hù)模式并初始化
- 進(jìn)入保護(hù)模式
- 設(shè)置中斷描述附表和全局描述符表
- 創(chuàng)建了內(nèi)存分頁(yè)機(jī)制
啟動(dòng)內(nèi)核
- start_kernel啟動(dòng)內(nèi)核
- 創(chuàng)建init進(jìn)程
BIOS階段–準(zhǔn)備實(shí)模式下的中斷向量表和中斷服務(wù)程序
BIOS是什么
上個(gè)世紀(jì)70年代初,”只讀內(nèi)存”(read-only memory,縮寫為ROM)發(fā)明,開機(jī)程序被刷入ROM芯片,計(jì)算機(jī)通電后,第一件事就是讀取它。計(jì)算機(jī),啟動(dòng)這塊芯片里的程序叫做”基本輸出輸入系統(tǒng)”(Basic Input/Output System),簡(jiǎn)稱為BIOS。
它是一組固化到計(jì)算機(jī)內(nèi)主板上一個(gè)ROM芯片上的程序,它保存著計(jì)算機(jī)最重要的基本輸入輸出的程序、開機(jī)后自檢程序和系統(tǒng)自啟動(dòng)程序,它可從CMOS中讀寫系統(tǒng)設(shè)置的具體信息。其主要功能是為計(jì)算機(jī)提供最底層的、最直接的硬件設(shè)置和控制。
BIOS存儲(chǔ)的信息
BIOS芯片中主要存放:
- 自診斷程序:通過讀取CMOSRAM中的內(nèi)容識(shí)別硬件配置,并對(duì)其進(jìn)行自檢和初始化;
- CMOS設(shè)置程序:引導(dǎo)過程中,用特殊熱鍵啟動(dòng),進(jìn)行設(shè)置后,存入CMOS RAM中;
- 系統(tǒng)自舉裝載程序:在自檢成功后將磁盤相對(duì)0道0扇區(qū)上的引導(dǎo)程序裝入內(nèi)存,讓其運(yùn)行以裝入DOS系統(tǒng);
- 主要I/O設(shè)備的驅(qū)動(dòng)程序和中斷服務(wù):由于BIOS直接和系統(tǒng)硬件資源打交道,因此總是針對(duì)某一類型的硬件系統(tǒng),而各種硬件系統(tǒng)又各有不同,所以存在各種不同種類的BIOS,隨著硬件技術(shù)的發(fā)展,同一種BIOS也先后出現(xiàn)了不同的版本,新版本的BIOS比起老版本來說,功能更強(qiáng)。
BIOS:計(jì)算機(jī)加電自檢完成后第一個(gè)讀取的地方就是就是BIOS(Basic Input Output System,基礎(chǔ)輸入輸出系統(tǒng)),BIOS里面記錄了主機(jī)板的芯片集與相關(guān)設(shè)置,如CPU與接口設(shè)備的通信頻率、啟動(dòng)設(shè)備的搜索順序、硬盤的信息、系統(tǒng)時(shí)間、內(nèi)存信息、時(shí)鐘信息、PnP特性、外部總線、各種接口設(shè)備的I/O地址、已經(jīng)與CPU通信的IRQ中斷信息,所以,啟動(dòng)如果要順利啟動(dòng),首先要讀取BIOS設(shè)置。
計(jì)算機(jī)會(huì)首先加載BIOS信息,BIOS信息是如此的重要,以至于計(jì)算機(jī)必須在最開始就找到它。
電腦啟動(dòng)后,CPU邏輯電路被設(shè)計(jì)為只能運(yùn)行內(nèi)存中的程序,沒有能力直接運(yùn)行存在于軟盤或硬盤中的操作系統(tǒng),如果想要運(yùn)行,必須要加載到內(nèi)存(RAM)中。
BIOS是如何啟動(dòng)的
CPU硬件邏輯設(shè)計(jì)為在加電瞬間強(qiáng)行將CS值置為0XF000,IP為0XFFF0,這樣CS:IP就指向0XFFFF0這個(gè)位置,這個(gè)位置正是BIOS程序的入口地址。
BIOS需要在內(nèi)存中加載中斷向量表和中斷服務(wù)程序
BIOS程序被固化在計(jì)算機(jī)主機(jī)板上的一塊很小的ROM芯片里。現(xiàn)在CS:IP已經(jīng)指向了0XFFFF0這個(gè)位置,意味著BIOS開始啟動(dòng)。隨著BIOS程序的執(zhí)行,屏幕上會(huì)顯示顯卡的信息,內(nèi)存的信息,說明BIOS程序在檢測(cè)顯卡,內(nèi)存,這個(gè)就是POST開機(jī)自檢期間,有一項(xiàng)對(duì)啟動(dòng)操作系統(tǒng)至關(guān)重要的工作,那就是BIOS在內(nèi)存中建立中斷向量表和中斷服務(wù)程序
BIOS程序在內(nèi)存最開始的位置(0x00000)用1KB的內(nèi)存空間(0x00000~0x003FF)構(gòu)建中斷向量表,在緊挨著它的位置用256KB的內(nèi)存空間構(gòu)建BIOS數(shù)據(jù)區(qū)(0x00400~0x004FF),并在大約57KB以后得位置(0x0e05b)加載了8KB左右的與中斷向量表相應(yīng)的若干中斷服務(wù)程序。
中斷向量表有256個(gè)中斷向量,每個(gè)中斷向量占4個(gè)字節(jié),其中兩個(gè)字節(jié)是CS值,兩個(gè)字節(jié)是IP值。每個(gè)中斷向量都指向一個(gè)具體的中斷服務(wù)程序。
BIOS階段的工作
POST開機(jī)自檢
BIOS程序首先檢查,計(jì)算機(jī)硬件能否滿足運(yùn)行的基本條件,這叫做”硬件自檢”(Power-On Self-Test),縮寫為POST。
如果硬件出現(xiàn)問題,主板會(huì)發(fā)出不同含義的蜂鳴,啟動(dòng)中止。如果沒有問題,屏幕就會(huì)顯示出CPU、內(nèi)存、硬盤等信息。
電腦主機(jī)打開電源的時(shí)候,隨后會(huì)聽到滴的一聲,系統(tǒng)啟動(dòng)開始了開機(jī)自檢(POST-power on self test)自檢開始)
這個(gè)過程中主要是檢測(cè)計(jì)算機(jī)硬件設(shè)備比如:CPU,內(nèi)存,主板,顯卡,CMOS等設(shè)備是否有故障存在
如果有硬件故障的話將按兩種情況理:
- 對(duì)于嚴(yán)重故障(致命性故障)則停機(jī),此時(shí)由于各種初始化操作還沒完成,不能給出任何提示或信號(hào);
- 對(duì)于非嚴(yán)重故障則給出提示或聲音報(bào)警信號(hào),等待用戶處理),如果沒有故障,POST完整自己的接力任務(wù),將尾部工作交接給BIOS處理
加載BIOS
BIOS把控制權(quán)轉(zhuǎn)交給下一階段的啟動(dòng)程序。
這時(shí),BIOS需要知道,”下一階段的啟動(dòng)程序”具體存放在哪一個(gè)設(shè)備。也就是說,BIOS需要有一個(gè)外部?jī)?chǔ)存設(shè)備的排序,排在前面的設(shè)備就是優(yōu)先轉(zhuǎn)交控制權(quán)的設(shè)備。這種排序叫做”啟動(dòng)順序”(Boot Sequence)。打開BIOS的操作界面,里面有一項(xiàng)就是”設(shè)定啟動(dòng)順序”。
在此之后,計(jì)算機(jī)心里就有譜了,知道應(yīng)該去讀取哪個(gè)硬件設(shè)備了。
引導(dǎo)操作系統(tǒng)
硬件自檢完成后,我們期望能否啟動(dòng)操作系統(tǒng),但是問題出來了
- 操作系統(tǒng)存放在哪?
- BIOS如何找到操作系統(tǒng)?
- BIOS如何加載操作系統(tǒng)?
背景知識(shí)
多操作系統(tǒng)時(shí)的啟動(dòng)順序
為了尋找操作系統(tǒng),BIOS按照”啟動(dòng)順序”,把控制權(quán)轉(zhuǎn)交給排在第一位的儲(chǔ)存設(shè)備。
這時(shí),計(jì)算機(jī)讀取該設(shè)備的第一個(gè)扇區(qū),也就是讀取最前面的512個(gè)字節(jié)。
如果這512個(gè)字節(jié)的最后兩個(gè)字節(jié)是0x55和0xAA,表明這個(gè)設(shè)備可以用于啟動(dòng);
如果不是,表明設(shè)備不能用于啟動(dòng),控制權(quán)于是被轉(zhuǎn)交給”啟動(dòng)順序”中的下一個(gè)設(shè)備。
這最前面的512個(gè)字節(jié),就叫做主引導(dǎo)記錄(Master boot record,縮寫為MBR)
主引導(dǎo)記錄 MBR
位于MBR中的主boot loader是一個(gè)512字節(jié)的鏡像,其中不僅包含了程序代碼,還包含了一個(gè)小的分區(qū)表。
最初的446字節(jié)是主boot loader,它里面就包含有可執(zhí)行代碼以及錯(cuò)誤消息文本。接下來的64字節(jié)是分區(qū)表,其中包含有四個(gè)分區(qū)的各自的記錄(一個(gè)分區(qū)占16字節(jié))。MBR通過特殊數(shù)字0xAA55(譯者注:在電子界中AA55確實(shí)是具有傳奇色彩的數(shù)字,想知道為什么么?將它展開成二進(jìn)制形式,看看有什么規(guī)律)作為兩個(gè)字節(jié)的結(jié)束標(biāo)志。0x55AA同時(shí)也是MBR有效的校驗(yàn)確認(rèn)。
主boot loader的工作是尋找并加載次boot loader。它通過分析分區(qū)表,找出激活分區(qū)來完成這個(gè)任務(wù),當(dāng)它找到一個(gè)激活分區(qū)時(shí),它將繼續(xù)掃描剩下的分區(qū)表中的分區(qū),以便確認(rèn)他們都是未激活的。確認(rèn)完畢后,激活分區(qū)的啟動(dòng)記錄從設(shè)備中被讀到RAM,并被執(zhí)行。
“主引導(dǎo)記錄”只有512個(gè)字節(jié),放不了太多東西。它的主要作用是,告訴計(jì)算機(jī)到硬盤的哪一個(gè)位置去找操作系統(tǒng)。主引導(dǎo)記錄由三個(gè)部分組成:
- 第1-446字節(jié):調(diào)用操作系統(tǒng)的機(jī)器碼。
- 第447-510字節(jié):分區(qū)表(Partition table)。
- 第511-512字節(jié):主引導(dǎo)記錄簽名(0x55和0xAA)。
其中,第二部分”分區(qū)表”的作用,是將硬盤分成若干個(gè)區(qū)。
分區(qū)表
硬盤分區(qū)有很多好處。考慮到每個(gè)區(qū)可以安裝不同的操作系統(tǒng),”主引導(dǎo)記錄”因此必須知道將控制權(quán)轉(zhuǎn)交給哪個(gè)區(qū)。分區(qū)表的長(zhǎng)度只有64個(gè)字節(jié),里面又分成四項(xiàng),每項(xiàng)16個(gè)字節(jié)。所以,一個(gè)硬盤最多只能分四個(gè)一級(jí)分區(qū),又叫做“主分區(qū)”。
每個(gè)主分區(qū)的16個(gè)字節(jié),由6個(gè)部分組成:
- 第1個(gè)字節(jié):如果為0x80,就表示該主分區(qū)是激活分區(qū),控制權(quán)要轉(zhuǎn)交給這個(gè)分區(qū)。四個(gè)主分區(qū)里面只能有一個(gè)是激活的。
- 第2-4個(gè)字節(jié):主分區(qū)第一個(gè)扇區(qū)的物理位置(柱面、磁頭、扇區(qū)號(hào)等等)。
- 第5個(gè)字節(jié):主分區(qū)類型。
- 第6-8個(gè)字節(jié):主分區(qū)最后一個(gè)扇區(qū)的物理位置。
- 第9-12字節(jié):該主分區(qū)第一個(gè)扇區(qū)的邏輯地址。
- 第13-16字節(jié):主分區(qū)的扇區(qū)總數(shù)。
最后的四個(gè)字節(jié)(”主分區(qū)的扇區(qū)總數(shù)”),決定了這個(gè)主分區(qū)的長(zhǎng)度。也就是說,一個(gè)主分區(qū)的扇區(qū)總數(shù)最多不超過2的32次方。
如果每個(gè)扇區(qū)為512個(gè)字節(jié),就意味著單個(gè)分區(qū)最大不超過2TB。再考慮到扇區(qū)的邏輯地址也是32位,所以單個(gè)硬盤可利用的空間最大也不超過2TB。
如果想使用更大的硬盤,只有2個(gè)方法:
- 一是提高每個(gè)扇區(qū)的字節(jié)數(shù),
- 二是增加扇區(qū)總數(shù)。
MBR:第一個(gè)可開機(jī)設(shè)備的第一個(gè)扇區(qū)內(nèi)的主引導(dǎo)分區(qū)塊,內(nèi)包含引導(dǎo)加載程序
引導(dǎo)加載程序(Boot loader): 一支可讀取內(nèi)核文件來執(zhí)行的軟件
內(nèi)核文件:開始操作系統(tǒng)的功能
引導(dǎo)操作系統(tǒng)的過程
由硬盤啟動(dòng)時(shí),BIOS通常是轉(zhuǎn)向第一塊硬盤的第一個(gè)扇區(qū),即主引導(dǎo)記錄(MBR)。裝載GRUB和操作系統(tǒng)的過程,包括以下幾個(gè)操作步驟:
裝載記錄
基本引導(dǎo)裝載程序所做的唯一的事情就是裝載第二引導(dǎo)裝載程序。
裝載Grub
這第二引導(dǎo)裝載程序?qū)嶋H上是引出更高級(jí)的功能,以允許用戶裝載一個(gè)特定的操作系統(tǒng)。
裝載系統(tǒng)
如linux內(nèi)核。GRUB把機(jī)器的控制權(quán)移交給操作系統(tǒng)。
不同的是,微軟操作系統(tǒng)都是使用一種稱為鏈?zhǔn)窖b載的引導(dǎo)方法來啟動(dòng)的,主引導(dǎo)記錄僅僅是簡(jiǎn)單地指向操作系統(tǒng)所在分區(qū)的第一個(gè)扇區(qū)。
加載主引導(dǎo)加載程序-基本裝載程序
眾所周知,硬盤上第0磁道第一個(gè)扇區(qū)被稱為MBR,也就是Master Boot Record,即主引導(dǎo)記錄,它的大小是512字節(jié),別看地方不大,可里面卻存放了預(yù)啟動(dòng)信息、分區(qū)表信息。
按照BIOS所設(shè)定的系統(tǒng)啟動(dòng)流程,如果檢測(cè)通過,則根據(jù)引導(dǎo)次序(Boot Sequence)開始在第一臺(tái)設(shè)備上支持啟動(dòng)程序,我們的啟動(dòng)設(shè)備主要包括硬盤、USB、SD等,我們一般用的是硬盤,然后進(jìn)行讀取第一個(gè)設(shè)備就是硬盤,第一個(gè)要讀去的就是該硬盤的主引導(dǎo)記錄MBR(Master Boot Record),然后系統(tǒng)可以根據(jù)啟動(dòng)區(qū)安裝的引導(dǎo)加載程序(Boot Loader)開始執(zhí)行核心識(shí)別的工作。
MBR程序只是找到只是硬盤分區(qū)內(nèi)最前面的446個(gè)字節(jié)的Boot Loader,然后查找相關(guān)配置和定義。
然后將控制權(quán)交給主引導(dǎo)代碼。主引導(dǎo)代碼的任務(wù)包括
- 掃描分區(qū)表,找到一個(gè)激活(可引導(dǎo))分區(qū);
- 找到激活分區(qū)的起始扇區(qū);
- 將激活分區(qū)的引導(dǎo)扇區(qū)裝載到內(nèi)存7C00處;
- 將控制權(quán)交給引導(dǎo)扇區(qū)代碼;
加載次引導(dǎo)記載程序–高級(jí)裝載程序bootload如GRUB
系統(tǒng)讀取內(nèi)存中的grub配置信息(一般為menu.lst或grub.lst),并依照此配置信息來啟動(dòng)不同的操作系統(tǒng)。
這時(shí),計(jì)算機(jī)的控制權(quán)就要轉(zhuǎn)交給硬盤的某個(gè)分區(qū)了,這里又分成三種情況。
情況A:卷引導(dǎo)記錄
上一節(jié)提到,四個(gè)主分區(qū)里面,只有一個(gè)是激活的。計(jì)算機(jī)會(huì)讀取激活分區(qū)的第一個(gè)扇區(qū),叫做“卷引導(dǎo)記錄”(Volume boot record,縮寫為VBR)。“卷引導(dǎo)記錄”的主要作用是,告訴計(jì)算機(jī),操作系統(tǒng)在這個(gè)分區(qū)里的位置。然后,計(jì)算機(jī)就會(huì)加載操作系統(tǒng)了。
情況B:擴(kuò)展分區(qū)和邏輯分區(qū)
隨著硬盤越來越大,四個(gè)主分區(qū)已經(jīng)不夠了,需要更多的分區(qū)。但是,分區(qū)表只有四項(xiàng),因此規(guī)定有且僅有一個(gè)區(qū)可以被定義成“擴(kuò)展分區(qū)”(Extended partition)。所謂“擴(kuò)展分區(qū)”,就是指這個(gè)區(qū)里面又分成多個(gè)區(qū)。這種分區(qū)里面的分區(qū),就叫做”邏輯分區(qū)”(logical partition)。
計(jì)算機(jī)先讀取擴(kuò)展分區(qū)的第一個(gè)扇區(qū),叫做“擴(kuò)展引導(dǎo)記錄”(Extended boot record,縮寫為EBR)。它里面也包含一張64字節(jié)的分區(qū)表,但是最多只有兩項(xiàng)(也就是兩個(gè)邏輯分區(qū))。
計(jì)算機(jī)接著讀取第二個(gè)邏輯分區(qū)的第一個(gè)扇區(qū),再?gòu)睦锩娴姆謪^(qū)表中找到第三個(gè)邏輯分區(qū)的位置,以此類推,直到某個(gè)邏輯分區(qū)的分區(qū)表只包含它自身為止(即只有一個(gè)分區(qū)項(xiàng))。因此,擴(kuò)展分區(qū)可以包含無數(shù)個(gè)邏輯分區(qū)。
但是,似乎很少通過這種方式啟動(dòng)操作系統(tǒng)。如果操作系統(tǒng)確實(shí)安裝在擴(kuò)展分區(qū),一般采用下一種方式啟動(dòng)。
情況C:?jiǎn)?dòng)管理器
在這種情況下,計(jì)算機(jī)讀取”主引導(dǎo)記錄”前面446字節(jié)的機(jī)器碼之后,不再把控制權(quán)轉(zhuǎn)交給某一個(gè)分區(qū),而是運(yùn)行事先安裝的“啟動(dòng)管理器”(boot loader),由用戶選擇啟動(dòng)哪一個(gè)操作系統(tǒng)。
Linux環(huán)境中,目前最流行的啟動(dòng)管理器是Grub。
Boot Loader 就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核做好一切準(zhǔn)備。
Boot Loader有若干種,其中Grub、Lilo和spfdisk是常見的Loader。
我們以Grub為例來講解吧,畢竟用lilo和spfdisk的人并不多。
為什么這么復(fù)雜
早期的操作系統(tǒng)并沒有那么復(fù)雜,當(dāng)然bootload也沒有那么多功能,但是如今我們的操作系統(tǒng)越來越復(fù)雜,bootload也越來越龐大,而且如今在一臺(tái)電腦上安裝多系統(tǒng)變得那么平常,因此之前簡(jiǎn)單的bootload已經(jīng)無法滿足這些功能。
BIOS和MBR都是硬件本身會(huì)支持的功能,至于Boot Loader則是操作系統(tǒng)安裝在MBR上面的一套軟件。由于MBR僅有446bytes而已,因此這個(gè)引導(dǎo)加載程序是非常小而完美的。這個(gè)BootLoader的主要任務(wù)如下
- 提供菜單:用戶可以選擇不同的開機(jī)選項(xiàng),這也是多重引導(dǎo)的重要功能
- 載入內(nèi)核文件:直接指向可開機(jī)的程序段來開始操作系統(tǒng)。
- 轉(zhuǎn)交其他Loader:將引導(dǎo)加載功能轉(zhuǎn)交給其他loader負(fù)責(zé)
上面的前兩點(diǎn)還容易理解,但是第三點(diǎn)很有趣!那表示你的計(jì)算機(jī)系統(tǒng)里面可以具有兩個(gè)以上的引導(dǎo)加載程序呢。有可能嗎?我們的硬盤不是只有一個(gè)MBR而已?但是引導(dǎo)加載程序除了可以安裝在MBR之外,還可以安裝在每個(gè)分區(qū)的引導(dǎo)扇區(qū)。
舉一個(gè)例子來說,假設(shè)你的個(gè)人計(jì)算機(jī)只有一塊硬盤,里面分成4個(gè)分區(qū)。其中第一,二分區(qū)分別安裝了Windows及Linux,你要如何在開機(jī)的時(shí)候選擇用Windows還是Linux開機(jī)呢?假設(shè)MBR內(nèi)安裝的是可以同時(shí)識(shí)別Windows和Linux操作系統(tǒng)的引導(dǎo)加載程序,那么整個(gè)流程如下
做個(gè)總結(jié)就是這樣:
- 每個(gè)分區(qū)都有自己的啟動(dòng)扇區(qū)
- 系統(tǒng)分區(qū)為第一及第二分區(qū)
- 實(shí)際可開機(jī)的內(nèi)核文件是放置到各分區(qū)內(nèi)的
- loader只會(huì)認(rèn)識(shí)自己的系統(tǒng)分區(qū)內(nèi)的可開機(jī)內(nèi)核文件,以及其他的Loader而已
- loader可直接指向或者是間接將管理權(quán)交給另一個(gè)管理程序
現(xiàn)在想一下,為什么人家常說:”如果要安裝多重引導(dǎo),最好先安裝Windows再安裝Linux呢“?
這是因?yàn)長(zhǎng)inux在安裝時(shí),你可以選擇將引導(dǎo)加載程序安裝在MBR或個(gè)別分區(qū)的啟動(dòng)扇區(qū),而且Linux的Loader可以手動(dòng)設(shè)置菜單,所以你可以在Linux的Boot Loader里面加入Windows開機(jī)選項(xiàng)
Windows在安裝的時(shí)候,他的安裝程序會(huì)主動(dòng)覆蓋掉MBR以及自己所在分區(qū)的啟動(dòng)扇區(qū),你沒有選擇的機(jī)會(huì),而且他沒有讓我們自己選擇菜單功能
加載操作系統(tǒng)內(nèi)核
用戶選擇要加載的內(nèi)核之后,次引導(dǎo)加載程序(GRUB)就會(huì)根據(jù)/boot/grub.conf配置文件中所設(shè)置的信息,從/boot/所在的分區(qū)上讀取Linux內(nèi)核映像,然后把內(nèi)核映像加載到內(nèi)存中并把控制權(quán)交給Linux內(nèi)核。
linux內(nèi)核獲得控制權(quán)之后開始干自己的事
- 檢測(cè)硬件
- 解壓縮自己并安裝必要驅(qū)動(dòng)
- 初始化與文件系統(tǒng)相關(guān)的虛擬設(shè)備,LVM或RAID
- 裝載根文件系統(tǒng),掛在根目錄下面
- 完成之后,linux在進(jìn)程空間里面加載init程序,下面輪到init干活
根據(jù)grub設(shè)定的內(nèi)核映像所在路徑,系統(tǒng)讀取內(nèi)存映像,并進(jìn)行解壓縮操作。此時(shí),屏幕一般會(huì)輸出“Uncompressing Linux”的提示。當(dāng)解壓縮內(nèi)核完成后,屏幕輸出“OK, booting the kernel”。
系統(tǒng)將解壓后的內(nèi)核放置在內(nèi)存之中,并調(diào)用start_kernel()函數(shù)來啟動(dòng)一系列的初始化函數(shù)并初始化各種設(shè)備,完成Linux核心環(huán)境的建立。至此,Linux內(nèi)核已經(jīng)建立起來了,基于Linux的程序應(yīng)該可以正常運(yùn)行了。
啟動(dòng)第五步 用戶層init依據(jù)inittab文件來設(shè)定運(yùn)行等級(jí)
內(nèi)核被加載后,第一個(gè)運(yùn)行的程序便是/sbin/init,該文件會(huì)讀取/etc/inittab文件,并依據(jù)此文件來進(jìn)行初始化工作。其實(shí)/etc/inittab文件最主要的作用就是設(shè)定Linux的運(yùn)行等級(jí),其設(shè)定形式是“:id:5:initdefault:”,這就表明Linux需要運(yùn)行在等級(jí)5上。Linux的運(yùn)行等級(jí)設(shè)定如下:
- 0:關(guān)機(jī)
- 1:?jiǎn)斡脩裟J?/li>
- 2:無網(wǎng)絡(luò)支持的多用戶模式
- 3:有網(wǎng)絡(luò)支持的多用戶模式
- 4:保留,未使用
- 5:有網(wǎng)絡(luò)支持有X-Window支持的多用戶模式
- 6:重新引導(dǎo)系統(tǒng),即重啟
關(guān)于/etc/inittab文件的學(xué)問,其實(shí)還有很多
init進(jìn)程執(zhí)行rc.sysinit
在設(shè)定了運(yùn)行等級(jí)后,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等等。如果你有興趣,可以到/etc/rc.d中查看一下rc.sysinit文件,里面的腳本夠你看幾天的
啟動(dòng)內(nèi)核模塊
具體是依據(jù)/etc/modules.conf文件或/etc/modules.d目錄下的文件來裝載內(nèi)核模塊。
執(zhí)行不同運(yùn)行級(jí)別的腳本程序
根據(jù)運(yùn)行級(jí)別的不同,系統(tǒng)會(huì)運(yùn)行rc0.d到rc6.d中的相應(yīng)的腳本程序,來完成相應(yīng)的初始化工作和啟動(dòng)相應(yīng)的服務(wù)。
執(zhí)行/etc/rc.d/rc.local
你如果打開了此文件,里面有一句話,讀過之后,你就會(huì)對(duì)此命令的作用一目了然:
執(zhí)行/bin/login程序,進(jìn)入登錄狀態(tài)
此時(shí),系統(tǒng)已經(jīng)進(jìn)入到了等待用戶輸入username和password的時(shí)候了,你已經(jīng)可以用自己的帳號(hào)登入系統(tǒng)了。
文章轉(zhuǎn)載:Linux學(xué)習(xí)
(版權(quán)歸原作者所有,侵刪)