linux系統(tǒng)啟動過程詳解

大家好我是豬豬!今天給大家說一下linux啟動流程钟鸵,linux系統(tǒng)啟動開機(jī)過程指的是從打開計算機(jī)電源直到LINUX顯示用戶登錄畫面的全過程奸鬓。分析LINUX開機(jī)過程也是深入了解LINUX核心工作原理的一個很好的途徑焙压。這里大概分為10個步驟為同學(xué)們講解下:

1.加載BIOS

計算機(jī)電源加電質(zhì)檢,首先加載基本輸入輸出系統(tǒng)(Basic Input Output System庵芭,BIOS)妹懒,

BIOS中包含硬件 CPU、內(nèi)存双吆、硬盤等相關(guān)信息眨唬,包含設(shè)備啟動順序信息、硬盤信息好乐、內(nèi)存

信息匾竿、時鐘信息、即插即用(Plug-and-Play蔚万,PNP)特性等岭妖。加載完 BIOS 信息,計算機(jī)將

根據(jù)順序進(jìn)行啟動

2.讀取MBR

硬盤上第0磁道第一個扇區(qū)被稱為MBR反璃,也就是Master Boot

Record昵慌,即主引導(dǎo)記錄,它的大小是512字節(jié)淮蜈,可里面卻存放了預(yù)啟動信息斋攀、分區(qū)表信息∥嗵铮可分為兩部分:第一部分為引導(dǎo)(PRE-BOOT)區(qū)淳蔼,占了446個字節(jié)侧蘸;第二部分為分區(qū)表(PARTITION PABLE),共有66個字節(jié)鹉梨,記錄硬盤的分區(qū)信息讳癌。預(yù)引導(dǎo)區(qū)的作用之一是找到標(biāo)記為活動(ACTIVE)的分區(qū),并將活動分區(qū)的引導(dǎo)區(qū)讀入內(nèi)存存皂。

讀取完BIOS信息晌坤,計算機(jī)將會查找 BIOS 所指定的硬盤 MBR 引導(dǎo)扇區(qū),將其內(nèi)容復(fù)

制到0x7c00地址所在的物理內(nèi)存中艰垂。被復(fù)制到物理內(nèi)存的內(nèi)容是 Boot Loader然后進(jìn)行下一步引導(dǎo)

#==>Boot Loader 就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序泡仗。通過這段小程序埋虹,我們可以初始化硬件設(shè)備猜憎、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀 態(tài)搔课,以便為最終調(diào)用操作系統(tǒng)內(nèi)核做好一切準(zhǔn)備胰柑。通常,BootL oade:是嚴(yán)重地依賴于硬件而實(shí)現(xiàn)的爬泥,不同體系結(jié)構(gòu)的系統(tǒng)存在著不同的Boot Loader柬讨,GRUB就是Boot Loader中最常見的一種。

3.GRUB引導(dǎo)

GRUB啟動引導(dǎo)器是計算機(jī)啟動過程中運(yùn)行的第一個軟件程序袍啡,當(dāng)計算機(jī)讀取內(nèi)存中的

GRUB配置信息后踩官,會根據(jù)其配置信息來啟動硬盤中不同的操作系統(tǒng)。

?4.加載Kernel

根據(jù)grub設(shè)定的內(nèi)核映像所在路徑境输,系統(tǒng)讀取內(nèi)存映像蔗牡,并進(jìn)行解壓縮操作。此時嗅剖,屏幕一般會輸出“Uncompressing Linux”的提示辩越。當(dāng)解壓縮內(nèi)核完成后,屏幕輸出“OK, booting the kernel”信粮。

系統(tǒng)將解壓后的內(nèi)核放置在內(nèi)存之中黔攒,并調(diào)用start_kernel()函數(shù)來啟動一系列的初始化函數(shù)并初始化各種設(shè)備,完成Linux核心環(huán)境的建立强缘。至此督惰,Linux內(nèi)核已經(jīng)建立起來了,基于Linux的程序應(yīng)該可以正常運(yùn)行了旅掂。

start_kenrel() 定義在init/main.c中赏胚,它就類似于一般可執(zhí)行程序中的main()函數(shù),系統(tǒng)在此之前所做的僅僅是一些能讓內(nèi)核程序最低限度執(zhí)行的初始化操作辞友, 真正的內(nèi)核初始化過程是從這里才開始栅哀。函數(shù)start_kerenl()將會調(diào)用一系列的初始化函數(shù)震肮,用來完成內(nèi)核本身的各方面設(shè)置,目的是最終建立起基 本完整的Linux核心環(huán)境留拾。

start_kernel()中主要執(zhí)行了以下操作:

(1) 在屏幕上打印出當(dāng)前的內(nèi)核版本信息戳晌。

(2) 執(zhí)行setup_arch()痴柔,對系統(tǒng)結(jié)構(gòu)進(jìn)行設(shè)置沦偎。

