给你准备的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
微信掃描二維碼,關注我的公眾號
總結
以上是生活随笔為你收集整理的给你准备的Linux启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++学习日记5——模板
- 下一篇: mtk pwmlinux timer