深入linux核心架構-第一章-簡介和概述
一直以來,對linux充滿了滿滿的憧憬。從今天開始,在未來的一段日子裡,每天研究一個linux核心的小主題。堅持!!!!
linux的介紹在這裡就不闡述了,幾乎每本書籍中都有或多或少的介紹。
(一)核心的作用
核心就是硬體和軟體之間的一箇中間件。其作用是將應用程式的請求傳送給硬體,並充當底層驅動程式,對系統中的元件和各種裝置進行定址。儘管如此,仍然可以從其它一些有趣的視角進行研究。
(1)從應用程式的視角來看,核心可以被認為是一臺增強的計算機,將計算機抽象到一個高層次上。
(2)當若干程式在同一系統中併發執行時,也可以將核心視為資源管理程式。
(3)另一種研究核心的視角是將核心視為庫,其提供了一組面向系統的命令。通常,系統呼叫用於向計算機發送請求。
(二)實現策略
當前,在作業系統實現方面,主要有兩種主要的正規化:
(1)微核心:這種正規化中,只有最基本的功能直接有中央核心(即微核心)實現。所有其它的功能都委託給一些其它的程序,這些程序通過明確定義的通訊介面與微核心進行通訊。
(2)巨集核心:與微核心相反,巨集核心是構建系統核心的傳統方法。在這種方法中,核心的全部程式碼,包括所有的子系統(如記憶體管理,檔案系統,裝置驅動程式)都打包到一個檔案中。核心中的每一個函式都可以訪問核心中所有其它部分。如果程式設計時不小心,很可能導致原始碼中包括複雜的巢狀。
在目前,巨集核心的效能仍然要強於微核心,Linux仍然是根據巨集核心的正規化實現的。
(三)核心的組成部分
1 程序,程序切換,排程
linux是多工系統,它支援(看上去)併發執行的若干程序。但是,事實上,系統中同時執行的程式不會超過CPU的數目。
(1)核心藉助於CPU的幫助,負責程序切換的技術細節。
(2)核心還必須確定如何在現存程序之間共享CPU時間。重要程序得到的CPU時間多一點,次要程序得到的少一點。確定哪個程序執行多長時間的過程成為排程。
2 UNIX程序
linux對程序採用了一種層次系統,每個程序都依賴於一個父程序。這種樹形結構的擴充套件方式與新程序的建立方式是密切相關的。UNIX作業系統中有兩種建立新程序的機制,分別是fork和exec。
(1)fork:
可以建立當前程序的一個副本,父程序和子程序只有PID不同。在該系統呼叫執行後,系統中有兩個程序,都執行同樣的操作。父程序記憶體的內容將被複制,至少從程式的角度來看是這樣的。Linux使用了一種眾所周知的技術來使fork操作更為高效,該技術稱為寫時複製(copy on write),主要原理是將記憶體複製操作延遲到父程序或子程序向某記憶體頁面寫入資料之前,在只讀訪問的情況下父程序和子程序可以共用同一記憶體頁。
例如,使用fork的一種可能情況是,使用者開啟另一個瀏覽器視窗。如果選中了對應的選項,瀏覽器將執行fork,複製其程式碼,接下來子程序中將啟動適當的操作建立新視窗。
(2)exec:
將一個新程式載入到當前程序的記憶體中並執行。舊程式的記憶體頁將刷出,其內容將替換為新的資料。然後開始執行新程式。
2.1 執行緒
程序並不是核心支援的唯一一種程式執行形式。除了重量級程序,還有一種是執行緒(有時也稱為輕量級程序),執行緒也已經出現相當長的一段時間,本質上一個執行緒也有可以由若干個執行緒組成,這些執行緒共享同樣的資料和資源,但可能執行程式中不同的程式碼路徑。執行緒概念已經完全整合到許多現代程式語言中,例如JAVA。簡而言之,進城可以看做一個正在執行的程式,而執行緒則是與主程式並行執行的程式函式或例程。
linux使用clone方法建立執行緒,其工作方式類似於fork,但啟用了精確的檢查,以確認哪些資源與父程序共享,哪些資源為執行緒獨立建立。
2.2名稱空間
2.3 地址空間和特權級別
2.4頁表
2.5實體記憶體的分配
2.6計時
2.7系統呼叫
系統呼叫按照不同類別進行分組:
(1)程序管理:建立新程序,查詢資訊,除錯;
(2)訊號:傳送訊號,定時器以及相關處理機制;
(3)檔案:建立,開啟和關閉檔案,從檔案讀取和向檔案寫入,查詢資訊和狀態;
(4)目錄和檔案系統:建立,刪除和重新命名目錄,查詢資訊,連結,變更目錄;
(5)保護機制:讀取和變更UID/GID,名稱空間的處理;
(6)定時器函式:定時器函式和統計資訊;
2.8裝置驅動程式,塊裝置和字元裝置
裝置驅動程式用於與系統連線的輸入/輸出裝置通訊,如硬碟,軟碟機,各種介面,音效卡等。外設可以分為如下兩種型別:
(1)字元裝置:提供連續的資料流,應用程式可以順序讀取,通暢不支援隨機存取。相反,此類裝置支援按位元組/字元來讀寫資料。舉例來說,調變解調器是典型的字元裝置。
(2)塊裝置:應用程式可以隨機訪問裝置資料,程式可以確定讀取資料的位置。硬碟是典型的塊裝置,應用程式可以定址硬碟上的任何位置,並由此讀取資料。此外,資料的讀寫只能以塊(通常是512B)的倍數進行。與字元裝置不同,塊裝置並不支援基於字元的定址。
2.9網路
網絡卡也可以通過裝置驅動程式進行控制,但在核心中屬於特殊情況,因為網絡卡不能利用裝置檔案訪問。原因在於在網路通訊期間,資料打包到了各個協議層。再接收到資料後,核心必須針對各個協議層對資料進行拆包和處理,然後才能將資料傳遞給應用程式。傳送資料時,也是如此。
Linux用套接字進行抽象。套接字可以看作應用程式,檔案介面,核心的網路實現之間的代理。
2.10檔案系統
2.11模組和熱插播
模組在本質上不過是普通的程式,只是在核心空間而不是使用者空間執行而已。模組必需提供某些程式碼段在模組初始化時執行,以便向核心註冊和登出模組。另外,模組程式碼與普通程式碼的權利(和義務)都是相同的,可以向編譯到核心中的程式碼一樣,訪問核心中所有的函式和資料。
對於支援熱插拔而言,模組在本質上是必須的。某些匯流排(例如,USB和FireWire)允許在系統執行時連線裝置,而無需系統重啟。在系統檢測到新裝置時,通過載入對應的模組,可以將必要的驅動程式自動新增到核心中。
2.12快取
2.13連結串列處理
2.14物件管理和引用計數
2.15資料型別
(1)型別定義:
使用typedef定義各種資料型別
(2)位元組序
(3)per-cpu變數
(4)訪問使用者空間
(待續。。。。。。)