chapter1 Linux內核簡介
前言:Unix是一個具有相似應用程序編程接口(API)並且基於相似設計理念的操作系統家族。
1.1 Unix的歷史
1.Unix演化版實現了任務管理、換頁機制、TCP/IP等新的特性。
2.Unix的特點:
- Unix很簡潔,僅僅提供幾百個系統調用並且有一個非常明確的設計目的;
- 在Unix中,所有的東西都被當做文件對待。
- Unix的內核和相關的系統工具軟件是用C語言編寫的,具有強大的移植能力
- Unix的進程創建非常迅速,並且有一個非常獨特的fork()系統調用。(ps.關於fork的內容可以參照:鏈接一、鏈接二)
- Unix提供了一套非常簡單但又很穩定的進程間通信元語,快速簡潔的進程創建過程使Unix的程序把目標放在一次執行保質保量地完成一個任務上,簡單穩定的進程間通信機制又使其能夠方便組合,具備清晰的層次化結構。
3.Unix的現狀:成為一種支持搶占式多任務、多線程、虛擬內存、換頁、動態鏈接和TCP/IP的現代化操作系統。
1.2 追尋Linus足跡:Linux簡介
(ps.關於這部分歷史演進可以參照:鏈接三)
1.Linux現在廣泛移植到Alpha、ARM、PowerPC、SPARC、x86-64等其他體系結構之上。
2.Linux是類Unix系統,但不是Unix。Linux沒有直接使用Unix的源代碼,它的實現可能和其他各種Unix的實現大相徑庭,但它沒有拋棄Unix的設計目標並且保證了應用程序編程接口的一致。
3.Linux內核是自由公開軟件,是開源的。
4.Linux的基礎是內核、C庫、工具集和系統的基本工具。Linux這個詞匯在本書中主要還是指內核。
1.3 操作系統和內核簡介
1.操作系統是指在整個系統中負責完成最基本功能和系統管理的部分。包括內核、設備驅動程序、啟動引導程序、命令行shell、其他種類的用戶界面、基本的文件管理工具和系統工具。
2.系統其他部分必須依靠內核這部分軟件提供的服務,內核有時候被稱作管理者或者操作系統核心,負責響應中斷的中斷服務程序,負責管理多個進程從而分享處理器時間的調度程序,負責管理進程地址空間的內存管理程序和網絡和網絡、進程間通信等系統服務程序.
3.內核一般處於系統態,擁有受保護的內存空間和訪問硬件設備的所有權限,這種系統態和被保護起來的內存空間,統稱為內核空間。
4.內核負責管理系統的硬件設備,即提供了中斷機制。當硬件設備和系統通信時,先發出一個一部的中斷信號去打斷處理器的執行,繼而打斷內核的執行。內核再根據產生的中斷號查找相應的中斷服務程序,調用這個程序響應和處理中斷。
Linux的中斷服務程序不在進程上下文中執行,而是在一個與所有進程都無關的、專門的中斷上下文中進行,這樣可以保證中斷服務程序能夠在第一時間響應和處理中斷請求,然后快速地退出。
上下文表示着內核的活動范圍。將每個處理器在任何指定時間點上的活動概括如下:
運行於用戶控件,執行用戶進程 運行於內核控件,處於進程上下文,代表某個特定的進程執行 運行於內核控件,處於中斷上下文,與任何進程無關,處理某個特定的中斷。
1.4 Linux內核和傳統Unix內核的比較
1.Unix內核是一個不可分割的靜態可執行庫。必須以巨大、單獨的可執行塊的形式在一個單獨的地址空間中運行。Unix內核通常需要硬件系統提供頁機制(MUU)來管理內存。這樣可以加強對內存空間的保護保證每個進程都而已運行於不同的虛地址空間上。
2.單內核與微內核設計的比較
操作系統內核可以分為兩大陣營:單內核和微內核
1.單內核就是把它從整體上作為一個單獨的大過程來實現、同時也運行在一個單獨的地址空間上。內核通常以單個靜態二進制文件的形式存放在磁盤中。
內核間通信、內核調用函數等與用戶空間應用程序無異。
2.微內核的功能被划分為多個獨立過程,每個過程稱為服務器。微內核通信通過消息傳遞處理,即采用了進程間通信機制(IPM)。用於互換“服務”。服務器的獨立自主有效地避免了一個服務器的失效禍及另一個,同樣,模塊化得系統允許一個服務器為了另一個服務器而換出。
- (ps.關於進程間通信部分的內容可以參考:鏈接四)
3.Linux是一個單內核,但也吸收了微內核的精華(模塊化設計、搶占式內核、支持內核線程、動態裝載內核模塊)。即它是模塊化的,多線程的以及內核本身可調度的操作系統。
1.5 Linux內核版本
1.Linux通過一個簡單的命名機制來區分穩定的和處於開發中的內核。即用三個護着四個用“.”分割的數字來代表不同內核版本。第一個數字是朱版本號,第二個數字是從版本號,第三個數字是修訂版本號,第四個可選的數字為穩定版本號。
2.從副版本號可以反映出該內核是一個穩定版本還是一個處於開發中的版本:如果數字為偶數,即是穩定版內核;若是奇數,則是開發版內核。
chapter2 從內核出發
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內核源碼樹
2.3 編譯內核
1.配置內核
配置項的二選一和三選一:
二選一:yes 或者 no
三選一:yes 或者 no 或者 module(module意味着該配置被選定了,以模塊生成。驅動程序一般都用三選一的配置項)
字符頁面的命令行工具:
make config
圖形界面工具:
make menuconfig
基於默認配置為體系結構創建一個配置:
make defconfig
驗證和更新配置:
make oldconfig
2.編譯內核
編譯內核:
make
重定向到該文件中:
make > .. /detritus
把無用的輸出信息重定向到永無返回值的黑洞中:
make > /dev/null
3. 安裝新內核
將所有已編譯的模塊安裝到正確的主目錄/lib/modules下
make modules_install
2.4 內核開發的特點
- 內核開發時既不能訪問C庫也不能訪問標准的C頭文件 (解決方法:include/linux文件夾中包含了所需的內核頭文件。)
-
內核編程時必須使用GNU C
-
內聯函數: 函數會在所調用的位置上展開。 定義時,需要使用static作為關鍵字,用inline限定它。 內聯函數必須在使用之前就定義好,一般在頭文件中定義。 內核中優先使用內聯函數而不是宏。
-
內聯匯編: 通常使用asm()指令嵌入匯編代碼,用volatile表示不優化
- 分支聲明: unlikely(x) - x很少出現,絕少發生,通常為假 likely(y) - y經常出現,通常為真
-
內核編程時缺乏像用戶空間那樣的內存保護機制
- 內核編程時難以執行浮點運算
- 內核給每個進程只有一個很小的定長堆棧
- 由於內核支持異步中斷、搶占和SMP(對稱多處理系統),必須時刻注意同步和並發。(常用的解決競爭的方法:自旋鎖和信號量)。
- 要考慮可移植性的重要性(諸如保持字節序,64位對其,不假定字長和頁面長度等。)
chapter 3 遇到的問題及解決辦法
問題:我重新裝了一個Ubuntu的虛擬機。在倒騰的過程中發現根據書中第二章的命令無法同步git中的代碼。甚至提示我未安裝git。我使用sudo apt-get install git的時候也報錯。
解決辦法:我認為是代碼源不正確。因此百度了更換代碼源的方法。將us的代碼源改成cn的了。
將方法附在此:
用vi和gedit 打開 /etc/apt/sources.list 。
將其中的us.archive 全部替換為 cn.archive,這樣,以后使用apt-get下載就會使用源自http://cn.archive.ubuntu.com 了。
使用vi編輯器的命令為(注意首先切換到root用戶):
root@ubuntu :/#vi /etc/apt/sources.list
打開sources.list。
在vi命令模式下(進入后即是命令行模式,按i后才可進入編輯模式,不過這里不需要編輯模式),輸入
:%s/us.archive/cn.archive/g
這樣,就將apt-get的源更改為國內的源了。
下面必須重起下apt-get,輸入命令:
apt-get update
chapter4 總結
這篇博客是對教材《Linux內核設計與分析》的一個閱讀記錄。比起看視頻來說,對照書本的學習我個人比較習慣,因為視頻中的部分講解感覺並沒有講的很清楚,有時候講師也是含含糊糊就過去了。有時候覺得自己看完了視頻沒有學到很多,認為是自己的問題又倒回去反反復復看了幾遍,這樣一來花費了很多時間。而看書的話,我覺得對一些概念性的東西講的更多。我認為一年多以來婁老師、劉老師的教導方式的磨練下,我已經漸漸明白對於我個人來說,視頻更多的是教會我如何時候用計算機操作實踐,網上實驗樓的平台也非常好用,不用再課下總是倒騰裝軟件搭平台。雖然說這種操作很實用,但是如果每學一門課,每做一個實驗就要花上好多時間來裝東西真的很費心費力,特別是在學校的網絡下來說特別吃力。因此我非常依賴於實驗樓這個平台。
另外,這學期還未開學我就開始跟慕課視頻,個人感覺還是比較認真的。但是老師上課的時候有時候會聽的雲里霧里,感覺視頻聽懂了上課卻又有很多補充的東西沒聽懂。就像是這一秒鍾沒聽懂之后就都是&……%¥#@的感覺。讓我很有挫敗感。實驗也是做了之后並不知道一些命令是什么意思。課下功夫非常多。還有博客寫完之后我會去看看身邊大神的筆記然后再來對照自己的筆記。覺得大家記錄都差不多,但是體會就差很多。老師的評論也讓我有些恍惚。似乎是感覺自己學的和別的同學不是在一個水平上。有一種老師對我的學習比較擔憂的感覺?
但是老師給我的問題會讓我更重視一些問題的理解,每每老師留了問題我就會倒回去看看我對這部分問題的記錄和理解,然后再查點資料再來補充一下。生怕答得有偏差?總之,接下來的學習我覺得會更加重視博客的質量,多和其他同學交流學習一下優秀博客的心得。