系統啟動 以Linux為例

2021-05-04 08:55:15 字數 2032 閱讀 6015

這篇說一下計算機的啟動過程,主要是pc系統上linux的啟動過程,嵌入式的稍微提到一下,這上面的東西不一定非常正確,大多從網上相關的技術文章中獲取的資訊,以及查閱了部分linux的**。

總的來說這個文章定位於學習交流的性質,如果您覺得有不對的地方請一定指出來。

正文開始:

系統復位完成後,cpu從乙個確定的位址開始執行**,pc就是從bios中開始執行。嵌入式cpu則是在復位後從乙個位於快閃儲存器或者rom的已知位址處開始執行,具體這個位址在哪兒應該去查閱所使用cpu的datasheet,一般上面都有說明。

下面接著說pc,在pc中,是從位址0xffff0處開始執行的,這個位址正好在bios的位址範圍之內,這裡是一條跳轉指令,跳轉到bios真正的啟動**處(此處更具體的過程應該查閱pc相關的架構設計文件,intel那幾大本應該有用)。bios一開始是加電自檢,即所謂post過程,post過程完成後,其**就被清除出記憶體了,然後是bios的第二階段,這個階段進行本地裝置的列舉和初始化,這部分**在bios結束後仍然駐留記憶體,目標作業系統可以使用這些服務。bios最後會根據使用者的配置來查詢活動分割槽,這裡以硬碟為例。系統bios將讀取並執行硬碟上mbr處的**,這裡就進入了引導引導程式的部分,我們以當前大多數linux發行版中使用的grub為例來進行說明。由於bios訪問的儲存空間有限,所以大多把引導引導程式分成兩個階段來進行引導。

grub(gnu grand unified bootloader)

mbr(master boot record),一共512位元組,位於磁碟的0道0柱面1扇區,即第一扇區。當mbr被載入到ram後,bios將控制權交給了mbr,mbr中的主引導引導程式是乙個512位元組的映像,其中包含程式**和乙個分割槽表。其中前446個位元組是第一階段引導引導程式,其中包含了可執行**和錯誤訊息文字,接下來64位元組是分割槽表,其中包含4個分割槽的記錄(每個記錄大小為16位元組)。mbr以兩個特殊位元組(0xaa55)結尾,用作mbr的有效性檢查。

第一階段引導引導程式的工作是查詢並載入第二階段的引導程式,它通過在分割槽表中查詢乙個活動分割槽來實現這種功能,當找到乙個活動分割槽的時候,它會掃瞄分割槽表中的其他分割槽,以確保它們是不活動的,當這個過程驗證完成後,就將活動分割槽的引導記錄從這個裝置中讀入ram並執行。

在這裡要提到一下,grub存在乙個1.5階段,之所以存在這個階段是因為在這裡grub可以識別檔案系統,能夠訪問/boot/grub目錄下的配置檔案,而不是訪問磁碟塊的方式,這個在啟動以後可以看一下/boot/grub目錄下面有許多檔案系統格式+1.5這樣命名的檔案,比如在我的機器上就有:

fat_stage1_5

jfs_stage1_5

minix_stage1_5

e2fs_stage1_5

reiserfs_stage1_5

xfs_stage1_5

可以看到這裡包含了linux常用的多種檔案系統。在grub1.5階段載入grub.conf之後,就可以看到啟動選項的介面了,這裡有許多可以配置的選項,鑑於本文的目的就不介紹了,可以參看grub的文件說明。

當1.5引導引導程式載入執行以後,第二階段載入引導程式被載入到記憶體,並接管接下來的工作。它負責對檔案系統進行查詢定位核心和initrd映像的位置,並將它們載入到記憶體中,當這些映像準備完畢,階段2引導引導程式呼叫核心入口函式,引導引導程式釋放控制權,核心階段開始。

一般核心是乙個壓縮過的核心映像,在解壓縮之前,先有少量**進行一些硬體配置,然後解壓核心並將其放入到高階記憶體中,如果有initrd的話,會將它移到記憶體中,並表明以後可用,然後呼叫核心,開始啟動核心引導過程。具體過程一般是從arch/i386/boot/head.s的start彙編函式開始執行,這個函式執行一些基本硬體配置,然後呼叫arch/i386/boot/compressed/head.s中的startup_32函式,該函式然後呼叫decompress_kernel解壓核心,然後呼叫位於arch/i386/kernel/head.s中的startup_32函式,由它進一步初始化硬體,包括記憶體等,然後呼叫start_kernel,啟動核心,最後由start_kernel函式在最後呼叫init啟動第乙個使用者空間程序,然後開始使用者空間的啟動過程,直到整個系統啟動完畢。

就先如此吧,下次可以將**更好的結合一下。

Linux系統啟動流程(以CentOS 6為物件)

linux 系統的啟動,從計算機開機通電自檢開始,一直到登陸系統,需要經歷多個過程。學習 linux 的啟動過程,有助於了解 linux 系統的結構,也對系統的排錯有很大的幫助。centos 6.x 系統啟動過程發生了較大的變化,使用 upstart 啟動服務取代了原先的 system v init...

linux系統啟動

本文簡單介紹一下從我們按開機鍵到可以登入系統,這段時間系統和電腦硬體是怎麼一起工作的。既做為對自己知識的乙個總結整理,也可以給linux初級使用者做乙個入門介紹,高手請略過。一般來說linux的啟動可以分成三個階段 bios階段,系統引導階段,系統啟動階段。一 bios階段 bios 基本輸入輸出系...

linux系統啟動

本文簡單介紹一下從我們按開機鍵到可以登入系統,這段時間系統和電腦硬體是怎麼一起工作的。既做為對自己知識的乙個總結整理,也可以給linux初級使用者做乙個入門介紹,高手請略過。一般來說linux的啟動可以分成三個階段 bios階段,系統引導階段,系統啟動階段。一 bios階段 bios 基本輸入輸出系...