第一章 Linux內核簡介linux
1.Unixshell
(1)Unix系統很簡潔編程
(2)在Unix中,因此東西都被看成文件對待,經過一套相同的系統調用接口來進行:open(),read(),write(),lseek(),close()緩存
(3)用C語言編寫而成,移植能力強服務器
(4)進程建立迅速,有fork()系統調用多線程
(5)提供了一套很是簡單但很穩定的系統元語併發
目標:一次執行保質保量完成一個任務異步
2.Linux分佈式
沒有拋棄Unix的設計目標而且保證了應用程序編程接口的一致模塊化
Linux是一個非商業化產品
Linux內核是自由軟件
基礎:內核,C庫,工具集,系統的基本工具(登陸程序,shell)
Linux這個詞彙主要仍是指內核
3.操做系統和內核
操做系統:整個系統中負責完成最基本功能和系統管理的那些成分,包括內核、設備驅動程序、啓動引導程序、命令行shell
系統:操做系統和全部運行在它之上的應用程序
內核:中斷服務程序、調度程序、內存管理程序、系統服務程序
內核空間:系統態和被保護起來的內存空間
應用程序經過系統調用和內核通訊,應用程序調用庫函數,再由庫函數經過系統調用界面
中斷機制:
中斷一般對應着一箇中斷號,內核經過中斷號查找中斷服務程序,並調用這個程序響應和處理中斷
因此中斷處理程序,都不在進程上下文中執行,而在中斷上下文中執行
這些上下文表明着內核活動範圍
應用程序完成其工做的基本行爲方式是:
應用程序經過系統調用界面陷入內核。
處理器的活動必然其下三者之一:
4.Linux內核和Unix傳統內核的比較
Unix內核是不可分割的靜態可執行庫,必須以可執行塊的形式在一個單獨的地址空間運行,經過頁機制管理內存
這裏涉及到了單內核和微內核的概念
單內核:做爲一個單獨的大過程實現,運行在一個單獨的地址空間上,以單個靜態二進制文件的形式存放在磁盤中
微內核:多個獨立的過程,每一個過程叫作一個服務器,只有強烈請求特權服務的服務器運行在特權模式下,其餘服務器都運行在獨立的空間,因此服務器 保存獨立並運行在各自的地址空間,經過消息傳遞處理通訊(IPC機制)
Linux是一個單內核,讓全部事物都運行在內核態,直接調用函數
Linux是模塊化的、多線程的以及內核自己可調度的操做系統
Linux支持動態加載內核模塊
Linux支持堆成處理機制
Linux內核能夠搶佔
Linux內核不區分線程和其餘的通常進程
……
5.版本
Linux內核有兩種:穩定的、處於開發中的
X.y.z.a
X是主版本號,y從版本號,z修訂版本號,a穩定版本號
副版本號是奇數,開發版,是偶數,穩定版
重點放在穩定性上
第二章 從內核出發
1.獲取內核源碼
Linux內核的官方網站:http://www.kernel.org
Kernel.org是源代碼的庫存之處
Git:管理Linux內核源代碼,分佈式
安裝內核源代碼
內核壓縮有兩種形式:GUN zip(gzip)和bzip2
bzips是默認和首選形式,以這個形式發佈的Linux內核叫作linux-x.y.z.tar.bz2,x.y.z是具體版本
內核源碼通常安裝在/usr/src/linux目錄下
使用補丁
$ patch –p1 < ../patch-x.y.z
2.內核源碼樹
源碼樹的根目錄和子目錄
COPYING文件是內核許可證
CREDITS是開發了不少內核代碼的開發者列表
MAINTAINERS是維護者列表
Makefile是基本內核的Makefile
3.編譯內核
(1)配置內核
前綴 CONFIG
配置選項既能夠用來決定哪些文件編譯進內核,也能夠經過預處理命令處理代碼
二選一 yes or no
三選一 yes or no or module(以模塊的形式生成)
yes:把代碼編譯進主內核映像中
字符界面下得命令行工具
$ make config
基於gtk+的圖形工具
$ make gconfig
基於ncurse庫的圖形界面工具
$ make menuconfig
基於默認配置
$ make degconfig
驗證和更新配置
$ make oldconfig
配置選項CONFIG_IKCONFIG_PROC把壓縮內核配置文件放在/proc/config.gz下
編譯一個新內核
$ zcat /proc/config.gz > .config
$ make oldconfig
編譯:
$ make
(2)減小編譯垃圾
重定向:
$ make > .. /detritus
送去黑洞:
$ make > /dev/null
(3)衍生多個編譯做業
通常make只衍生一個做業
以多個做業編譯內核:
$ make -jn(n是要衍生出的做業數)
(4) 安裝新內核
取決於系統結構和啓動引導工具
安裝:
$ make modules_install
在根目錄下建立一個System.map文件,這是一個符號對照表,將內核符號和起始地址對應起來
4.內核開發的特色
(1)內核編程不能訪問C庫或C頭文件
主要緣由是速度和大小
頭文件:
指的是內核頭文件
(2)內核編程必須使用GUN C
內聯函數:
函數會在所調用的位置展開,不過會佔用更多的內存空間或佔用更多的指令緩存
內聯函數必須在使用以前就定義好
優先使用內聯函數
內聯彙編:
在C代碼中嵌入彙編指令
一般使用asm()指令嵌入
分支聲明:
對應條件選擇語句,內核根據其機率對其進行優化,封裝成宏
(3)內核編程缺少像用戶空間那樣的內存保護機制
內核出現錯誤,發送SIGSEGV信號結束進程
內存錯誤會致使oops
內核中的內存都不分頁
(4)內存編程難以執行浮點運算
(5)內核給每一個進程很小的定長堆棧
能夠從棧中分配大量空間來存放變量
(6)內核支持異步中斷、搶佔和SMP,同步和併發
Linux是搶佔多任務操做系統
LInux內核支持對稱多處理系統
中斷是異步的
Linux內核能夠搶佔
解決方法:自旋鎖、信號量
(7)可移植性的重要性
必須把與體系結構相關的代碼從內核代碼樹的特定目錄中適當的分離出來