《Linux內核設計與實現》課本第一章第二章學習筆記

1、Linux內核簡介

Unix內核的特色

  • Unix很簡潔,所提供的系統調用都有很明確的設計目的。
  • Unix中一切皆文件,對數據和設備的操做都是經過一套相同的系統調用接口進行的。
  • Unix內核和相關的系統工具都是用C語言編寫成的。
  • Unix進程建立很是迅速。
  • Unix提供了一套簡單而穩定的進程間通訊原語。

Unix如今已經發展爲一個支持搶佔式多任務、多線程、虛擬內存、換頁、動態連接和TCP/IP網絡的現代化操做系統。linux

操做系統與內核

操做系統是計算機完成基本功能和系統管理的核心,內核是操做系統的核心。在系統中運行的應用程序經過系統調用來與內核通訊。git

內核提供的服務主要有:緩存

  • 中斷服務程序,負責響應響應中斷
  • 調度程序,負責管理多個進程從而分配處理器輪轉時間
  • 內存管理程序,管理進程地址空間
  • 網絡、進程間通訊等系統服務

Linux與Unix的聯繫

Linux是類Unix系統,但不是Unix,也沒有直接使用Unix的源代碼。Linux內核是自由公開的軟件,開源。Linux是單內核,但汲取了微內核的精華:模塊化設計、搶佔式內核、支持內核線程以及動態裝載內核模塊的能力。ruby

單內核與微內核單內核:內核一般以單個靜態二進制文件的形式存放於磁盤中全部內核服務都運行在內核態並身處同一地址空間,內核能夠直接調用函數。特色是簡單,性能高。微內核:不一樣的功能被劃分爲獨立的過程,每一個過程叫作一個服務器,經過消息傳遞處理微內核通訊,採用了進程間通訊(IPC)機制。

2、內核源代碼

獲取內核源代碼

使用Git來獲取最新版本源代碼:服務器

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

更新到Linux的最新分支:網絡

$ git pull

解壓並安裝內核源代碼:多線程

$ tar xvjf linux-x.y.z.tar.bz2/gz

使用補丁:併發

$ patch -p1 < ../patch-x.y.z

 

3、編譯內核

配置內核

Linux中能夠配置的選項其前綴均爲CONFIG。異步

配置項二選一:yes 或 no模塊化

配置項三選一:yes 、no 或 module(以模塊形式生成,爲獨立代碼段)

簡化內核配置工具:

  • 字符界面下的Linux工具:逐一遍歷全部的配置項,要求用戶逐一選擇,耗時長。

    $ make config
  • 基於ncurse庫編制的圖形界面工具:

    $ make menuconfig
  • 基於gtk+的圖形工具:

    $ make gconfig
  • 基於默認配置爲體系結構建立一個配置:

    $ make defconfig
  • 驗證和更新配置:

    $ make oldconfig

一旦內核配置好,就能夠利用一個簡單的命令來編譯它。

$ make

減小編譯的垃圾信息

儘可能減小垃圾信息的方法:對輸出進行重定向。

$ make > .. /detritus  將輸出信息重定向到這個文件目錄
    $ make > /dev/null 把無用的輸出信息重定向到永無返回值的黑洞/dev/null

衍生多個編譯做業

以多個做業編譯內核:

$ make jn n爲要衍生出的做業數,每一個處理器能夠衍生出1或2個做業,16核時n可取32

安裝新內核

$ make modules_install

編譯時會在內核代碼目錄樹的根目錄下建立一個System.map文件,爲符號對照表,用於將內核符號和他們的起始地址對應起來,方便調試。

4、內核開發特色

無libc庫或標準頭文件

大部分經常使用的C庫函數在內核中都已經獲得實現,只要包含<linux/string.h>文件就可使用它們。

GUN C

內聯函數

內聯函數的工做模式:函數會在它所調用的位置上展開,能夠消除函數調用和返回所帶來的開銷(寄存器存儲和恢復)。可是代碼會變長,佔用更多的內存空間或者緩存指令。

定義一個內聯函數的時候須要使用static做爲關鍵字並用inline限定,而且必須在使用之間就定義好。

static inline void wolf(unsigned long tail_size)
內聯彙編

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

分支聲明

對於條件選擇語句,在一個條件常常出現或不多出現的時候,編譯器能夠根據這條指令對條件分支進行選擇優化。並將其封裝成宏,如likely()和unlikely()。

  • 將一個選擇標記成絕少發生的分支:

    /*error絕大多數時間都會爲0*/ if(unlikely(error)){ ... }
  • 將一個分支標記爲一般爲真的分支:

    /*success一般都不會爲0*/ if(likely(success)){ ... }

    沒有內存保護機制

  • 內核中發生內存錯誤會致使oops。訪問非法地址或引用空指針可能會形成死機。
  • 內核中全部的內存都不分頁。每使用一個字節,物理內存就減小一個字節。

同步和併發

內核很容易產生競爭條件,許多性能要求併發地共享訪問數據。一般解決競爭的辦法是自旋鎖和信號量

  • Linux是搶佔式多任務操做系統。
  • Linux內核支持對稱處理器系統(SMP)。
  • 中斷是異步到來的,徹底不考慮當前正在執行的代碼。
  • Linux內核能夠搶佔。
相關文章
相關標籤/搜索