Linux內核--內核基礎知識

第一章 內核基礎知識

一、概述

  1. 內核版本號

    內核的版本號主要有四個數組組成。比如版本號:2.6.26.1 其中,

    2 — 主版本號

    6 — 從版本號或副版本號

    26 — 修訂版本號

    1 — 穩定版本號

    副版本號表示這個版本是穩定版(偶數)還是開發版(奇數),上面例子中的版本號是穩定版。

    穩定的版本可用於企業級環境。

    修訂版本號的升級包括BUG修正,新的驅動以及新的特性的追加。

    穩定版本號主要是一些關鍵性BUG的修改。

  2. 單內核與微內核

  • 單內核

    • 原理

      整個內核都在一個大內核地址空間上運行。

    • 優勢

      1. 簡單。

      2. 高效:所有內核都在一個大的地址空間上,所以內核各個功能之間的調用和調用函數類似,幾乎沒有性能開銷

    • 劣勢

      一個功能的崩潰會導致整個內核無法使用。

  • 微內核

    • 原理

      內核按照功能被劃分成各個獨立的過程。每個過程獨立運行在自己的地址空間上。

    • 優勢

      1. 安全:內核的各種服務獨立運行,一種服務掛了不會影響其他服務
    • 劣勢

      內核各個服務之間的調用設計進程間的通信,比較複雜且效率低。

    Linux內核雖是基於單內核的,但是經過這麼多年的發展,也具備微內核的一些特性。(這也體現了Linux實用至上的原則)

  1. 可重入內核

    所有的Unix內核都是可重入內核,所謂的可重入內核意味着有幾個進程可以同時在內核態下執行。當然,在單核處理器下面只有一個進程在真正運行。但是許多進程可以在內核態下被阻塞,或等待CPU,或等待一些I/O操作。

    例如內核代表當前進程發佈一個讀磁盤的請求後,就讓磁盤處理該請求,並將會部分其他進程的執行。當設備滿足了請求時,一箇中斷就會通知內核去執行原來的進程,原來的進程就恢復執行。

    系統可重入的一種方式是編寫函數,以便這些函數值修改局部變量,而不能修改全局數據結構,這樣的函數就叫可重入函數。但是可重入內核不僅僅侷限於這樣的可重入函數。內核可以包含非重入函數,並且利用鎖機制保證一次只有一個進程執行一個非重入函數。處於內核態的每個進程只能作用於自己的內存空間,不能干預其他的進程。

    發生硬件中斷時,可重入內核能掛起當前正在執行的進程,即使這個進程處於內核態。這種能力是非常重要的,因爲這能提高發出終端的設備控制器的吞吐量。一旦設備發出一箇中斷,它一直等到CPU應答它爲止。如果內核能夠快速應答,在CPU處理終端時候設備控制器將能執行其他任務。

    下面來看一下內核的可衝入量對內核組織的影響。

    內核控制路徑(kernel control path)表示由內核執行的指令序列,從來處理系統調用、異常及中斷。

  2. 進程地址空間

    每個進程運行在它私有的地址空間。在用戶態下運行的進程涉及到私有棧、數據和代碼區。當內核態運行時,進程訪問內核的數據和代碼區,但是用另外的棧。

    因爲內核是可重入的,幾個內核控制幀路徑(每個進程與不同的進程相關)可以輪流執行。在這種情況下,每個內核控制路徑都有他自己的私有內核態堆棧。

  3. 同步和臨界區

    實現可重入內核需要利用同步機制:如果作用於內核數據結構的內核控制幀路徑被掛起,那麼,其他的內核控制路徑就不能再作用於該數據結構,除非它已被重新設置成一個一致性狀態。否則兩個控制路徑的交互作用將被破壞所存儲的信息。

    也就是說當兩個進程訪問同一個數據結構時應該保持一致性。

  4. 非搶佔式內核

    當進程在內核態執行時,它不能被任意掛起,也不能被掛起,也不能被另一個進程代替。因此,在單個處理器系統上,所有中斷異常處理程序不能更新的內核數據結構,內核對它們的訪問都將是安全的。

    非搶佔式內核是低效的,因爲運行在不同的CPU的兩個內核控制路徑本可以併發的訪問相同的數據結構。

  5. 自旋鎖機制

    單處理器系統上的另一種機制是:在進入一個臨界區之前禁止產生所有的硬件中斷。

  6. 交換與高速緩存

    爲了擴充進程所用的虛擬地址空間的大小,Unix操作系統使用磁盤上的交換區域。虛擬內存系統以一個頁框的內容作爲交換的基本單位。當一些進程引用已經換出頁時。MMU產生一個異常,然後異常處理長鬚分配一個新的頁框,並用存儲在磁盤在從磁盤上的舊內容初始化該頁框。

    另一方面,物理內存也被用作磁盤和其他塊設備的高速緩存。這是因爲硬盤非常慢,磁盤的訪問需要幾毫秒,與RAM的訪問時間相比,這就相當漫長了。因此,磁盤通常是英系那個系統性能的瓶頸。作爲一般規則,在最早的Unix系統就已經實現的一個策略是:通過把把從磁盤獨處的塊轉入到RAM的一組磁盤緩衝區中來儘可能地推遲寫磁盤的時間。sync()系統調用把所有“髒”的緩衝區(即緩衝區的內容與對應磁盤塊的內容不一樣)寫入磁盤來使得磁盤同步。爲了避免數據丟失,所有的操作系統都會注意會週期性地把髒緩衝寫回磁盤。

  7. 設備驅動程序

    設備通過設備驅動程序(device sriver)與I/O設備打交道。設備驅動程序包含在內核中,由控制一個或多個設備的數據結構和函數組成,這些設備包括硬盤、鍵盤、鼠標、監視器、網絡接口以及連接到SCCI總線上的設備。通過特定的接口,每個驅動程序與內核中的其餘部分(甚至與其他驅動程序)相互作用,這個方式具有以下優點:

    • 可以把特定的代碼封裝在特定的模塊中。
    • 廠商不動內核源代碼,只遵守接口規範,就能增加新的設備。
    • 內核以統一的方式對待所有的設備,並且通過相同的接口訪問這些設備。
    • 可以把設備驅動程序寫成模塊,並且通過相同的接口訪問這些設備。
    • 可以把設備驅動程序寫成模塊,並動態地把它們裝進內核,不需要重新啓動系統。不需要時,也可以卸載模塊,以減少存儲在RAM中內核的大小。

    操作文件調用關係如圖所示,其中P代表了利用常用的與文件相關的系統調用及在/dev目錄下能找到的文件向內核發出請求。實際上,設備文件是設備驅動程序接口中用戶可見的部分。每個設備文件都有專門的設備驅動程序,他們有內核調用以執行對硬件設備的請求操作。

在這裏插入圖片描述

  1. 段寄存器

    爲了方便快速找到段選擇符,處理器提供段寄存器,且目的是存放段選擇符。這些段寄存器稱爲:CS、SS、DS、ES、FS和GS。儘管只有6個段寄存器,且程序可以把同一個段寄存器用於不同的目的,方法是先將其值保存在內存中,用完後再恢復。

    六個寄存器中三個有專門用途:

    CS:代碼段寄存器,指向存放程序指令的段。

    SS:棧段寄存器,指向存放當前程序棧的段。

    DS:數據段寄存器,指向存放靜態數據或者外部數據的段。

    其他三個段寄存器作一般用途,可以用來訪問任意的段。

    CS寄存器還有一個很重要的功能:它含有一個兩位的域,用以指明CPU的當前特權級(Current Privilege Level,CPL)。值爲0代表最高級,而值爲3代表最低級。Linux只用0~3級,分別稱之爲內核態和用戶態。

參考書籍:《深入理解Linux內核》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章