給你準備的Linux啓動流程

讀者朋友提問:

昨天在後臺看到一個讀者朋友跟我說,發哥,你能不能講一下嵌入式Linux的開機流程,然後我看了下,我是沒有寫過這方面的文章,所以,就有了這篇文章。

回答:

我們都知道pc指針吧,我之前推薦大家看一本書叫《Linux內核藝術》,如果你們看了這本書,那麼對開機流程什麼的,就非常非常清楚了。我這裏講的內容,也不過是九牛一毛,跟書籍裏面的內容完整性相比,差距還是很大。不過,我可以把原理給大家說明清楚,看了我的文章後再去看書籍,可能效果會更加好。

按下電源鍵,打開電源


好了,我們繼續上面的內容,我們知道pc指針是指向當前需要執行程序的位置的,但是剛上電,什麼都沒有,CPU需要去哪裏找到要執行的程序呢?

這就需要預設置,我們需要固化一段代碼在ROM裏面,然後預先設置CPU上電執行的第一條指令的地址,在X86裏面是 FFFF:0000h 。在嵌入式設備裏面,根據不同的芯片廠商可能會設置不同,原理很簡單,這個地址跟他們的啓動時序有關係,和分區也有關係,所以會做相對應的修改。

引導bootloader

最近在做mtk的相關平臺,還有一個preloader的概念,不管是什麼loader,包括我們在x86上面說的BIOS,也就是basic input output system。都是爲了引導系統服務的,系統起來的之前是內核,所以這些東西都是爲了引導內核服務的。

我們上面不是說了第一條指令會指向一個固定的ROM地址嗎?這個地址裏面執行的東西,從某種意義上來說也是bootloader的一部分。這些是概念性的東西,屬於幫忙內核引導的,都可以認爲是bootloader的一部分。但是因爲芯片設計,系統設計的原因,可能會細分一些。

比如,我現在做的MTK平臺,在裏面會以因爲在loader裏面做插入USB的判斷,還有一些其他比較前期的開機判斷,比如SMPS(用來判斷AC轉換車工DC的供電是否正常)等等。

bootloaer是幹什麼喫的?

上面提了一些bootloaer的作用是用來引導內核的,正常bootloaer會分成兩個階段。

第一個階段就初始化一些基本的東西,讓第二階段的bootloader能夠正常運行。

第二個階段做的事情就比較多,比如初始化一些外設,正常我們需要初始化的外設是顯示和串口,顯示可以讓我們看到當前的界面,串口可以讓我們看到日誌輸出。

在這之前,我們還需要初始化中斷向量,初始化內存,初始化定時器,看門狗,這些是比串口和現實屏更加重要的。

這些做完後,就要給內核造房子讓內核住進去,也就是說,我們把內核的鏡像加載進入內存,然後解壓,準備運行內核。

內核的運行環境準備好後,就把pc指針指向內核執行地址,之後就是內核在運行了。

內核會做什麼事情呢?

從start_kernel開始,內核開始了它一生的漫長生涯~

內核剛起來的第一件事情就是檢查硬件了,內核還需要接收bootloader裏面傳過來的東西,比如內存信息,中斷向量表,有了這些東西內核就沒有必要再去檢測一次了。

還有一個比較重要的,就是去掛載根文件系統,根文件系統是內核啓動的關鍵因素,沒有這個內核是不能正常運行了。

然後,就去執行一些內核模塊,我們寫的一些驅動,都是以內核模塊的形式存在的,這時候就去執行內核模塊的init函數。

上面之後,還需要準備用戶空間的東西,內核的存在是爲了應用服務的,所以這裏需要準備用戶空間執行的一些條件。

然後加載第一個init進程。

分享一張Android平臺的開機流程

上電的第一時間跑的是Boot ROM 裏面的代碼,然後再去執行pre-loader,後面會到Little Kernel,然後再到kernel。

晚上跟同事討論的時候,提到一個問題,爲什麼pre-loader和Lk不能做成一起?

在LK裏面運行的是一個C代碼編譯出來的產物,在pre-loader需要提前把這個環境搭建好。

唉,我還是畫個圖

整體的流程圖如下:

工作模式切換

嵌入式跟X86有點不一樣,嵌入式Linux的平臺很多,很多芯片廠商跟ARM簽約拿到ARM授權後,就可以開始做自己的芯片。

X86我們在學習的時候,知道在bootloader下跑實模式,然後到內核後就轉到保護模式。

ARM有7種工作方式,我們在不同的階段,會處在不同的工作方式中。

像一些成熟的手機方案,會加上modem芯片,開機的時候還需要和modem通信,複雜度又會增加一個檔次。說到這裏,又不得不提到嵌入式和平臺強相關性的問題。

上面提到的《Linux內核設計的藝術》,有喜歡的同學在後臺回覆,會有下載鏈接。

分享一個小故事,因爲在朋友圈裏真的太火了。

   推薦閱讀:

   專輯|Linux文章彙總

   專輯|程序人生

   專輯|C語言

嵌入式Linux

微信掃描二維碼,關注我的公衆號

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