基礎——ARM系統的啓動流程(boot loader,Linux 內核,文件系統之間的關係)

以三星的四核處理器Exynos4412爲例,該開發板屬於armv7架構,contexA9系列,32bit,cpu4核心1.5GHZ主頻,eMMC 大小型號爲:KLM4G。

ARM裏面,啓動MMU以後,我們編程看到的地址都是虛擬地址,經過MMU以後纔是具體的物理地址。

4412在上電以後,MMU是關閉的,也就是說這個時候其實和單片機差不多,可以直接跑裸機程序(裸機程序,就是直接對CPU進行編程),就跟單片機一樣,但是,在Linux啓動以後,操作系統就會把MMU打開,也就是說,虛擬地址就會出現。

1. BootLoader啓動過程

ARM上電後,是從0地址開始取指令執行,先看:

可以看出0地址在iROM中,即上電以後會執行它芯片內部iROM中的一段程序,這段程序是固化在芯片內部的,廠家燒進去的,我們看不到。iROM這段程序作用是什麼?

答:它會做一些初始化的工作,同時大部分開發板都可以從TF卡啓動,也可以從EMMC啓動,還可以從USB啓動,這些功能的切換就是通過IROM來實現的。

OM 就是啓動方式,例如設置如下:

IROM程序會根據管腳設置(板子上可以搞個撥動開關),選擇從eMMC中尋找啓動程序,如果找不到有效程序,再選擇從TF卡啓動。繼續:

已經知道,上電後,先執行iROM程序,會選擇好從哪裏啓動(假如是eMMC),所以,自然而然的就去外部eMMC芯片找啓動程序,找到以後,首先會拷貝8K的程序到內部RAM執行(墊腳石),這8k程序在BL1(BootLoader1)中,在這裏得8k是被三星固化了隱藏起來的,看不到。執行BL1幹嘛呢?

 BL1可以初始化系統時鐘,UART,SDRAM等設備,然後會跑到BL2(Bootloader2)中,拷貝其內部程序到SDRAM中執行。BL2幹嘛的呢?

BL2可以支持更強大的功能,它會把我們熟悉的真正的Bootloader(例如Uboot)拷貝到內存中執行,這樣BootLoader就可以啓動起來了。

2. 內核啓動

上面介紹了加載引導程序的過程,包括固化在固件中的boot代碼(看不見、不能改)和BootLoader(開發者移植)兩大部分。但並不是所有嵌入式系統中,都必須有這兩部分,有些就沒有固件程序,因此整個系統的加載啓動任務就完全由BootLoader來完成,同樣是從地址0x00000000處開始執行,而這個地址處安排的通常就是系統的BootLoader程序。

bootloader一上電就拿到了cpu 的使用權,它當然得幹一些初始化的工作啊,比如關閉看門狗、設置cpu 的運行模式、設置堆棧等等比較急迫的事情。當然還要對主板的一些其他硬件進行簡單的初始化,比如外部DDR內存、網卡、顯示屏、nand flash等等的初始化工作,最後當bootloader 完成它的使命之後就會把cpu 的使用權交給下一部分代碼:kernel(內核) 。


內核啓動的作用就是進行系統硬件探測硬件驅動的初始化(比如SPI、藍牙、以太網等等,所有的驅動都在裏面,內核空間的相關工作已經完成,開始向用戶空間轉移,內核空間通過一個間接的initrd(一個虛擬的文件系統)向用戶空間過度,然後開始掛載根文件系統。

3. 掛接文件系統

文件系統的百科解釋:

文件系統是操作系統用於明確存儲設備(常見的是磁盤,也有基於NAND Flash的固態硬盤)或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件機構稱爲文件管理系統,簡稱文件系統。文件系統由三部分組成:文件系統的接口,對對象操縱和管理的軟件集合,對象及屬性。從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。具體地說,它負責爲用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,當用戶不再使用時撤銷文件等。

表現出來就是,可視化界面,用戶對文件的複製、粘貼、刪除等等操作。

文件系統實現對磁盤空間的統一管理,一方面文件系統對磁盤空間進行統一規劃,另外一方面文件系統提供給普通用戶人性化的接口。就好比倉庫中的貨架,將空間進行規劃和編排,這樣根據編號可以方便地找到具體的貨物。而文件系統也是類似,將磁盤空間進行規劃和編號處理,這樣通過文件名就可以找到具體的數據,而不用關心數據到底是怎麼存儲的。

其過程:initrd ----> /sbin/init ----> /etc/inittab

initrd是一個虛擬的文件系統,裏面有lib、bin、sbin、usr、proc、sys、var、dev、boot等一些目錄,其目錄有點像真的/,所以我們稱之爲虛擬的根文件系統,作用就是將kernel和真的根文件系統建立關聯關係,讓kernel去initrd中加載根文件系統所需要的驅動程序,並以讀寫的方式掛載根文件系統,並讓執行用戶當中第一個進程init。

init執行完畢以後會啓動系統內的/etc/inittab文件,來完成系統的初始化工作。

補充:Android系統 = 大改的Linux內核+Android文件系統

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章