1. 程式人生 > >【Linux技術】嵌入式linux核心的五個子系統

【Linux技術】嵌入式linux核心的五個子系統

Perface

   Linux核心主要由程序排程(SCHED)、記憶體管理(MM)、虛擬檔案系統(VFS)、網路介面(NET)和程序間通訊(IPC)5個子系統組成,如圖1所示。


圖1 Linux核心的組成部分與關係

1.程序排程

   程序排程控制系統中的多個程序對CPU的訪問,使得多個程序能在CPU中“微觀序列,巨集觀並行”地執行。程序排程處於系統的中心位置,核心中其他的子系統都依賴它,因為每個子系統都需要掛起或恢復程序。


圖2 Linux程序狀態轉換

   如上圖2所示,Linux的程序在幾個狀態間進行切換。在裝置驅動程式設計中,當請求的資源不能得到滿足時,驅動一般會排程其他程序執行,並使本程序進入睡眠狀態,直到它請求的資源被釋放,才會被喚醒而進入就緒態。

   睡眠分成可被打斷的睡眠和不可被打斷的睡眠,兩者的區別在於可被打斷的睡眠在收到訊號的時候會醒。

   在裝置驅動程式設計中,當請求的資源不能得到滿足時,驅動一般會排程其他程序執行,其對應程序進入睡眠狀態,直到它請求的資源被釋放,才會被喚醒而進入就緒態。

   裝置驅動中,如果需要幾個併發執行的任務,可以啟動核心執行緒,啟動核心執行緒的函式為:

   pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);

2.記憶體管理

   記憶體管理的主要作用是控制多個程序安全地共享主記憶體區域。

當CPU提供記憶體管理單元(MMU)時,Linux記憶體管理完成為每個程序進行虛擬記憶體到實體記憶體的轉換。Linux 2.6引入了對無MMU CPU的支援。

   如下圖3所示,一般而言,Linux的每個程序享有4GB的記憶體空間,0~3GB屬於使用者空間,3~4GB屬於核心空間,核心空間對常規記憶體、I/O裝置記憶體以及高階記憶體存在不同的處理方式。

圖3 Linux程序地址空間

3.虛擬檔案系統

   如下圖4所示,Linux虛擬檔案系統(VFS)隱藏各種了硬體的具體細節,為所有的裝置提供了統一的介面。而且,它獨立於各個具體的檔案系統,是對各種檔案系統的一個抽象,使用超級塊super block存放檔案系統相關資訊

使用索引節點inode存放檔案的物理資訊使用目錄項dentry存放檔案的邏輯資訊。

圖4 Linux檔案系統

4.網路介面

   網路介面提供了對各種網路標準的存取和各種網路硬體的支援。如下圖5所示,在Linux中網路介面可分為網路協議和網路驅動程式,網路協議部分負責實現每一種可能的網路傳輸協議網路裝置驅動程式負責與硬體裝置通訊,每一種可能的硬體裝置都有相應的裝置驅動程式。

圖5 Linux網路體系結構

5.程序通訊

   程序通訊支援提供程序之間的通訊,Linux支援程序間的多種通訊機制,包含訊號量、共享記憶體、管道等,這些機制可協助多個程序、多資源的互斥訪問、程序間的同步和訊息傳遞。

依賴關係

    Linux核心的5個組成部分之間的依賴關係如下:

·程序排程與記憶體管理之間的關係:這兩個子系統互相依賴。在多道程式環境下,程式要執行必須為之建立程序,而建立程序的第一件事情,就是將程式和資料裝入記憶體。

·程序間通訊與記憶體管理的關係:程序間通訊子系統要依賴記憶體管理支援共享記憶體通訊機制,這種機制允許兩個程序除了擁有自己的私有空間,還可以存取共同的記憶體區域。

·虛擬檔案系統與網路介面之間的關係:虛擬檔案系統利用網路介面支援網路檔案系統(NFS),也利用記憶體管理支援RAMDISK裝置。

·記憶體管理與虛擬檔案系統之間的關係:記憶體管理利用虛擬檔案系統支援交換,交換程序(swapd)定期由排程程式排程,這也是記憶體管理依賴於程序排程的惟一原因。當一個程序存取的記憶體對映被換出時,記憶體管理向檔案系統發出請求,同時,掛起當前正在執行的程序。

   除了這些依賴關係外,核心中的所有子系統還要依賴於一些共同的資源。這些資源包括所有子系統都用到的例程,如分配和釋放記憶體空間的函式、列印警告或錯誤資訊的函式及系統提供的除錯例程等。