(3) 執(zhí)行sched_init(),對系統(tǒng)的調(diào)度機(jī)制進(jìn)行初始化咳蔚。先是對每個可用CPU上的runqueque進(jìn)行初始化;然后初始化0號進(jìn)程(其task struct和系統(tǒng)空M堆棧在startup_32()中己經(jīng)被分配)為系統(tǒng)idle進(jìn)程豪嚎,即系統(tǒng)空閑時占據(jù)CPU的進(jìn)程。

(4)執(zhí)行parse_early_param()和parsees_args()解析系統(tǒng)啟動參數(shù)谈火。

(5)執(zhí)行trap_in itQ侈询,先設(shè)置了系統(tǒng)中斷向量表。0-19號的陷阱門用于CPU異常處理;然后初始化系統(tǒng)調(diào)用向量;最后調(diào)用cpu_init()完善對CPU的初始化糯耍,用于支持進(jìn)程調(diào)度機(jī)制扔字,包括設(shè)定標(biāo)志位寄存器、任務(wù)寄存器温技、初始化程序調(diào)試相關(guān)寄存器等等革为。

(6)執(zhí)行rcu_init(),初始化系統(tǒng)中的Read-Copy Update互斥機(jī)制舵鳞。

(7)執(zhí)行init_IRQ()函數(shù)震檩,初始化用于外設(shè)的中斷,完成對IDT的最終初始化過程蜓堕。

(8)執(zhí)行init_timers(), softirq_init()和time_init()函數(shù)抛虏,分別初始系統(tǒng)的定時器機(jī)制,軟中斷機(jī)制以及系統(tǒng)日期和時間俩滥。

(9)執(zhí)行mem_init()函數(shù)嘉蕾,初始化物理內(nèi)存頁面的page數(shù)據(jù)結(jié)構(gòu)描述符,完成對物理內(nèi)存管理機(jī)制的創(chuàng)建霜旧。

(10)執(zhí)行kmem_cache_init(),完成對通用slab緩沖區(qū)管理機(jī)制的初始化工作错忱。

(11)執(zhí)行fork_init(),計算出當(dāng)前系統(tǒng)的物理內(nèi)存容量能夠允許創(chuàng)建的進(jìn)程(線程)數(shù)量挂据。

(12)執(zhí)行proc_caches_init() , bufer_init(), unnamed_dev_init() ,vfs_caches_init(), signals_init()等函數(shù)對各種管理機(jī)制建立起專用的slab緩沖區(qū)隊(duì)列以清。

(13 )執(zhí)行proc_root_init()Wl數(shù),對虛擬文件系統(tǒng)/proc進(jìn)行初始化崎逃。

在start_kenrel()的結(jié)尾掷倔,內(nèi)核通過kenrel_thread()創(chuàng)建出第一個系統(tǒng)內(nèi)核線程(即1號進(jìn)程),該線程執(zhí)行的是內(nèi)核中的 init()函數(shù)个绍,負(fù)責(zé)的是下一階段的啟動任務(wù)勒葱。最后調(diào)用cpues_idle()函數(shù):進(jìn)入了系統(tǒng)主循環(huán)體口默認(rèn)將一直執(zhí)行 default_idle()函數(shù)中的指令浪汪,即CPU的halt指令,直到就緒隊(duì)列中存在其他進(jìn)程需要被調(diào)度時才會轉(zhuǎn)向執(zhí)行其他函數(shù)凛虽。此時死遭,系統(tǒng)中唯一存 在就緒狀態(tài)的進(jìn)程就是由kerne_hread()創(chuàng)建的init進(jìn)程(內(nèi)核線程),所以內(nèi)核并不進(jìn)入default_idle()函數(shù)凯旋,而是轉(zhuǎn)向 init()函數(shù)繼續(xù)啟動過程呀潭。

5.依據(jù)inittab文件來設(shè)定運(yùn)行等級

內(nèi)核被加載后,第一個運(yùn)行的程序便是/sbin/init至非,該文件會讀取/etc/inittab文件钠署,并依據(jù)此文件來進(jìn)行初始化工作。

其實(shí)/etc/inittab文件最主要的作用就是設(shè)定Linux的運(yùn)行等級荒椭,其設(shè)定形式是“:id:5:initdefault:”谐鼎,這就表明Linux需要運(yùn)行在等級5上。Linux的運(yùn)行等級設(shè)定如下:

0:關(guān)機(jī)

1:單用戶模式

2:無網(wǎng)絡(luò)支持的多用戶模式

3:有網(wǎng)絡(luò)支持的多用戶模式

4:保留戳杀,未使用

5:有網(wǎng)絡(luò)支持有X-Window支持的多用戶模式

6:重新引導(dǎo)系統(tǒng)该面,即重啟

6.init進(jìn)程執(zhí)行rc.sysinit

