Linux內核學習筆記-1.簡介和入門

原創文章,轉載請註明:Linux內核學習筆記-1.簡介和入門 By Lucio.Yanghtml

部份內容來自:Linux Kernel Development(Third Edition),Robert Love,陳莉君等譯。服務器

1.操做系統和內核簡介  網絡

  Linux內核是自由公開軟件,使用GNU的General Public License(GPL)第二版做爲限制條款。大多數軟件許可證決意剝奪你共享和修改軟件的自由。相比之下,GNU通用公共許可證試圖保證你共享和修改自由軟件的自由。模塊化

  一般一個內核負責響應中斷的中斷服務程序、負責管理多個進程從而分享處理器時間的調度程序、負責管理進程地址空間的內存管理程序和網絡、進程間通訊等系統服務程序共同組成。內核獨立於普通應用程序,擁有受保護的內存空間和訪問硬件設備的全部權限,這種系統態和受保護的內存空間,稱之爲內核空間。函數

  應用程序經過系統調用與內核通訊。當一個應用程序執行一條系統調用,稱應用程序在內核空間運行,而內核運行於進程上下文。學習

  內核還要管理硬件設備。當硬件設備要和系統通訊時,首先發出中斷信號打斷處理器的執行,繼而打斷內核的執行,內核經過中斷號尋找相應的中斷處理程序,並調用這個程序相應和處理中斷。優化

  因此,處理器活動的狀況:ui

    1.運行於用戶空間,執行用戶程序。操作系統

    2.運行於內核空間,處於進程上下文。線程

    3.運行於內核空間,處於中斷上下文。

  操做系統內核分爲兩大陣營:單內核和微內核。

  單內核是將內核從總體上做爲一個單獨的大過程來實現,同時運行在一個單獨的地址空間上。內核能夠直接調用函數。大多數Unix爲單內核單模塊。

  微內核的功能被劃分爲多個獨立的過程,全部的服務器毆打保持獨立並運行在各自的地址空間上,不能像單內核模塊直接調用函數,經過進程間通訊(IPC)機制實現消息傳遞。Windows和Mac OS X基於微內核,可是卻讓所有的服務器進程運行在內核空間,而避免頻繁的上下文切換。

  Linux是單內核,可是有模塊化設計、搶佔式內核、支持內核線程以及動態裝載內核模塊的特性。

  與Unix的一些區別:

    1.Linux支持動態加載內核模塊。

    2.Linux支持對稱多處理機制(SMP)。

    3.Linux內核能夠搶佔。

    4.Linux不區分線程和進程。

2.GNU C

  Linux使用c編寫的,並不徹底符合ANSI C標準,涵蓋了ISO C99和GNU C標準。下面介紹內核使用的C語言拓展的部分。

  1.內聯(inline)函數

    內聯函數從源代碼層看,有函數的結構,而在編譯後,卻不具有函數的性質。內聯函數不是在調用時發生控制轉移,而是在編譯時將函數體嵌入在每個調用處。所以,能夠消除函數調用和返回帶來的開銷,可是意味着佔用更多的空間。適合將對時間要求高、代碼不長的函數定義爲內聯函數。如:

    static inline void wolf();(MS的C99支持的關鍵字是_inline)。

  2.內聯彙編

    gcc編譯器支持在c函數中嵌入彙編指令。一般使用asm()指令嵌入代碼。

  3.分支聲明

    對於條件選擇指令,gcc內創建了一條指令用於優化,在一個條件常常出現(likely),或者該條件常常不多出現的時候(unlikely),編譯器能夠根據這條指令對分支選擇進行優化,從而生成更好的彙編代碼。內核將這條指令封裝成了宏。

      #define likely(x)       __builtin_expect((x),1)//表示 x 的值爲真的可能性更大;
      #define unlikely(x)     __builtin_expect((x),0)//表示 x 的值爲假的可能性更大。

    用法以下:

      if (likely(prev != next)) {           next->timestamp = now;            ...      } else {            ...;      }

相關文章
相關標籤/搜索