《linux内核设计与实现》读书笔记第一、二章
第一章 Linux內核簡介
1.1 Unix的歷史
1971年,Unix被移植到PDP-11型機中。?
1973年,Unix操作系統(tǒng)用C語言改寫——為Unix系統(tǒng)的廣泛移植鋪平了道路。?
1977年,伯克利推出1BSD系統(tǒng)?
1994年,伯克利推出Unix系統(tǒng)的最終官方版——4.4BSD
unix強大的根本原因
(1)簡潔:僅提供系統(tǒng)調用并有一個非常明確的設計目的?
(2)抽象:所有東西都被當做文件對待?
(3)可移植性:使用C語言編寫,可移植能力強?
(4)進程:創(chuàng)建迅速,獨特的fork系統(tǒng)調用 ;?
(5)清晰的層次化結構:一次執(zhí)行保質保量地完成一個任務,策略和機制分離的理念,簡單的進程間通信元語把單一目的的程序方便地組合在一起
1.2 追尋Linux足跡:Linux簡介
1991年,Liunx Torvalds開發(fā)了Linux
Linux的特點:?
(1)是類Unix系統(tǒng),但不是Unix?
(2)沒有拋棄Unix的設計目標并且保證了應用程序編程接口的一致。?
(3)Linux系統(tǒng)的基礎是內核、C庫、工具集和系統(tǒng)的基本工具。
1.3 操作系統(tǒng)和內核簡介
操作系統(tǒng)
是指整個系統(tǒng)中負責完成最基本功能和系統(tǒng)管理的那些部分。包括
內核、設備驅動程序、啟動引導程序、命令行shell或者其他種類的用戶界面、基本的文件管理工具和系統(tǒng)工具。
內核
被稱作是管理者或者操作系統(tǒng)的核心。其組成包括:
(1)響應中斷的中斷服務程序?
(2)管理多個進程,分享處理器時間的調度程序?
(3)管理進程地址空間的內存管理程序
(4)網絡、進程間通信等系統(tǒng)服務程序
每個處理器在任何指定時間點上的活動必然概括為下列三者之一:
- 運行于用戶空間,執(zhí)行用戶進程
- 運行于內核空間,處于進程上下文,代表某個特定的進程執(zhí)行
- 運行于內核空間,處于中斷上下文,與任何進程無關,處理某個特定的中斷
1.4 Linux內核和傳統(tǒng)Unix內核的比較
單內核和微內核設計之比較
Linux的內核雖然是基于單內核的,也具備微內核的一些特征。 主要有以下特征:
- 支持動態(tài)加載內核模塊
- 支持對稱多處理(SMP)
- 內核可以搶占(preemptive),允許內核運行的任務有優(yōu)先執(zhí)行的能力
- 不區(qū)分線程和進程
1.5 Linux內核版本
版本號:2.6.26.1?其中,
2 —— 主版本號?
6 —— 從版本號或副版本號?
26 —— 修訂版本號?
1 —— 穩(wěn)定版本號
副版本號表示這個版本是穩(wěn)定版(偶數(shù))還是開發(fā)版(奇數(shù)),上面例子中的版本號是穩(wěn)定版
1.6 Linux內核開發(fā)者社區(qū)
可以在http://vegr.kernel.org上訂閱郵件。
第二章 從內核出發(fā)
2.1 獲取內核源碼
2.1.1 使用Git
- 獲取最新提交到版本樹的一個副本?
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git - 下載代碼后,更新自己的分支到最新分支?
$ git pull
有了這兩個命令,就可以獲取并隨時保持與內核官方的代碼數(shù)一致。
2.1.1 安裝內核源代碼
內核壓縮以GNU zip和bzip2兩種
- 壓縮形式為bzip2?
運行:$ tar xvjf linux-x.y.z.tar.bz2 - 壓縮形式為zip?
運行:$ tar xvzf linux-x.y.z.tar.gz
注釋(xvjf、xvzf):
- -x 解開;
- -v 顯示詳細信息;
- -j 使用bzip2程序;
- -z 使用gzip程序;
- -f 使用歸檔文件;
內核源碼一般安裝在/usr/src/linux目錄下。
不要以root身份對內核進行修改。
2.1.3 使用補丁
應用增量補丁,從內部代碼樹開始,只需運行
$ patch -p1 < ../patch-x,y,z
2.2 內核源碼樹
| 目錄 | 說明 |
| arch | 特定體系結構的代碼 |
| block | 塊設備I/O層 |
| crypo | 加密API |
| Documentation | 內核源碼文檔 |
| drivers | 設備驅動程序 |
| firmware | 使用某些驅動程序而需要的設備固件 |
| fs | VFS和各種文件系統(tǒng) |
| include | 內核頭文件 |
| init | 內核引導和初始化 |
| ipc | 進程間通信代碼 |
| kernel | 像調度程序這樣的核心子系統(tǒng) |
| lib | 同樣內核函數(shù) |
| mm | 內存管理子系統(tǒng)和VM |
| net | 網絡子系統(tǒng) |
| samples | 示例,示范代碼 |
| scripts | 編譯內核所用的腳本 |
| security | Linux 安全模塊 |
| sound | 語音子系統(tǒng) |
| usr | 早期用戶空間代碼(所謂的initramfs) |
| tools | 在Linux開發(fā)中有用的工具 |
| virt | 虛擬化基礎結構 |
COPYIN:內核許可證;?
CREDITS:內核代碼的開發(fā)者列表;?
MAINTAINTERS:維護者列表——負責維護內核子系統(tǒng)和驅動程序;?
Makefile:是基本內核的Makefile;
2.3 編譯內核
2.3.1 配置內核
1、配置項
(1)二選一:yes/no?
(2)三選一:yes/no/module?
module:選定該配置項但編譯的時候以模塊形式生成(多用于驅動程序)
2、內核配置工具
$ make config 最簡單的一個字符界面下的命令行工具;?
$ make menuconfig 基于ncurse庫的圖形界面工具;?
$ make gconfig 基于gtk+的圖形工具;
3、內核配置命令
make config:遍歷所有配置項,并讓用戶選擇?
make deconfig:按默認的配置?
make oldconfig:在修改過配置文件之后,或者在用已有的配置文件配置新的代碼樹的時候,應該驗證和更新配置。?
zcat /proc/config.gz > .config:從/proc下復制出配置文件并且使用它來編譯一個內核
- 配置選項CONFIGIKCONFIGPROC會把完整的壓縮過的內核配置文件存放在/proc/config.gz中,再次編譯時可以方便地克隆當前的配置。
make:默認的Makefile自動化編譯。
2.3.2 減少編譯的垃圾信息
- 不看錯誤報告和警告信息,對輸出重定向?
$ make > ../detritus - 把無用的輸出信息重定向到永無返回值的黑洞/dev/null中 $ make > /dev/null
2.3.3 衍生多個編譯作業(yè)
- 以多個作業(yè)編譯內核?
$ make -jn?
j:指定同時執(zhí)行多任務;n:要衍生出的作業(yè)數(shù))
2.3.4 安裝新內核
- 模塊的安裝,以root身份,運行?
% make modules_install?
這樣可以把所有已編譯的模塊安裝到正確的主目錄/lib/modules下。 - System.map文件:編譯時在內核代碼樹的根目錄下創(chuàng)建的文件;是一個符號對照表;用來將內核符號與它們的起始地址對應起來。
2.4 內核開發(fā)的特點
Linux內核編程與用戶空間內應用程序開發(fā)的差異
- Linux內核編程時不能訪問C庫
- Linux內核編程時必須使用GNU C
- Linux內核編程時缺乏像用戶空間那樣的內存保護機制。
- Linux內核編程時浮點數(shù)很難使用。
- 內核只有一個很小的定長堆棧。
- 由于內核支持異步中斷、搶占式和SMP,因此必須時刻注意同步和并發(fā)。
- 要考慮可移植性的重要性。
2.4.1 無libc庫抑或無標準頭文件
內核不能使用函數(shù)庫的原因:速度與大小,這些庫對內核來說太大且太低效了。
基本頭文件:內核源代碼頂級目錄下的include中
體系結構相關頭文件:內核源代碼樹的arch//include/asm目錄下?
printk()函數(shù):運行指定一個標志來設置優(yōu)先級,syslogd會根據這個優(yōu)先級標志來決定在什么地方顯示這條系統(tǒng)消息。?
- 優(yōu)先級標志是預處理程序定義的一個描述性字符串,在編譯時優(yōu)先級標志就與要打印的消息綁在一起處理。
2.4.2 GNU C
- 什么是GNU??
GNU是一種操作系統(tǒng),GNU提供的C編譯器就是我們之前使用的gcc。
1、內聯(lián)函數(shù)?
內聯(lián)函數(shù):對時間要求比較高而本身長度比較短,一般定義在頭文件中。
- 定義一個內聯(lián)函數(shù),用static作關鍵字,用inline限定它。?
static inline void wolf(unsigned long tail_size);
在內核中,為了類型安全和易讀性,優(yōu)先使用內聯(lián)函數(shù)而不是復雜的宏。
2、內聯(lián)匯編
匯編語言用于偏近底層或對執(zhí)行時間嚴格要求的地方。
3、分支聲明
對于條件選擇語句,在一個條件經常/很少出現(xiàn)時,編譯器可通過gcc內建的一條指令對條件分支選擇進行優(yōu)化。?
內核把這條指令封裝成了宏。
2.4.3 沒有內存保護機制
內核中發(fā)生的內存錯誤會導致oops
內核中的內存不分頁:每用掉一個字節(jié),物理內存都減少一個
2.4.4 不要輕易在內核中使用浮點數(shù)
與用戶空間進程不同,內核不完美支持浮點操作,因為他本身不能陷入
2.4.5 容積小而固定的棧
內核棧的準確大小隨體系結構而變?
每個體系結構對應的內核棧的大小時固定的,不能動態(tài)增長。
2.4.6 同步和并發(fā)
Linux是搶占多任務操作系統(tǒng)。?
Linux內核支持多處理器系統(tǒng)。?
中斷是異步到來的,完全不顧及當前正在執(zhí)行的代碼。
Linux內核可以搶占。
2.4.7 可移植性的重要性
能提高移植性的準則
保持字節(jié)序?
64位對齊?
不假定字長和頁面長度
小結
1、很喜歡作者把章節(jié)分的很細,每一章節(jié)的內容很短,但又可以把每個部分講解清楚,讀起來不會覺得枯燥不耐煩。?
2、配合這課本的知識講解,使我對網課的學習有了更多的思考,了解到內核,其實和應用程序一樣也是一些代碼(可以用C、java或其他語言編寫),但唯一的區(qū)別就是,他們在物理內存中的組織形式不同,管理方式也不同,內核程序是管理應用程序,并為應用程序服務的。它需要更能加嚴謹?shù)木幋a,要求幾乎100%的無差錯。這是我學習完內核后的一些淺顯的理解。
參考資料
1:《Linux內核設計與實現(xiàn)》(原書第三版)
轉載于:https://www.cnblogs.com/java-stx/p/5284917.html
總結
以上是生活随笔為你收集整理的《linux内核设计与实现》读书笔记第一、二章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最小二乘法的应用(2015A题A题太阳影
- 下一篇: java里面有控制器吗_mvc中 控制器