讓我們從應用、簡單開發、初學者的角度來了解Linux的開機流程,以及Kernel與Image在其中所扮演的角色。 同時,簡單說明在開發時常遇到的一些問題,以及如何調整。
BIOS
雖然我跟Linux無關,但我也想來跑龍套
BIOS,也不是什麼神奇的東西,學名叫「基本輸入輸出系統」。
不懂? 其實就是檢查所有的硬體 ,並對所有I/O(Input/Output)介面做初始化, 其中最重要的就是啟動CPU並溝通,且填入記憶體的相關資訊到暫存器中,有了CPU有了記憶體世界才有光阿。
接下來,會對慢速的硬體做動作,包刮鍵盤、滑鼠、光碟機等等,等於是對硬體做了一次健檢確定沒問題後,BIOS才會放行讓你繼續往下進行。
Boot Loader
完成了檢查,BIOS便會尋找可開機的磁碟,相信大家常常重灌時要選取開機碟順序,沒錯,BIOS就是按照你設定的順序去選儲存裝置並且尋找內部特定的位置,看能否找到主角—Boot Loader。
在Boot Loader中我們可以選取其中一個安裝好的Kernel版本並且載入開機,但通常我們安裝的Linux並不會打開選單的選項,因此會直接選取default的Kernel作為開機核心,同常會是最新的一個版本。
Kernel
核心,到底是多核心啦 ! 踹共!
Kernel的確非常核心,說穿了,其實非常簡單,核心有一大部分是一大堆的驅動程式,也就是driver所組成。 真的? 沒錯,Kernel就是作業系統與硬體溝通的橋樑,舉個最簡單的例子。
我們要開程式,都需要控制記憶體,我們寫程式肯定沒有說要掛載驅動才能操作實體記憶體對吧? 因為實際上Memory Driver是在Kernel內已經包好的,同樣的系統要控制CPU也許要透過Kernel。
Driver
等等!你這樣說,那Linux的Driver是不是跟Kernel有點關係?! 少來,你才沒聰明到問這問題。
但沒錯,Linux上的Driver都跟Kernel緊緊的綁在一起,通常我們常用的一些底層的driver,都可以在編譯Kernel時自由選擇。 假如你的主機板沒有網路孔,那你就可以不要掛載網路的Driver到Kernel中,也可以節省不少Kernel的空間,這在嵌入式系統開發時可是非常之重要呢! 畢竟每一個位元的空間都常珍貴。
Kernel Version vs. Driver
有人會問,那一些外來的硬體驅動程式呢? 也有關係嗎?
當然是有的,如果你買了一個網卡,提供的Driver只能支援到Kernel v2.6,而你的電腦卻是v3.0的核心,這個Driver肯定是掛載不上去的。如下圖。
同時在開發Linux Driver時也需要註冊Kernel的版本才行。
What does Kernel actually do?
實際上,開機時Kernel便會對系統做初始化,並且掛載預設需要掛載的Driver,這個動作在編譯Kernel時也會做設定,決定哪些Driver是預設掛載,而那些Driver是以Module的方式放著,讓使用者想要使用時再手動掛載。
Kernel的Log訊息可以在開機後透過以下指令來查看
dmesg
這邊提供嵌入式系統的Kernel開機訊息,相對簡單一些,看過就行不用完全了解內容的。
Image
Image其實就是作業系統,也就是人們常常提到的Ubuntu, CentOS 等等。
作業系統會再Kernel初始化完成後,便會尋找根目錄中的系統進入點做後續的動作完成開機。
系統進入點通常會是一個叫 initrd.img
的檔案。
結語
Linux核心以及系統的操作博大精深需要長久的時間來了解並熟悉,這個篇章非常基礎,主要是先帶大家了解一下Linux的世界有多麼的複雜XD
後續也會有Driver掛載、Kernel置換、開啟選單以及Linux操作的各種文章,請大家敬請期待。
我是夜海中的宅男DekBan,我們下次見,see ya next night.