內容簡介
本書對早期Linux內核(v0.12)全部代碼文件進行瞭詳細、全麵的注釋和說明,旨在幫助讀者用較短的時間對Linux的工作機理獲得全麵而深刻的理解,為進一步學習和研究Linux打下堅實的基礎。雖然選擇的版本較低,但該內核已能夠正常編譯運行,並且其中已包括瞭Linux工作原理的精髓。書中首先以Linux源代碼版本的變遷為主綫,介紹瞭Linux的曆史,同時著重說明瞭各個內核版本的主要區彆和改進,給齣瞭選擇0.12版內核源代碼作為研究對象的原因。在正式描述內核源代碼之前,概要介紹瞭運行Linux的PC的硬件組成結構、編製內核使用的匯編語言和C語言擴展部分,並且重點說明瞭80x86處理器在保護模式下運行的編程方法。接著詳細介紹瞭Linux內核源代碼目錄樹組織結構,並依據該結構對所有內核程序和文件進行瞭注釋和詳細說明。有關代碼注釋的章節安排基本上都分為具體研究對象的概述、每個文件的功能介紹、代碼內注釋、代碼中難點及相關資料介紹等部分。為瞭加深讀者對內核工作原理的理解,書中最後一章給齣瞭圍繞Linux 0.12係統的多個試驗。
本書適閤Linux愛好者作為學習內核工作原理的自學參考書籍,也適閤作為高校計算機專業學生學習操作係統課程的輔助和實踐教材,還可供一般技術人員作為開發嵌入式係統的參考書使用。
目錄
序
第1章 概述
1.1 Linux的誕生和發展
1.1.1 UNIX操作係統的誕生
1.1.2 MINIX操作係統
1.1.3 GNU計劃
1.1.4 POSIX標準
1.1.5 Linux操作係統的誕生
1.1.6 Linux操作係統版本的變遷
1.1.7 Linux名稱的由來
1.1.8 早期Linux係統開發的主要貢獻者
1.2 內容綜述
1.3 本章小結
第2章 微型計算機組成結構
2.1 微型計算機組成原理
2.2 I/O端口尋址和訪問控製方式
2.2.1 I/O端口和尋址
2.2.2 接口訪問控製
2.3 主存儲器、BIOS和CMOS存儲器
2.3.1 主存儲器
2.3.2 基本輸入/輸齣程序BIOS
2.3.3 CMOS存儲器
2.4 控製器和控製卡
2.4.1 中斷控製器
2.4.2 DMA控製器
2.4.3 定時/計數器
2.4.4 鍵盤控製器
2.4.5 串行控製卡
2.4.6 顯示控製
2.4.7 軟盤和硬盤控製器
2.5 本章小結
第3章 內核編程語言和環境
3.1 as86匯編器
3.1.1 as86匯編語言語法
3.1.2 as86匯編語言程序
3.1.3 as86匯編語言程序的編譯和鏈接
3.1.4 as86和1d86使用方法和選項
3.2 CNU as匯編
3.2.1 編譯as匯編語言程序
3.2.2 as匯編語法
3.2.3 指令語句、操作數和尋址
3.2.4 區與重定位
3.2.5 符號
3.2.6 as匯編命令
3.2.7 編寫16位代碼
3.2.8 AS匯編器命令行選項
3.3 C語言程序
3.3.1 C程序編譯和鏈接
3.3.2 嵌入匯編
3.3.3 圓括號中的組閤語句
3.3.4 寄存器變量
3.3.5 內聯函數
3.4 C與匯編程序的相互調用
3.4.1 C函數調用機製
3.4.2 在匯編程序中調用C函數
3.4.3 在C程序中調用匯編函數
3.5 Linux 0.12目標文件格式
3.5.1 目標文件格式
3.5.2 Linux0.12中的目標文件格式
3.5.3 鏈接程序輸齣
3.5.4 鏈接程序預定義變量一
3.5.5 System.map文件
3.6 Make程序和Makefile文件
3.6.1 Makefite文件內容
3.6.2 Makefile文件中的規則
3.6.3 Makefile文件示例
3.6.4 make處理Makefile文件的方式
3.6.5 Makefile中的變量
3.6.6 讓make自動推斷命令
3.6.7 隱含規則中的自動變量
3.7本章 小結
第4章 80x86保護模式及其編程
4.1 80x86係統寄存器和係統指令
4.1.1 標誌寄存器
4.1.2 內存管理寄存器
4.1.3 控製寄存器
4.1.4 係統指令
4.2 保護模式內存管理
4.2.1 內存尋址
4.2.2 地址變換
4.2.3 保護
4.3 分段機製
4.3.1 段的定義
4.3.2 段描述符錶
4.3.3 段選擇符
4.3.4 段描述符
4.3.5 代碼和數據段描述符類型
4.3.6 係統描述符類型
4.4 分頁機製
4.4.1 頁錶結構
4.4.2 頁錶項格式
4.4.3 虛擬存儲
4.5 保護
4.5.1 段級保護
4.5.2 訪問數據段時的特權級檢查
4.5.3 代碼段之間轉移控製時的特權級檢查
4.5.4 頁級保護
4.5.5 組閤頁級和段級保護
4.6 中斷和異常處理
4.6.1 異常和中斷嚮量
4.6.2 中斷源和異常源
4.6.3 異常分類
4.6.4 程序或任務的重新執行
4.6.5 開啓和禁止中斷
4.6.6 異常和中斷的優先級
4.6.7 中斷描述符錶
4.6.8 IDT描述符
4.6.9 異常與中斷處理
4.6.10 中斷處理任務
4.6.11 錯誤碼
4.7 任務管理
4.7.1 任務的結構和狀態
4.7.2 任務的執行
4.7.3 任務管理數據結構
4.7.4 任務切換
4.7.5 任務鏈
4.7.6 任務地址空間
4.8 保護模式編程初始化
4.8.1 進入保護模式時的初始化操作
4.8.2 模式切換
4.9 一個簡單的多任務內核實例
4.9.1 多任務程序結構和工作原理
4.9.2 引導啓動程序boot.s
4.9.3 多任務內核程序head.s
第5章 Linux內核體係結構
5.1 Linux內核模式
5.2 Linux內核係統體係結構
5.3 Linux內核對內存的管理和使用
5.3.1 物理內存
5.3.2 內存地址空間概念
5.3.3 內存分段機製
5.3.4 內存分頁管理
5.3.5 CPu多任務和保護方式
5.3.6 虛擬地址、綫性地址和物理地址之間的關係
5.3.7 用戶申請內存的動態分配
5.4 中斷機製
5.4.1 中斷操作原理
5.4.2 80x86微機的中斷子係統
5.4.3 中斷嚮量錶
5.4.4 I.inux內核的中斷處理
5.4.5 標誌寄存器的中斷標誌
5.5 Linux的係統調用
5.5.1 係統調用接口
5.5.2 係統調用處理過程
5.5.3 Linux係統調用的參數傳遞方式
5.6 係統時間和定時
5.6.1 係統時間
5.6.2 係統定時
5.7 Linux進程控製
5.7.1 任務數據結構
5.7.2 進程運行狀態
5.7.3 進程初始化
5.7.4 創建新進程
5.7.5 進程調度
5.7.6 終止進程
5.8 Linux係統中堆棧的使用方法
5.8.1 初始化階段
5.8.2 任務的堆棧
5.8.3 任務內核態堆棧與用戶態堆棧之間的切換
5.9 Linux0.12采用的文件係統
5.10 Linux內核源代碼的目錄結構
5.10.1 內核主目錄linux
5.10.2 引導啓動程序目錄boot
5.10.3 文件係統目錄fs
5.10.4 頭文件主目錄include
5.10.5 內核初始化程序目錄init
5.10.6 內核程序主目錄kernel
5.10.7 內核庫函數目錄lib
5.10.8 內存管理程序目錄mm
5.10.9 編譯內核工具程序目錄tools
5.1l 內核係統與應用程序的關係
5.12 linux/MakeftIe文件
5.12.1 功能描述
5.12.2 代碼注釋
5.13 本章 小結
第6章 引導啓動程序
6.1 總體功能
6.2 bootsect.S程序
6.2.1 功能描述
6.2.2 代碼注釋
6.2.3 其他信息
6.3 setup.S程序
6.3.1 功能描述
6.3.2 代碼注釋
6.3.3 其他信息
6.4 lead.s程序
6.4.1 功能描述
6.4.2 代碼注釋
6.4.3 其他信息
6.5 本章 小結
第7章 初始化程序
7.1 main.c程序
7.1.1 功能描述
7.1.2 代碼注釋
7.1.3 其他信息
7.2 環境初始化工作
7.3 本章 小結
第8章 內核代碼
8.1 總體功能
8.1.1 中斷處理程序
8.1.2 係統調用處理相關程序
8.1.3 其他通用類程序
8.2 asm.s程序
8.2.1 功能描述
8.2.2 代碼注釋
8.2.3 Intel保留中斷嚮量的定義
8.3 traps.c程序
8.3.1 功能描述
8.3.2 代碼注釋
8.4 syscall.s程序
8.4.1 功能描述
8.4.2 代碼注釋
8.4.3 其他信息
8.5 mktime.c程序
8.5.1 功能描述
8.5.2 代碼注釋
8.5.3 閏年的計算方法
8.6 sched.c程序
8.6.1 功能描述
8.6.2 代碼注釋
8.6.3 其他信息
8.7 signal.c程序
8.7.1 功能描述
8.7.2 代碼注釋
8.7.3 進程信號說明
8.8 exit.c程序
8.8.1 功能描述
8.8.2 代碼注釋
8.9 fork.c程序
8.9.1 功能描述
8.9.2 代碼注釋
8.9.3 任務狀態段信息
8.10 sys.c程序
8.10.1 功能描述
8.10.2 代碼注釋
8.1l vsprimtfc程序
8.11.1 功能描述
8.11.2 代碼注釋
8.11.3 vsprintf的格式字符串
8.11.4 與當前版本的區彆
8.12 printk.c程序
8.12.1 功能描述
8.12.2 代碼注釋
8.13 panic.c程序
8.13.1 功能描述
8.13.2 代碼注釋
8.14 本章 小結
第9章 塊設備驅動程序
9.1 總體功能
9.1.1 塊設備請求項和請求隊列
9.1.2 塊設備訪問調度處理
9.1.3 塊設備操作方式
9.2 blk.h文件
9.2.1 功能描述
9.2.2 代碼注釋
9.3 hd.c程序
9.3.1 功能描述
9.3.2 代碼注釋
9.3.3 其他信息
9.4 nrwblk.c程序
9.4.1 功能描述
9.4.2 代碼注釋
9.5 ramdisk.c程序
9.5.1 功能描述
9.5.2 代碼注釋
9.6 floppy.c程序
9.6.1 功能描述
9.6.2 代碼注釋
9.6.3 其他信息
第10章 字符設備驅動程序
10.1 總體功能
10.1.1 終端驅動程序基本原理
10.1.2 Linux支持的終端設備類型
10.1.3 終端基本數據結構
lO.1.4 規範模式和非規範模式
10.1.5 控製颱終端和串行終端設備
10.1.6 終端驅動程序接口
10.2 keyboard.S程序
10.2.1 功能描述
10.2.2 代碼注釋
10.2.3 其他信息
10.3 console.c程序
10.3.1 功能描述
10.3.2 代碼注釋
10.3.3 其他信息
10.4 serial.c程序
10.4.l 功能描述
10.4.2 代碼注釋
lO.4.3 異步串行通信控製器UART
10.5 rsio.s程序
10.5.1 功能描述
10.5.2 代碼注釋
10.6 ttyi0.c程序
10.6.1 功能描述
10.6.2 代碼注釋
10.6.3 控製字符vnME、VMlN
10.7 ttyjoctl.c程序
10.7.1 功能描述
10.7.2 代碼注釋
第11章 數學協處理器
第12章 文件係統
第13章 內存管理
第14章 頭文件
第15章 庫文件
第16章 建造工具
第17章 實驗環境設置與使用方法
附錄
參考文獻
精彩書摘
第1章 概述
本章首先迴顧瞭Linux操作係統的誕生、開發和成長過程,由此讀者可以理解本書選擇Linux係統早期版本作為學習對象的一些原因;然後具體說明瞭選擇早期Linux內核版本進行學習的優點和不足之處以及如何開始進一步學習;最後對各章的內容進行瞭簡要介紹。
1.1 Linux的誕生和發展
Linux操作係統是UNIX操作係統的一種剋隆係統。它誕生於1991年10月5日(這是第一次正式嚮外公布的時間)。此後藉助於Internet網絡,經過全世界計算機愛好者的共同努力,現已成為當今使用最多的一種UNIX類操作係統,並且使用人數還在迅猛增長。
Linux操作係統的誕生、發展和成長過程依賴於以下五個重要支柱:UNIX操作係統、MINIX操作係統、GNU計劃、POSIX標準和Internet。下麵根據這五個基本綫索來迴顧一下Linux的醞釀過程、開發曆程以及最初的發展。首先分彆介紹其中的四個基本要素,然後根據Linux的創始人Linus Torvalds從對計算機感興趣而自學計算機知識,到心裏開始醞釀編製一個自己的操作係統,到最初Linux內核0.O1版公布以及從此如何艱難地一步一個腳印地在全世界黑客的幫助下推齣比較完善的1.0版本這段經過,對Linux的早期發展曆史進行詳細介紹。
當然,目前Linux內核版本已經開發到瞭2.6.X版。而大多數Linux係統中所用到的內核是穩定的2.6.12版內核(其中第2個數字若是奇數則錶示正在開發的版本,不能保證係統的穩定性)。對於Linux的一般發展史,許多文章和書籍都有介紹,這裏不再重復。
1.1.1 UNIX操作係統的誕生
UNIX操作係統最早是美國貝爾實驗室的Ken Thompson於1969年夏在DEC PDP-7小型計算機上開發的一個分時操作係統。
Ken Thompson為瞭能在閑置不用的PDP-7計算機上運行他非常喜歡的星際旅行(Star Trek)遊戲,於1969年夏天趁他夫人迴傢鄉加利福尼亞度假期間,在一個月內開發齣瞭UNIX操作係統的原型。當時使用的是BCPL語言(基本組閤編程語言),後經Dennis Ritchie於1972年用移植性很強的C語言進行瞭改寫,使得UNIX係統在大學得到瞭推廣。
前言/序言
本書是一本有關Linux操作係統內核基本工作原理的入門讀物。
本書的主要目標
本書的主要目標是使用盡量少的篇幅,對完整的Linux內核源代碼進行解剖,使讀者對操作係統的基本功能和實際實現方式獲得全方位的理解。
本書讀者應是知曉Linux係統的一般使用方法或具有一定的編程基礎,但比較缺乏閱讀目前最新內核源代碼的基礎知識,又急切希望能夠進一步理解IJNIX類操作係統內核工作原理和實際代碼實現的愛好者。這部分讀者的水平應該界於初級與中級水平之間。目前,這部分讀者人數在Linux愛好者中所占的比例是很高的,而麵嚮這部分讀者以比較易懂和有效的手段講解內核的書籍資料不多。 現有書籍不足之處 目前已有的描述Linux內核的書籍,均盡量選用最新Linux內核版本(例如Fedora 8使用的2.6.24穩定版等)進行描述,但由於目前Linux內核整個源代碼的大小已經非常大(例如2.2.20版就已具有268萬行代碼!),因此這些書籍僅能對LJnux內核源代碼進行選擇性或原理性的說明,許多係統實現細節被忽略。因此並不能使讀者對實際L,inux內核有清晰而完整的理解。
Scott Maxwell的《Linux內核源代碼分析》基本上是麵對Linux中、高級水平的讀者,需要較為全麵的基礎知識纔能完全理解。而且可能是由於篇幅所限,該書並沒有對所有Linux內核代碼進行注釋,略去瞭很多內核實現細節,例如內核中使用的各個頭文件(*.h)、生成內核代碼映像文件的工具程序、各個make文件的作用和實現等均沒有涉及。因此對於處於初、中級水平之間的讀者來說閱讀該書有些睏難。
John Lions的《萊昂氏LINIX源代碼分析》雖然是一本學習UNIX類操作係統內核源代碼很好的書,但是由於其采用的是UNIX V6版,其中係統調用等部分代碼是用早已廢棄的PDP.11係列機的匯編語言編製的,因此在閱讀和理解與硬件部分相關的源代碼時就會遇到較大的睏難。
A.S.Tanenbaum的《操作係統:設計與實現》是有關操作係統內核實現很好的入門書籍,但該書所敘述的M1NⅨ係統是一種基於消息傳遞的內核實現機製,與IAnux內核的實現有所區彆。因此在學習該書之後,並不能很順利地即刻著手進一步學習較新的Linux內核源代碼實現。
在使用這些書籍進行學習時會有一種“盲人摸象”的感覺,不容易真正理解Linux內核係統具體實現的整體概念,尤其是對那些Linux係統初學者,或剛學會如何使用Linux係統的人在使用那些書學習內核原理時,內核的整體運作結構並不能清晰地在腦海中形成。這在本人多年的Linux內核學習過程中也深有體會。在1991年10月,Linux的創始人Linus’Forvalds在開發齣Linux 0.03版後寫的一篇文章中也提到瞭同樣的問題。在這篇題為《IJnux-aFree unix.386Kernel》目的文章中,他說:“開發Linux是為瞭那些操作係統愛好者和計算機科學係的學生使用、學習和娛樂”。“自由軟件基金會的GN2J Hurd係統如果開發齣來就已經顯得太龐大而不適閤學習和理解。”
Linux內核完全剖析:基於0.12內核 下載 mobi epub pdf txt 電子書 格式