1. 程式人生 > >Linux內核的啟動流程之基礎概念

Linux內核的啟動流程之基礎概念

Linux內核啟動之基礎概念

Linux系統的組成部分

從運行狀態角度來看 分為 內核+根文件系統

從靜態角度來看 分為 磁盤分區+相關文件


內核調用

第一個方式:調用內核過於復雜,所以有些內核開發人員創建了庫文件,通過調用庫文件來調用內核程序。那麽shell就是通過調用庫的用戶接口(用戶程序)

第二個方式:程序開發人員很牛B,他為了追求效率,他自己編寫程序直接調用內核程序。


內核設計流派

1、單內核設計

把所有功能集成與同一程序。方便使用,但是一個功能出了問題就影響整個程序。linux就是例子

2、微內核設計

每種功能使用一個單獨的子系統實現。管理較為復雜,但是各功能之間相互影響較小。但是各種內核之間的兼容性就麻煩了。Windows Solaris就是例子


Linux內核特點

1、支持模塊化,.ko(kernel object)

2、支持模塊化運行時動態狀態或卸載

Linux內核組成

核心文件

技術分享圖片

vmlinuz-3.10.0-693xxxx 就是內核文件。

模塊文件

技術分享圖片

這個就是對應內核的模塊文件,如果管理員安裝了多個內核版本,那麽在這個目錄下就會有多個模塊文件

技術分享圖片

這個就是模塊文件中的內容。

技術分享圖片

在kernel目錄中又有一些系統必須的文件,比如說一些驅動文件

ramdisk文件(可選)

現在假設內核程序已經在內存當中了(如何載入的先不討論),那麽內核的第一件事情就是裝載根文件系統(加載init文件,開啟各種進程),裝載根文件系統需要掛在分區,掛載分區就需要硬盤驅動,硬盤的驅動在根文件系統內。這樣就矛盾了,簡單的來說掛載根文件系統需要驅動,而驅動又在根文件系統中。

怎麽辦?將內存的一部分當做磁盤來用,這個過程中有個偽根文件系統,用於將實際的根分區掛載,並讀取init文件。真正的根文件系統上線後,偽根文件系統就失效了。這個偽根文件系統是在第一次安裝操作系統的時候,系統根據實際磁盤生成的。

偽文件系統在一定條件下是不需要的,如果在編譯內核的時候就知道實際磁盤的驅動,那麽就可以將磁盤的驅動直接編譯到內核中。

技術分享圖片

這個就是ramdisk文件,在CentOS6之前該文件為initrd文件,到了CentOS6就轉換成ramdisk文件了,因為磁盤到內存必須有緩存,但是實際的數據就在內存中,不需要緩沖區。

內核實現的功能

1、進程管理

進程調度

進程的創建

進程銷毀

2、內存管理

進程間通信簡稱IPC、通信機制有1、消息隊列 2、semerphor 3、shm(共享內存)

socket是兩個主機進程間通信的機制

3、網絡協議棧

各種主機間進程的通信都需要通過網絡協議,這種公共的服務需要在內核中實現。

4、文件系統

運行中的系統環境分為兩層:1、內核空間 2、用戶空間

用戶空間中運行了各種應用程序

內核空間中運行了內核代碼,這個代碼一般都需要特權級操作。

那麽如果用戶的應用程序需要使用硬件資源時,用戶空間的代碼會調用內核空間 的代碼,由內核代為完成硬件資源操作。

5、驅動程序

6、安全功能


啟動分區(/boot)

用於存放內核代碼的存儲空間。在內核程序啟動之前是沒有根文件系統的,只有內核啟動之後才去識別根文件系統。推薦boot分區使用普通分區

技術分享圖片

根文件系統(rootfs)

必須符合FHS結構(特定目錄結構,比如包含/bin /sbin /proc)等目錄。其中init文件是最重要的文件,因為init是啟動其他進程的父進程,一切進程都來源於init

所以根文件系統只是一個叫法,根文件系統本身不存在,如果一個文件系統結構符合FHS結構,並包含了特定的目錄,那麽這個文件系統就叫做根文件系統。(在本機第二塊硬盤上安裝grub,並做簡要執行命令的實驗中,這個現象非常明顯,在根文件系統中,只有相應的目錄,每個目錄都沒有對應的文件,但是還是可以運行系統的。)


現在就有了一個比較燒腦的問題,內核代碼存放在/boot目錄中,只有內核啟動了才能識別根(簡單來講,使用內核需要根文件系統,但是掛在根文件系統需要內核),那麽在啟動系統的時候如何去找/boot目錄呢?所以在內核程序啟動之前需要一個程序將內核代碼放入內存運行。





Linux內核的啟動流程之基礎概念