第一章 Linux內核簡介
1.1 Unix的歷史
- Unix很簡潔,僅僅提供幾百個系統調用而且有一個很是明確的設計目的。
- 在Unix中,全部東西都被當作文件,這種抽象使對數據和對設備的操做是經過一套相同的系統調用接口來進行的:open()、read()、write()、lseek()、close()。
- Unix的內核和相關的系統工具軟件都是使用C語言編寫而成,使其在各類硬件體系架構面前都具有使人驚異的移植能力。
- Unix進程建立很是迅速,而且有一個獨特的fork()系統調用。
- Unix提供了一套很是簡單但又很穩定的進程間通訊元語,一次執行保質保量地完成一個任務。簡單穩定的進程間通訊元語把單一目的的程序方便地組合在一塊兒,這種策略和機制分離的理念確保了Unix系統具有清晰的層次化結構。
1.2 Linux簡介
- Linux是類Unix系統,但不是Unix。Linux沒有直接使用Unix的源代碼,但它沒有拋棄Unix的設計目標而且保證了應用程序編程接口的一致。
- Linux內核是自由公開軟件。
- Linux用途普遍,Linux系統的基礎是內核、C庫、工具集和系統的基本工具。通常狀況下Linux這個詞彙主要仍是指內核。
1.3 操做系統和內核簡介
- 操做系統的精肯定義並無一個統一標準。操做系統是整個系統中負責完成最基本功能和系統管理的部分,包括內核、設備驅動程序、啓動引導程序、命令行Shell或者其餘種類的用戶界面、基本的文件管理工具和系統工具。
- 內核纔是操做系統的內在覈心,有時候被稱做管理者或者是操做系統的核心。一般一個內核由負責響應中斷的中斷服務程序、負責管理多個進程從而分享處理器時間的調度程序、負責管理進程地址空間的內存管理程序和網絡、進程之間通訊等系統服務程序共同組成。
- 系統態:擁有受保護的內存空間和訪問硬件設備的全部權限。這種系統態和被保護起來的內存空間,稱爲內核空間。
- 用戶態:執行普通用戶程序時,系統以用戶態進入用戶空間執行。(應用程序在用戶空間執行,只能看到容許它們使用的部分系統資源,並只使用某些特定的系統功能,不能直接訪問系統硬件,也不能訪問其餘的內核劃給別人的內存範圍)
- 系統中運行的應用程序經過系統調用來與內核通訊。
- 中斷機制:當硬件設備想和系統通訊的時候,首先發出一個異步的中斷信號打斷處理器的執行,繼而打斷內核的執行。中斷一般對應一箇中斷號,內核經過中斷號查找相應的中斷服務程序,並調用這個程序響應和處理中斷。
- 咱們能夠將每一個處理器在任何指定時間點上的活動必然歸納爲如下三者之一:
- 運行於用戶空間,執行用戶進程
- 運行於內核空間,處於進程上下文,表明某個特定的進程執行
- 運行於內核空間,處於中斷上下文,與任何進程無關,處理某個特定的中斷
1.4 Linux內核和傳統Unix內核的比較
1.操做系統可分爲兩大陣營:單內核、微內核。第三大陣營是外內核(主要用於科研系統)。linux
2.Linux是一個單內核,至今Linux是模塊化的、多線程的以及內核自己可調度的操做系統。git
3.Linux內核和傳統Unix內核的差別:編程
- Linux支持動態加載內核模塊。
- Linux支持對稱多處理(SMP)機制,傳統的Unix不支持。
- Linux內核能夠搶佔,容許內核運行的任務有優先執行的能力。
- Linux內核不區分線程和其餘的通常進程。
- Linux提供具備設備類的面向對象的設備模型、熱插拔事件,以及用戶空間的設備文件系統。
- Linux忽略了一些被認爲是設計的很拙劣的Unix特性和難以實現的過期標準。
- Linux體現了自由的精髓。
1.5 Linux內核版本
1.Linux內核有兩種:穩定的(具備工業級的強度,能夠普遍應用和部署)、處於開發中的。網絡
2.Linux命名機制:多線程
![](http://static.javashuo.com/static/loading.gif)
若是版本號是偶數,則內核是穩定版;若是是奇數,內核就是開發版。架構
第二章 從內核出發
2.1 獲取內核源碼
-
使用Git併發
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
git pull # 更新分支到Linux的最新分支
-
安裝內核源代碼(若是使用git獲取就不須要下載壓縮文件。)異步
tar xvjf linux-x.y.z.tar.bz2
或者
tar xvzf linux-x.y.z.tar.gz
- 注意:內核源代碼通常安裝在/usr/src/linux目錄下,即便在安裝新內核時,/usr/src/linux目錄應當保證原封不動。
-
使用補丁模塊化
patch -p1 < ../patch-x.y.z
2.2 內核源碼樹
![](http://static.javashuo.com/static/loading.gif)
2.3 編譯內核
2.3.1 配置內核
1.配置項函數
- 二選一:yes 或者 no
- 三選一:yes 或者 no 或者 module(module意味着該配置被選定了,以模塊生成。驅動程序通常都用三選一的配置項)
字符頁面的命令行工具:
make config
圖形界面工具:
make menuconfig
基於默認配置爲體系結構建立一個配置:
make defconfig
驗證和更新配置:
make oldconfig
2.3.2 減小編譯的垃圾信息
編譯內核:
make
重定向到該文件中:
make > .. /detritus
把無用的輸出信息重定向到永無返回值的黑洞dev/null中:
make > /dev/null
2.3.3 安裝新內核
將全部已編譯的模塊安裝到正確的主目錄/lib/modules下
make modules_install
2.4 內核開發的特色
1.內核開發時既不能訪問C庫也不能訪問標準的C頭文件, include/linux文件夾中包含了所需的內核頭文件。
2.內核編程時必須使用GNU C。
-
內聯(inline)函數: 函數會在所調用的位置上展開。 定義時,須要使用static做爲關鍵字,用inline限定它。 內聯函數必須在使用以前就定義好,通常在頭文件中定義。 內核中優先使用內聯函數而不是宏。
-
內聯彙編: 一般使用asm()指令嵌入彙編代碼,用volatile表示不優化
-
分支聲明: unlikely(x) - x不多出現,絕少發生,一般爲假 likely(y) - y常常出現,一般爲真
3.內核編程時缺少像用戶空間那樣的內存保護機制。
4.內核編程時難以執行浮點運算。
5.內核給每一個進程只有一個很小的定長堆棧。
6.因爲內.核支持異步中斷、搶佔和SMP(對稱多處理系統),必須時刻注意同步和併發。
7要考慮可移植性的重要性。