Linux第一二章筆記

第一章 Linux內核簡介

1. Unix內核的特色

  • 簡潔:僅提供系統調用並有一個很是明確的設計目的
  • 抽象:幾乎全部東西都被當作文件
  • 可移植性:使用C語言編寫,使得其在各類硬件體系架構面前都具有使人驚異的移植能力
  • 進程:建立迅速,一次執行保質保量地完成一個任務;獨特的fork系統調用
  • 清晰的層次化結構:策略和機制分離的理念,簡單的進程間通訊元語把單一目的的程序方便地組合在一塊兒

2. 關於Linux內核簡介linux

  • Linux是基於Unix的類Unix系統,設計思想類似,好比它也實現了UnixAPI。可是Linux沒有直接使用Unix的源代碼,但它沒有拋棄Unix的設計目標而且保證了應用程序編程接口的一致。
  • Linux內核是自由公開軟件。
  • Linux系統的基礎是內核、C庫、工具集和系統的基本工具。

3. 操做系統和內核簡介git

  • 操做系統是整個系統中負責完成最基本功能和系統管理的部分。包括內核、設備驅動程序、啓動引導程序、命令行Shell或者其餘種類的用戶界面、基本的文件管理工具和系統工具。
  • 內核是操做系統的核心。一般一個內核由負責響應中斷的中斷服務程序、負責管理多個進程從而分享處理器時間的調度程序、負責管理進程地址空間的內存管理程序和網絡、進程之間通訊等系統服務程序共同組成。
  • 系統態:擁有受保護的內存空間和訪問硬件設備的全部權限。(內核空間即這種系統態和被保護起來的內存空間)
  • 用戶態:執行普通用戶程序時,系統以用戶態進入用戶空間執行。(應用程序在用戶空間執行,只能看到容許它們使用的部分系統資源,並只使用某些特定的系統功能,不能直接訪問系統硬件,也不能訪問其餘的內核劃給別人的內存範圍)
  • 系統中運行的應用程序經過系統調用來與內核通訊。(應用程序經過系統調用界面陷入內核,是應用程序完成工做的基本行爲方式)
  • 中斷機制:一個異步的中斷信號打斷處理器的執行,繼而打斷內核的執行。中斷一般對應一箇中斷號,內核經過中斷號查找相應的中斷服務程序,並調用這個程序響應和處理中斷。
  • 每一個處理器在任何指定時間點上的活動必然是如下三者之一: 
    • 運行於用戶空間,執行用戶進程
    • 運行於內核空間,處於進程上下文,表明某個特定的進程執行
    • 運行於內核空間,處於中斷上下文,與任何進程無關,處理某個特定的中斷

 

4. Linux內核和傳統Unix內核的比較

  • 單內核 
    • 整個內核都在一個大內核地址空間上運行。
    • 優勢:簡單、高效。全部內核都在一個大的地址空間上,因此內核各個功能之間的調用和調用函數相似,幾乎沒有性能開銷。
    • 缺點:一個功能的崩潰會致使整個內核沒法使用。
    • 微內核 
      • 內核按功能被劃分紅各個獨立的過程。每一個過程獨立的運行在本身的地址空間上。
      • 優勢:安全。內核的各類服務獨立運行,一種服務掛了不會影響其餘服務。
      • 缺點:內核各個服務之間的調用涉及進程間的通訊,比較複雜且效率低。
      • Linux內核設計
        • ·  基於單內核
        • 具有微內核的一些特徵:模塊化設計、搶佔式內核、支持內核線程、動態裝載內核模塊。
        • 規避微內核設計上的性能缺陷:讓全部事情運行在內核態,直接調用函數,無需消息傳遞。
        • Linux內核特徵
        • 支持動態加載內核模塊