在設(shè)定了運(yùn)行等級后夭苗,Linux系統(tǒng)執(zhí)行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本程序信卡,它做的工作非常多,包括設(shè)定PATH题造、 設(shè)定網(wǎng)絡(luò)配置(/etc/sysconfig/network)傍菇、啟動swap分區(qū)、設(shè)定/proc等等界赔。如果你有興趣丢习,可以到/etc/rc.d中查看 一下rc.sysinit文件。

線程init的最終完成狀態(tài)是能夠使得一般的用戶程序可以正常地被執(zhí)行淮悼,從而真正完成可供應(yīng)用程序運(yùn)行的系統(tǒng)環(huán)境咐低。它主要進(jìn)行的操作有:

(1) 執(zhí)行函數(shù)do_basic_setup(),它會對外部設(shè)備進(jìn)行全面地初始化袜腥。

(2) 構(gòu)建系統(tǒng)的虛擬文件系統(tǒng)目錄樹见擦,掛接系統(tǒng)中作為根目錄的設(shè)備(其具體的文 件系統(tǒng)已經(jīng)在上一步驟中注冊)。

(3) 打開設(shè)備/dev/console羹令,并通過函數(shù)sys_dup()打開的連接復(fù)制兩次鲤屡,使得文件號0,1 ,2 全部指向控制臺。這三個文件連接就是通常所說的“標(biāo)準(zhǔn)輸入”stdin,“標(biāo)準(zhǔn)輸出”stdout和“標(biāo)準(zhǔn)出錯信息”stderr這三個標(biāo)準(zhǔn)I/O通道福侈。

(4) 準(zhǔn)備好以上一切之后酒来,系統(tǒng)開始進(jìn)入用戶層的初始化階段。內(nèi)核通過系統(tǒng)調(diào)用execve()加載執(zhí)T子相應(yīng)的用戶層初始化程序肪凛,依次嘗試加載程 序"/sbin/initl"," /etc/init"," /bin/init'堰汉,和“/bin/sh辽社。只要其中有一個程序加載獲得成功,那么系統(tǒng)就將開始用戶層的初始化翘鸭,而不會再回到init()函數(shù)段中爹袁。至 此,init()函數(shù)結(jié)束矮固,Linux內(nèi)核的引導(dǎo) 部分也到此結(jié)束失息。

7.加載內(nèi)核模塊

讀取/etc/modules.conf文件及/etc/modules.d 目錄下的文件來加載系統(tǒng)內(nèi)核模塊。

該模塊文件档址,可以后期添加或者修改及刪除盹兢。

8.啟動運(yùn)行級別程序

根據(jù)之前讀取的運(yùn)行級別,操作系統(tǒng)會運(yùn)行rc0.d到 rc6.d 中的相應(yīng)的腳本程序守伸,來完成

相應(yīng)的初始化工作和啟動相應(yīng)的服務(wù)绎秒。

9.讀取rc.local文件

操作系統(tǒng)啟動完相應(yīng)服務(wù)之后,會讀取執(zhí)行/etc/rc.d/rc.local文件尼摹,可以將需要開機(jī)啟動

的任務(wù)加入到該文件末尾见芹,系統(tǒng)會逐行去執(zhí)行并啟動相應(yīng)命令。

10.執(zhí)行/bin/login程序

執(zhí)行/bin/login程序蠢涝,啟動到系統(tǒng)登錄界面玄呛,操作系統(tǒng)等待用戶輸入用戶名和密碼,即

可登錄到Shell終端

今天就講到這里有什么不懂得可以私信或評論我哦和二。拜拜徘铝!






?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惯吕,隨后出現(xiàn)的幾起案子惕它,更是在濱河造成了極大的恐慌,老刑警劉巖废登,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淹魄,死亡現(xiàn)場離奇詭異,居然都是意外死亡堡距,警方通過查閱死者的電腦和手機(jī)甲锡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吏颖,“玉大人搔体,你說我怎么就攤上這事“胱恚” “怎么了疚俱?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缩多。 經(jīng)常有香客問我呆奕,道長养晋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任梁钾,我火速辦了婚禮绳泉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姆泻。我一直安慰自己零酪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布拇勃。 她就那樣靜靜地躺著四苇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪方咆。 梳的紋絲不亂的頭發(fā)上月腋,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音瓣赂,去河邊找鬼榆骚。 笑死,一個胖子當(dāng)著我的面吹牛煌集,可吹牛的內(nèi)容都是我干的妓肢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牙勘,長吁一口氣:“原來是場噩夢啊……” “哼职恳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起方面,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎色徘,沒想到半個月后恭金,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褂策,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年横腿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斤寂。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡耿焊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遍搞,到底是詐尸還是另有隱情罗侯,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布溪猿,位于F島的核電站钩杰,受9級特大地震影響纫塌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讲弄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一措左、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧避除,春花似錦怎披、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赏壹,卻和暖如春鱼炒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝌借。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工昔瞧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菩佑。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓自晰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親稍坯。 傳聞我的和親對象是個殘疾皇子酬荞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

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