centos7 启动流程图_Linux启动过程详解
Linux啟動(dòng)過(guò)程詳解
作者:江遠(yuǎn)航
一、啟動(dòng)流程圖如下
圖1 Linux啟動(dòng)流程圖
BIOS ---> MBR
---> Kernel---> Init
二、Linux啟動(dòng)順序
一>? BIOS初始化
1、電腦周邊設(shè)備檢查
偵測(cè)周?chē)O(shè)備是否正常工作,如CPU類(lèi)型、速度、緩存等、主板類(lèi)型、內(nèi)存速
度、內(nèi)存容量、硬盤(pán)大小、硬盤(pán)類(lèi)型、硬盤(pán)工作模式、風(fēng)扇速度等。
2、選擇設(shè)備開(kāi)機(jī)
軟盤(pán)啟動(dòng)、光盤(pán)啟動(dòng)、網(wǎng)絡(luò)啟動(dòng)、硬盤(pán)啟動(dòng)。
3、選擇好哪個(gè)設(shè)備開(kāi)機(jī)之后,讀取這個(gè)設(shè)備的MBR引導(dǎo)扇區(qū)。
4、MBR(Master Boot Record,即的主引導(dǎo)記錄)。
主要作用引導(dǎo)磁盤(pán)操作系統(tǒng)啟動(dòng)。MBR是一個(gè)512字節(jié)大小的扇區(qū),位于磁盤(pán)上的第一個(gè)扇區(qū)中(0道0柱面1扇區(qū)),它由三個(gè)部分組成,主引導(dǎo)程序、、硬盤(pán)有效標(biāo)志(55AA)。
第一部分是里主引導(dǎo)程序(boot loader)占446個(gè)字節(jié)。
第二部分是分區(qū)表占64個(gè)字節(jié),硬盤(pán)中分區(qū)有多少以及每一分區(qū)的大小都記在其中。第三部分是magic
number,占2個(gè)字節(jié),固定為55AA。
BIOS不是查找操作系統(tǒng),而是主引導(dǎo)記錄。BIOS搜索MBR是否有完整的主
引導(dǎo)記錄,如果有,則認(rèn)為硬盤(pán)有操作系統(tǒng),然后BIOS將MBR整段裝載到內(nèi)存
RAM,將控制權(quán)交給MBR。
二>
BootLoader
1、Boot Loader安裝
1)安裝在硬盤(pán)MBR。
2)MBR被其他開(kāi)機(jī)管理程序占用,就可以將Bootloader安裝在硬盤(pán)其中一個(gè)分區(qū)的引導(dǎo)扇區(qū)上。
2、Boot Loader啟動(dòng)過(guò)程。
圖2Bootloader啟動(dòng)流程圖
Stage1(在Flash中運(yùn)行):
1)初始化硬件,為stage2及kernel執(zhí)行準(zhǔn)備硬件環(huán)境。
包括屏蔽所有中斷、設(shè)置CPU速度及時(shí)鐘頻率、RAM初始化、初始化LED、關(guān)閉CPU指令/Cache數(shù)據(jù)。
2)為stage2準(zhǔn)備RAM空間。
為了獲得更快的執(zhí)行速度,通常把stage2加載到RAM空間執(zhí)行,因此必須為加
載stage2準(zhǔn)備好一段可用的RAM空間范圍。
由于stage2通常是C語(yǔ)言執(zhí)行代碼,因此在考慮空間大小時(shí),除stage2映像的大小外,還須把堆棧空間考慮進(jìn)來(lái)。(空間大小最好是memory
page(通常是4KB)倍數(shù),一般1M的RAM空間足夠)
3)拷貝uboot到RAM空間。
拷貝時(shí)要確定stage2的可執(zhí)行映像在固態(tài)存儲(chǔ)設(shè)備(ROM、EEPROM或FLASH等)的存放起始地址和終止地址以及RAM空間的起始地址。
4)設(shè)置堆棧。
設(shè)置堆棧指針是為執(zhí)行C語(yǔ)言代碼做好準(zhǔn)備,此外,在設(shè)置堆棧指針SP之前,也可以關(guān)閉LED燈,以提示用戶(hù)準(zhǔn)備跳轉(zhuǎn)到stage2。
上述就緒后,可以跳轉(zhuǎn)到stage2去執(zhí)行。(比如在RAM系統(tǒng)中,可以通過(guò)修
改PC寄存器為合適的地址來(lái)實(shí)現(xiàn))
Stage2(拷貝至RAM中運(yùn)行):
1)初始化本階段需要用到的硬件設(shè)備。
通常包括:至少初始化一個(gè)串口以便和終端用戶(hù)進(jìn)行I/O輸出信息,初始化計(jì)時(shí)器等。在初始化這些設(shè)備之前,可以重新把LED燈點(diǎn)亮,表明已經(jīng)進(jìn)入main函數(shù)執(zhí)行。設(shè)備初始化完成,可以輸出一些打印信息,程序名字字符串、版本號(hào)等。
2)檢測(cè)系統(tǒng)內(nèi)存映射。
內(nèi)存映射指在整個(gè)4GB物理地址空間中,哪些地址范圍被分配用來(lái)尋址系統(tǒng)的RAM單元。檢測(cè)系統(tǒng)內(nèi)存映射的目的是要知道CPU預(yù)留的全部RAM地址空間中的哪些被真正映射到RAM地址單元。
規(guī)劃內(nèi)存占用布局包括兩方面:內(nèi)核映射所占用的內(nèi)存范圍;根文件系統(tǒng)所占用的內(nèi)存范圍。在規(guī)劃內(nèi)存占用的布局時(shí),主要考慮基地址和映射的大小。
3)設(shè)置內(nèi)核啟動(dòng)參數(shù)
將內(nèi)核映像和根文件系統(tǒng)映像拷貝到RAM空間后,就可以準(zhǔn)備啟動(dòng)Linux內(nèi)核,但在調(diào)用內(nèi)核之前,須設(shè)置Linux內(nèi)核啟動(dòng)參數(shù)。
BootLoader可以通過(guò)兩種方式傳遞參數(shù)給內(nèi)核,一種是舊的參數(shù)結(jié)構(gòu)方式(parameter_struct)(2.6之前內(nèi)核版本),另外一種是現(xiàn)在2.6版本在用的參數(shù)鏈表方式(tagged_list),這些參數(shù)主要包括,系統(tǒng)的根設(shè)備標(biāo)志,頁(yè)面大小,內(nèi)存的起始地址和大小,RAMDISK的起始地址和大小,壓縮的RAMDISK根文件系統(tǒng)的起始地址和大小,內(nèi)核命令參數(shù)等。
4)調(diào)用內(nèi)核
Bootloader調(diào)用Linux內(nèi)核的方法是直接跳轉(zhuǎn)到內(nèi)核的第一條指令處,也即是直接跳轉(zhuǎn)到MEM_START+0x8000地址處。
5)消亡
圖3Flash與RAM映射及初始化圖
系統(tǒng)加電或復(fù)位后,所有的CPU通常都從某個(gè)由CPU制造商預(yù)先安排的地址上取指令。比如,基于A(yíng)RM7TDMI core的CPU在復(fù)位時(shí)通常都從地址0x00000000取它的第一條指令。而基于CPU構(gòu)建的嵌入式系統(tǒng)通常將固態(tài)存儲(chǔ)設(shè)備(ROM、EEPROM或FLASH等)被映射到這個(gè)預(yù)先安排的地址上,當(dāng)Bootloader放到Flash的起始處后,系統(tǒng)加電后,CPU將首先執(zhí)行BootLoader程序。
三>啟動(dòng)GRUB
GNU GRUB和GRUB是GRand
Unified Bootloader的縮寫(xiě),它是一個(gè)多重啟動(dòng)管理器。用來(lái)引導(dǎo)不同系統(tǒng),如windows/linux。
MBR后面64字節(jié)是分區(qū)表,從分區(qū)表中可以知道有沒(méi)有活動(dòng)分區(qū),以及哪些是活動(dòng)分區(qū),通常活動(dòng)分區(qū)就是操作系統(tǒng)所在的分區(qū)。GRUB可以建立在MBR中,也可以建立在分區(qū)中。
從MBR載入Bootloader開(kāi)始、載入kernel、載入init這些程序,都是由GRUB這個(gè)開(kāi)機(jī)管理程序負(fù)責(zé)(/boot/grub/grub.conf)
引導(dǎo)過(guò)程
1、由硬盤(pán)啟動(dòng)時(shí),BIOS通常是轉(zhuǎn)向第一塊硬盤(pán)的第一個(gè),即(MBR)。
2、裝載GRUB和的過(guò)程,包括:
1)裝載記錄
基本引導(dǎo)裝載程序所做的唯一的事情就是裝載第二引導(dǎo)裝載程序。
2)裝載Grub
第二引導(dǎo)裝載程序?qū)嶋H上是引出更高級(jí)的功能,以允許用戶(hù)裝載一個(gè)特定的。
3)裝載系統(tǒng)
如。GRUB把機(jī)器的控制權(quán)移交給。
不同的是,都是使用一種稱(chēng)為鏈?zhǔn)窖b載的引導(dǎo)方法來(lái)啟動(dòng)的,,僅僅是簡(jiǎn)單地指向操作系統(tǒng)所在分區(qū)的第一個(gè)。
四>加載內(nèi)核
當(dāng)內(nèi)核映像被加載到內(nèi)存之后,內(nèi)核階段就開(kāi)始,內(nèi)核映像并不是一個(gè)可執(zhí)行的內(nèi)核,而是一個(gè)壓縮過(guò)的內(nèi)核映像,通常是zImage(壓縮映像小于512KB)或bzImage(較大的壓縮映像,大于512KB)。在這個(gè)內(nèi)核映像前面是一個(gè)例程,現(xiàn)實(shí)少量硬件設(shè)置,并對(duì)內(nèi)核映像中包含的內(nèi)核進(jìn)行解壓,然后將其放入高端內(nèi)存中,然后該例程會(huì)調(diào)用內(nèi)核,并開(kāi)始啟動(dòng)內(nèi)核引導(dǎo)的過(guò)程。
1)檢測(cè)電腦硬件設(shè)備。
2)將檢測(cè)到的硬件驅(qū)動(dòng)程序載入Kernel。(守護(hù)進(jìn)程kerneld)
3)如果必要的驅(qū)動(dòng)程序載入Kernel后將根目錄以只讀的方式掛載進(jìn)來(lái)。
4)Kernel載入第一個(gè)程序init進(jìn)程。
在/sbin/init上來(lái)查尋init,如果沒(méi)有找到init,就會(huì)試著運(yùn)行/bin/sh,如果還是失敗了,那么系統(tǒng)的啟動(dòng)就宣告失敗了。
五> Init
在UNIX里,除了進(jìn)程0(即PID=0的交換進(jìn)程,Swapper
Process)以外的所有進(jìn)程都是由其他進(jìn)程使用fork創(chuàng)建的,這里調(diào)用fork創(chuàng)建新進(jìn)程的進(jìn)程即為父進(jìn)程,而相對(duì)應(yīng)的為其創(chuàng)建出的進(jìn)程則為子進(jìn)程,因而除了進(jìn)程0以外的進(jìn)程都只有一個(gè)父進(jìn)程,但一個(gè)進(jìn)程可以有多個(gè)子進(jìn)程。
以進(jìn)程標(biāo)識(shí)符(Process
Identifier,即PID)來(lái)識(shí)別進(jìn)程。進(jìn)程0是系統(tǒng)引導(dǎo)時(shí)創(chuàng)建的一個(gè)特殊進(jìn)程,在其調(diào)用fork創(chuàng)建出一個(gè)子進(jìn)程(即PID=1的進(jìn)程1,又稱(chēng)init)后,進(jìn)程0就轉(zhuǎn)為交換進(jìn)程(有時(shí)也被稱(chēng)為空閑進(jìn)程),而進(jìn)程1(init進(jìn)程)就是系統(tǒng)里其他所有進(jìn)程的祖先。(fork后相當(dāng)于復(fù)制了一份,也就相當(dāng)于一個(gè)副本,所以在以后的程序執(zhí)行,父進(jìn)程改變父進(jìn)程的數(shù)據(jù),子進(jìn)程改變子進(jìn)程的數(shù)據(jù))
init進(jìn)程是系統(tǒng)所有進(jìn)程的起點(diǎn),在完成內(nèi)核引導(dǎo)后,在本進(jìn)程空間加載init程序,它的進(jìn)程號(hào)是1。s
1、init進(jìn)程作用
1)扮演終結(jié)父進(jìn)程角色。
init進(jìn)程永遠(yuǎn)不會(huì)終止,所以系統(tǒng)確信它的存在,并在必要時(shí)以它為參照。如果某個(gè)進(jìn)程在它衍生出來(lái)的全部子進(jìn)程結(jié)束前被終止,就會(huì)出現(xiàn)以init為參照的情況,這個(gè)子進(jìn)程立刻成為init的子進(jìn)程,init進(jìn)程自動(dòng)對(duì)終止的子進(jìn)程調(diào)用wait,防止產(chǎn)生僵尸進(jìn)程。
2)進(jìn)入某個(gè)特定的運(yùn)行級(jí)別(Runlevlel)時(shí)運(yùn)行相應(yīng)的程序,以此對(duì)各種運(yùn)行級(jí)別進(jìn)行
管理。(由/etc/inittab文件定義)
Init程序讀取/etc/inittab文件決定做哪些操作
1)決定預(yù)設(shè)要使用哪個(gè)Run Level
2)Init會(huì)初始化作業(yè)系統(tǒng)的程序/etc/rc.d/rc.sysinit
3)Init根據(jù)執(zhí)行的Run level來(lái)對(duì)應(yīng)目錄里的程序,決定開(kāi)啟哪些服務(wù)
操作系統(tǒng)
操作系統(tǒng)(英語(yǔ):Operating System,簡(jiǎn)稱(chēng)OS)是管理與資源的,同時(shí)也是的核心與基石。操作系統(tǒng)身負(fù)諸如管理與配置、決定系統(tǒng)資源供需的優(yōu)先次序、控制輸入與、操作與管理等基本事務(wù)。操作系統(tǒng)也提供一個(gè)讓用戶(hù)與系統(tǒng)交互的操作接口。
操作系統(tǒng)的形態(tài)非常多樣,不同機(jī)器安裝的操作系統(tǒng)可從簡(jiǎn)單到復(fù)雜,可從的到的大型操作系統(tǒng)。許多操作系統(tǒng)制造者對(duì)它涵蓋范疇的定義也不盡一致,例如有些操作系統(tǒng)集成了,而有些僅使用文字接口,而將圖形接口視為一種非必要的應(yīng)用。
操作系統(tǒng)理論在科學(xué)中,為歷史悠久而又活躍的分支;而操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)則是工業(yè)的基礎(chǔ)與核心。
2內(nèi)核
內(nèi)核,是一個(gè)操作系統(tǒng)的核心。它負(fù)責(zé)管理系統(tǒng)的進(jìn)程、、設(shè)備、文件和系統(tǒng),決定著系統(tǒng)的性能和穩(wěn)定性。
“內(nèi)核”指的是一個(gè)提供抽象層、磁盤(pán)及控制、多任務(wù)等功能的。一個(gè)內(nèi)核不是一套完整的操作系統(tǒng)。一套基于Linux內(nèi)核的完整操作系統(tǒng)叫作Linux操作系統(tǒng),或是GNU/Linux。
內(nèi)核是操作系統(tǒng)最基本的部分。它是為眾多應(yīng)用提供對(duì)的安全訪(fǎng)問(wèn)的一部分,這種訪(fǎng)問(wèn)是有限的,并且內(nèi)核決定一個(gè)程序在什么時(shí)候?qū)δ巢糠钟布僮鞫嚅L(zhǎng)時(shí)間。直接對(duì)操作是非常復(fù)雜的,所以?xún)?nèi)核通常提供一種硬件抽象的方法來(lái)完成這些操作。抽象隱藏了復(fù)雜性,為和硬件提供了一套簡(jiǎn)潔,統(tǒng)一的接口,使更為簡(jiǎn)單。s
嚴(yán)格地說(shuō),內(nèi)核并不是計(jì)算機(jī)系統(tǒng)中必要的組成部分。可以直接地被調(diào)入中執(zhí)行,這樣的設(shè)計(jì)說(shuō)明了設(shè)計(jì)者不希望提供任何抽象和操作系統(tǒng)的支持,它常見(jiàn)于早期計(jì)算機(jī)系統(tǒng)的設(shè)計(jì)中。最終,一些輔助性,例如程序加載器和調(diào)試器,被設(shè)計(jì)到機(jī)器核心當(dāng)中,或者固化在里。這些變化發(fā)生時(shí),操作系統(tǒng)內(nèi)核的概念就漸漸明晰起來(lái)了。
摘自:
《基于嵌入式ARM的Bootloader研究與實(shí)現(xiàn)》
《Bootloader研究》s
總結(jié)
以上是生活随笔為你收集整理的centos7 启动流程图_Linux启动过程详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle 一个实例创建多个数据库_o
- 下一篇: php对接海康视频教程_EasyNVR无