支持對稱多處理(SMP編程

內核能夠搶佔(preemptive),容許內核運行的任務有優先執行的能力安全

不區分線程和進程網絡

5. Linux內核版本

Linux內核有兩種:穩定的(具備工業級的強度,能夠普遍應用和部署)、處於開發中的。架構

Linux命名機制(可用於區分穩定的和處於開發中的內核):併發

若是版本號是偶數,則內核是穩定版;若是是奇數,內核就是開發版。異步

 

 

 

第二章 從內核出發

1、獲取內核源碼

1. Git

git其實是一種開源的分佈式版本控制工具。 Linux做爲一個開源的內核,其源代碼也能夠用git下載和管理分佈式

獲取最新提交到版本樹的一個副本模塊化

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

下載代碼後,更新本身的分支到最新分支

- $ git pull

2.安裝內核源代碼

壓縮形式爲bzip2$ tar xvjf linux-x.y.z.tar.bz2

壓縮形式爲zip$ tar xvzf linux-x.y.z.tar.gz

關於參數:

-x 解開.tar格式的文件

-v 顯示詳細信息

-j 使用bzip2程序

-z 使用gzip程序

-f 使用歸檔文件

3. 使用補丁

從內部源碼樹開始,運行$ patch -p1 < ../patch-x,y,z

2、內核源碼結構

 

3、編譯內核

3.1 配置內核

配置項的二選一和三選一:

二選一:yes 或者 no

三選一:yes 或者 no 或者 modulemodule意味着該配置被選定了,以模塊生成。驅動程序通常都用三選一的配置項)

字符頁面的命令行工具:

make config

 

圖形界面工具:

make menuconfig

 

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

make defconfig 

 

驗證和更新配置:

make oldconfig

3.2 編譯內核

編譯內核:

make

 

重定向到該文件中:

make > .. /detritus

 

把無用的輸出信息重定向到永無返回值的黑洞中:

make > /dev/null

3.3 安裝新內核

將全部已編譯的模塊安裝到正確的主目錄/lib/modules

make modules_install

4、內核開發特色

1. 無libc庫/標準頭文件

緣由:(速度與大小)保證內核高效和簡練。

內核源代碼文件不能包含外部頭文件。 

基本頭文件:內核源代碼頂級目錄下的include中

體系結構相關頭文件:內核源代碼樹的arch/<architecture>/include/asm目錄下

printk()函數:把格式化好的字符串拷貝到內核日誌緩衝區上,syslog程序能夠經過讀取該緩衝區來獲取內核信息。

2. 必須使用GNU C

什麼是GNUGNU是一種操做系統,GNU提供的C編譯器就是咱們以前使用的gcc

(1)內聯函數

static inline void wolf(unsigned long tail_size);

- static:關鍵字

- inline:用於限定關鍵字

內聯函數:編譯時在它被調用的地方展開。 

優勢:減小了函數調用的開銷,性能較好。

缺點:頻繁的使用內聯函數也會使代碼變長,從而在運行時佔用更多的內存。

定義內聯函數特色:時間要求高,自己長度較短的函數。

使用以前就要定義好內聯函數,通常在頭文件中定義。

爲了類型安全和易讀性,優先使用內聯函數而不是複雜的宏。

(2)內聯彙編

unsigned int low, high;

asm volatile("rdtsc" : "=a" (low), "=d" (high));

/* low 和 high 分別包含64位時間戳的低32位和高32位 */

- asm:嵌入彙編代碼

- volatile:不優化

彙編語言用於偏近底層或對執行時間嚴格要求的地方。

(3)分支聲明

/* 若是error在絕大多數狀況下爲0() */

if (unlikely(error)) {

    /* ... */

}

 

/* 若是success在絕大多數狀況下不爲0() */

if (likely(success)) {

    /* ... */

}

對於條件選擇語句,在一個條件常常/不多出現時,編譯器可經過gcc內建的一條指令對條件分支選擇進行優化。

內核把這條指令封裝成了宏。

3. 沒有內存保護機制

內核本身非法訪問內存的風險

內核中的內存都不分頁:每用掉一個字節,物理內存都減小一個

4. 難以執行浮點運算

使用浮點數時,須要人工保存和恢復浮點寄存器及其餘一些繁瑣的操做。

不建議使用

5. 每一個進程只有一個很小的定長堆棧

內核棧的大小是編譯內核時決定的,對於不用的體系結構,內核棧的大小不同,但都是固定的。(不像用戶空間的棧能夠動態增加)

6. 必須時刻注意同步和併發

緣由: 

Linux是搶佔多任務操做系統

內核支持對稱多處理器系統(SMP

中斷異步到來

內核能夠搶佔

經常使用解決方法:自旋鎖和信號量

7. 考慮可移植性的重要性

須要保持的特色:大部分C語言代碼與體系結構無關。

相關文章
相關標籤/搜索