出版時間:2011-5 出版社:人民郵電 作者:(美)羅德里格斯//費(fèi)舍爾//斯莫斯基|譯者:陳莉君//賀炎//劉霞林 頁數(shù):400 譯者:陳莉君 賀炎 劉霞林
Tag標(biāo)簽:無
前言
無論是一般性技術(shù)還是計(jì)算機(jī)技術(shù),對于試圖了解它們的人們來說都具有不可思議的魔力。技術(shù)的發(fā)展使其影響力不斷擴(kuò)大,迫使人們對一些舊的概念重新評估。Linux操作系統(tǒng)已經(jīng)對產(chǎn)業(yè)變革和商業(yè)營銷方式轉(zhuǎn)變做出了巨大貢獻(xiàn)。它采用GNU公共許可證并與GNU軟件良性互動,占據(jù)了中心位置,圍繞開源、自由軟件和開發(fā)社區(qū)思想的各種爭論都離不開它。Linux無疑是一個極其成功的典范,展現(xiàn)了開源操作系統(tǒng)無比強(qiáng)大的力量,其理論的魔力令世界各地的程序員們?nèi)绨V如狂?! τ诖蠖鄶?shù)計(jì)算機(jī)用戶來說,使用Linux正變得越來越方便。有了各種各樣的發(fā)布版、社區(qū)的支持,以及工業(yè)后盾,Linux的應(yīng)用也找到了安全的港灣,出現(xiàn)在大學(xué)、行業(yè)應(yīng)用以及數(shù)以千計(jì)的家庭用戶中。 使用大潮促進(jìn)了技術(shù)支持和新功能需求的日益增長。這樣一來,愈來愈多的程序員發(fā)現(xiàn)自己對Linux內(nèi)核內(nèi)幕感興趣,因?yàn)榇罅楷F(xiàn)有的(還在快速增長的)應(yīng)用需要支持不同的體系結(jié)構(gòu)和種類繁多的新設(shè)備?! ?nèi)核向Power體系結(jié)構(gòu)的成功移植,也助長了Linux操作系統(tǒng)在高端服務(wù)器和嵌入式系統(tǒng)中的全面繁榮。許多公司購買基于Power PC的系統(tǒng)來運(yùn)行Linux,因此越來越多的人需要知道Linux在該體系結(jié)構(gòu)上的運(yùn)行機(jī)理。 適合的讀者 本書的讀者包括初級和經(jīng)驗(yàn)豐富的系統(tǒng)程序員、Linux的熱衷者,以及應(yīng)用程序的開發(fā)者,這些開發(fā)者渴望更好地理解自己的程序到底是如何工作的。只要有C語言知識,熟悉基本的Linux用法,如果想知道Linux如何工作,那么你就會發(fā)現(xiàn)這本書提供了所需的基本知識,可以說,本書是理解Linux內(nèi)核如何工作的初級讀本?! 〔还苣闶侵坏卿涍^Linux并編寫了些小程序,還是你本身就是一個系統(tǒng)程序員,正想深入理解某個子系統(tǒng)的特性,本書都會有你所要的信息?! ?nèi)容組織 本書分為三部分,每部分都提供必要的知識,讓讀者能順利地鉆研Linux內(nèi)幕?! 〉谝徊糠痔峁┍匾墓ぞ吆捅尘埃阌趯inux內(nèi)核展開進(jìn)一步的探索。 第1章回顧了Linux和UNIX的歷史,對比了很多發(fā)布版,并從用戶空間的角度簡述各種內(nèi)核子系統(tǒng)?! 〉?章描述Linux內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)和語言的用法,介紹x86和PowerPC體系結(jié)構(gòu)的匯編語言,并簡述一些工具和實(shí)用程序,可用來獲取理解內(nèi)核內(nèi)幕所需的信息?! 〉诙糠纸榻B了在每個內(nèi)核子系統(tǒng)中所涉及的基本概念,并分析了執(zhí)行子系統(tǒng)功能的代碼?! 〉?章討論了進(jìn)程模型的實(shí)現(xiàn)。本章解釋了為何引入進(jìn)程,并討論了進(jìn)程往返于用戶空間和內(nèi)核空間時的控制流。我們還討論了進(jìn)程在內(nèi)核中是如何實(shí)現(xiàn)的,并描述了與進(jìn)程執(zhí)行相關(guān)的所有數(shù)據(jù)結(jié)構(gòu)。本章還介紹了中斷和異常,描述了這些硬件機(jī)制在每種體系結(jié)構(gòu)中是如何發(fā)生的,它們與Linux內(nèi)核又是如何交互的。 第4章描述了Linux內(nèi)核如何追蹤和管理用戶空間進(jìn)程的可用內(nèi)存和內(nèi)核的可用內(nèi)存。本章描述了內(nèi)核對內(nèi)存分類的方式,以及決定分配和釋放內(nèi)存的方式,也詳細(xì)描述了缺頁機(jī)制以及它怎樣在硬件上執(zhí)行?! 〉?章描述了處理器如何與其他設(shè)備進(jìn)行交互,內(nèi)核又是如何響應(yīng)和控制這些交互的。本章還涵蓋了各種設(shè)備及其在內(nèi)核中的實(shí)現(xiàn)。 第6章概述文件和目錄如何在內(nèi)核中實(shí)現(xiàn)。本章引入了虛擬文件系統(tǒng),它是用于支持多文件系統(tǒng)的抽象層。本章還跟蹤了文件相關(guān)操作的執(zhí)行,如打開和關(guān)閉文件?! 〉?章描述調(diào)度程序的操作,調(diào)度程序讓多個進(jìn)程運(yùn)行起來就像系統(tǒng)中只有一個進(jìn)程在運(yùn)行一樣。本章詳細(xì)描述了內(nèi)核如何選擇執(zhí)行哪一個任務(wù),進(jìn)程切換時如何與硬件進(jìn)行交互。本章還敘述了什么是內(nèi)核搶占,它又是怎樣執(zhí)行的。最后,描述了系統(tǒng)時鐘的工作原理,內(nèi)核怎樣使用它計(jì)時。 第8章描述電源開和關(guān)時都發(fā)生些什么。本章對各種處理器處理內(nèi)核加載的方式進(jìn)行了跟蹤,包括對BIOS、Open Firmware和bootloader的描述。然后,考察了內(nèi)核啟動和初始化時的線性順序,涉及了前面章節(jié)中討論的所有子系統(tǒng)?! 〉谌糠郑枋鋈绾尉幾g內(nèi)核并與內(nèi)核進(jìn)行交互的有效途徑?! 〉?章涵蓋了編譯內(nèi)核所必需的工具鏈和所執(zhí)行的對象文件的格式。還詳細(xì)描述了內(nèi)核源代碼編譯(Kernel Source Build)系統(tǒng)如何運(yùn)作,怎樣把配置選項(xiàng)加入內(nèi)核編譯系統(tǒng)中。 第10章描述了/dev/random操作,這在所有的Linux系統(tǒng)中都可以看到。本章用它來跟蹤設(shè)備,并從更具實(shí)戰(zhàn)性的角度介紹前面各章描述過的概念。最后介紹了如何在內(nèi)核中實(shí)現(xiàn)自己的設(shè)備。 我們的探索方法 本書給讀者介紹了理解內(nèi)核的必要概念。我們遵循自頂向下的方式來組織內(nèi)容,具體體現(xiàn)在以下兩個方面?! ∈紫?,我們把內(nèi)核的機(jī)理和用戶空間操作的執(zhí)行關(guān)聯(lián)起來,因?yàn)樽x者對后者較熟悉,所以我們會將二者結(jié)合起來,解釋內(nèi)核的工作。在可能時,我們從用戶空間的例子說起,并跟蹤代碼的執(zhí)行到內(nèi)核。但有時,這種跟蹤方式并不有效,因?yàn)樾枰冉榻B子系統(tǒng)的數(shù)據(jù)類型和子結(jié)構(gòu),而后才能解釋其工作原理。在這些情況下,我們把對內(nèi)核子系統(tǒng)的解釋和它與用戶空間程序如何聯(lián)系的具體例子結(jié)合起來。有雙重意圖:其一,當(dāng)內(nèi)核一方面與用戶空間打交道,另一方面與硬件打交道時,突出在內(nèi)核中看到的層面;其二,通過跟蹤代碼和事件發(fā)生的順序來解釋子系統(tǒng)的工作原理。我們相信,這有助于讀者將內(nèi)核的工作原理與自己的認(rèn)識匹配起來,也有利于讀者了解一個特定的功能怎樣與操作系統(tǒng)的其余部分產(chǎn)生聯(lián)系?! ∑浯?,我們以自頂向下的角度,考察把數(shù)據(jù)結(jié)構(gòu)視作子系統(tǒng)操作中心,并觀察它們怎樣與系統(tǒng)管理的執(zhí)行行為相聯(lián)系。我們盡力刻畫子系統(tǒng)操作中心的結(jié)構(gòu),并像追蹤子系統(tǒng)的操作一樣持續(xù)關(guān)注這些數(shù)據(jù)結(jié)構(gòu)。 約定 你會在全書中看到源代碼列表。右上角存放有關(guān)源代碼樹根的源文件位置。代碼中的行號是為了方便隨后對代碼進(jìn)行解釋。我們在解釋內(nèi)核子系統(tǒng)及其工作原理時,會不斷引用源代碼并給予解釋?! ∶钚羞x項(xiàng)、函數(shù)名、函數(shù)輸出以及變量名都用代碼體加以區(qū)分。 引入一個新概念時就采用黑體。
內(nèi)容概要
本書以Linux
操作系統(tǒng)為基礎(chǔ),詳細(xì)介紹了Linux 內(nèi)核子系統(tǒng),并輔以大量內(nèi)核源代碼和示例程序進(jìn)行演示,引領(lǐng)讀者深入Linux
內(nèi)核?! ?br /> 本書的主要內(nèi)容包括:Linux 基礎(chǔ)知識、內(nèi)核探索工具集、進(jìn)程的整個生命周期、內(nèi)存區(qū)、頁面、Slab 分配器、用于輸入/
輸出的各種設(shè)備、文件系統(tǒng)、搶占、自旋鎖、信號量、內(nèi)核引導(dǎo)、構(gòu)建Linux
內(nèi)核,以及向內(nèi)核添加代碼等,同時還簡單介紹了一些應(yīng)用工具和實(shí)用程序。每章末尾都給出一些練習(xí),涉及內(nèi)核運(yùn)行的操作及工作原理。
本書適合對Linux 內(nèi)核感興趣的各層次讀者,無論對Linux 初學(xué)者還是Linux
程序開發(fā)人員,本書都是一本很有價值的參考書。
作者簡介
Claudia Salzberg Rodriguez
就職于IBM
Linux技術(shù)中心,負(fù)責(zé)內(nèi)核及相關(guān)編程工具的開發(fā)。在擔(dān)任程序員的10多年時間里,她一直針對Intel和PPC平臺進(jìn)行Linux嵌入式系統(tǒng)到高性能系統(tǒng)的開發(fā)。
Gordon Fischer
曾為很多底層設(shè)備開發(fā)過Linux和Unix設(shè)備驅(qū)動程序,并針對Intel和PPC平臺上的企業(yè)級系統(tǒng)中使用Linux內(nèi)核。
Steven Smolski
有近30年的半導(dǎo)體行業(yè)從業(yè)經(jīng)驗(yàn)。從事過內(nèi)存、處理器以及ASICS的研發(fā)和測試,為Linux、AIX以及Windows都編寫過應(yīng)用程序和驅(qū)動程序,還進(jìn)行過嵌入式操作系統(tǒng)的開發(fā)。
書籍目錄
第1 章 概述
1.1 UNIX 的歷史
1.2 標(biāo)準(zhǔn)和通用接口
1.3 自由軟件和開放源碼
1.4 Linux 發(fā)布版概覽
1.41 Debian
1.42 Red Hat/Fedora
1.43 Mandriva
1.44 SUSE
1.45 Gentoo
1.46 Yellow Dog
1.47 其他發(fā)布版
1.5 內(nèi)核版本信息
1.6 基于Power 的Linux
1.7 什么是操作系統(tǒng)
1.8 內(nèi)核組織
1.9 Linux 內(nèi)核概述
1.9.1 用戶接口
1.9.2 用戶標(biāo)識符
1.9.3 文件和文件系統(tǒng)
1.9.4 進(jìn)程
1.9.5 系統(tǒng)調(diào)用
1.9.6 Linux 調(diào)度程序
1.9.7 Linux 設(shè)備驅(qū)動程序
1.10 可移植性和體系結(jié)構(gòu)的相關(guān)性
1.11 小結(jié)
1.12 習(xí)題
第2 章 內(nèi)核探索工具集
2.1 內(nèi)核中常見的數(shù)據(jù)類型
2.1.1 鏈表
2.1.2 查找
2.1.3 樹
2.2 匯編
2.2.1 PowerPC
2.2.2 x86
2.3 匯編語言示例
2.3.1 x86 中的匯編示例
2.3.2 PowerPC 中的匯編示例
2.4 內(nèi)聯(lián)匯編
2.4.1 輸出操作數(shù)
2.4.2 輸入操作數(shù)
2.4.3 已修改過的寄存器(已修改的元素列表)
2.4.4 參數(shù)的編號方式
2.4.5 約束條件
2.4.6 asm
2.4.7 __volatile__
2.5 特殊的C 語言用法
2.5.1 asmlinkage
2.5.2 UL
2.5.3 內(nèi)聯(lián)
2.5.4 const 和volatile
2.6 內(nèi)核探索工具一覽
2.6.1 objdump/readelf
2.6.2 hexdump
2.6.3 nm
2.6.4 objcopy
2.6.5 ar
2.7 內(nèi)核發(fā)言:傾聽來自內(nèi)核的消息
2.7.1 printk()
2.7.2 dmesg
2.7.3 /var/log/messages
2.8 其他奧秘
2.8.1 __init
2.8.2 likely()和unlikely()
2.8.3 IS_ERR 和PTR_ERR
2.8.4 通告程序鏈
2.9 小結(jié)
2.9.1 項(xiàng)目:Hellomod
2.9.2 第一步:構(gòu)造Linux 模塊的框架
2.9.3 第二步:編譯模塊
2.9.4 第三步:運(yùn)行代碼
2.10 習(xí)題
第3 章 進(jìn)程:程序執(zhí)行的基本模型
3.1 程序
3.2 進(jìn)程描述符
3.2.1 與進(jìn)程屬性相關(guān)的字段
3.2.2 與調(diào)度相關(guān)的字段
3.2.3 涉及進(jìn)程間相互關(guān)系的字段
3.2.4 與進(jìn)程信任狀相關(guān)的字段
3.2.5 與進(jìn)程權(quán)能相關(guān)的字段
3.2.6 與進(jìn)程限制相關(guān)的字段
3.2.7 與文件系統(tǒng)及地址空間相關(guān)的字段
3.3 進(jìn)程的創(chuàng)建:系統(tǒng)調(diào)用fork()、vfork 和clone()
3.3.1 fork()函數(shù)
3.3.2 vfork()函數(shù)
3.3.3 clone()函數(shù)
3.3.4 do_fork()函數(shù)
3.4 進(jìn)程的生命周期
3.4.1 進(jìn)程的狀態(tài)
3.4.2 進(jìn)程狀態(tài)的轉(zhuǎn)換
3.5 進(jìn)程的終止
3.5.1 sys_exit() 函數(shù)
3.5.2 do_exit()函數(shù)
3.5.3 通知父進(jìn)程和sys_wait4()
3.6 了解進(jìn)程的動態(tài):調(diào)度程序的基本構(gòu)架
3.6.1 基本結(jié)構(gòu)
3.6.2 從等待中醒來或者激活
3.7 等待隊(duì)列
3.7.1 添加到等待隊(duì)列
3.7.2 等待事件
3.7.3 喚醒進(jìn)程
3.8 異步執(zhí)行流程
3.8.1 異?! ?br />3.8.2 中斷
3.9 小結(jié)
3.9.1 項(xiàng)目:系統(tǒng)變量current
3.9.2 項(xiàng)目源碼
3.9.3 運(yùn)行代碼
3.10 習(xí)題
第4 章 內(nèi)存管理
4.1 頁
4.2 內(nèi)存管理區(qū)
4.2.1 內(nèi)存管理區(qū)描述符
4.2.2 內(nèi)存管理區(qū)操作輔助函數(shù)
4.3 頁面
4.3.1 請求頁面的函數(shù)
4.3.2 釋放頁面的函數(shù)
4.3.3 伙伴系統(tǒng)
4.4 Slab 分配器
4.4.1 緩存描述符
4.4.2 通用緩存描述符
4.4.3 Slab 描述符
4.5 Slab 分配器的生命周期
4.5.1 與Slab 分配器有關(guān)的全局變量
4.5.2 創(chuàng)建緩存
4.5.3 創(chuàng)建slab 與cache_grow()
4.5.4 Slab 的銷毀:退還內(nèi)存與kmem_cache_destroy()
4.6 內(nèi)存請求路徑
4.6.1 kmalloc()
4.6.2 kmem_cache_alloc()
4.7 Linux 進(jìn)程的內(nèi)存結(jié)構(gòu)
4.7.1 mm_struct
4.7.2 vm_area_struct
4.8 進(jìn)程映像的分布及線性地址空間
4.9 頁表
4.10 缺頁
4.10.1 x86 缺頁異?! ?br />4.10.2 缺頁處理程序
4.10.3 PowerPC 缺頁異常
4.11 小結(jié)
4.12 項(xiàng)目:進(jìn)程內(nèi)存映射
4.13 習(xí)題
第5 章 輸入/輸出
5.1 總線、橋、端口和接口的硬件實(shí)現(xiàn)
5.2 設(shè)備
5.2.1 塊設(shè)備概述
5.2.2 請求隊(duì)列和I/O 調(diào)度
5.2.3 示例:“通用”塊設(shè)備驅(qū)動程序
5.2.4 設(shè)備操作
5.2.5 字符設(shè)備
5.2.6 網(wǎng)絡(luò)設(shè)備
5.2.7 時鐘設(shè)備
5.2.8 終端設(shè)備
5.2.9 直接存儲器存取
5.3 小結(jié)
5.4 項(xiàng)目:創(chuàng)建并口驅(qū)動程序
5.4.1 并口的硬件
5.4.2 運(yùn)行在并口上的軟件
5.5 習(xí)題
第6 章 文件系統(tǒng)
6.1 文件系統(tǒng)的基本概念
6.1.1 文件和文件名
6.1.2 文件類型
6.1.3 文件的附加屬性
6.1.4 目錄和路徑名
6.1.5 文件操作
6.1.6 文件描述符
6.1.7 磁盤塊、磁盤分區(qū)以及實(shí)現(xiàn)
6.1.8 性能
6.2 Linux 虛擬文件系統(tǒng)
6.2.1 VFS 的數(shù)據(jù)結(jié)構(gòu)
6.2.2 全局鏈表和局部鏈表的引用
6.3 與VFS 相關(guān)的結(jié)構(gòu)
6.3.1 fs_struct 結(jié)構(gòu)
6.3.2 files_struct 結(jié)構(gòu)
6.4 頁緩存
6.4.1 address_space 結(jié)構(gòu)
6.4.2 buffer_head 結(jié)構(gòu)
6.5 VFS 的系統(tǒng)調(diào)用和文件系統(tǒng)層
6.5.1 open()
6.5.2 close()
6.5.3 read()
6.5.4 write()
6.6 小結(jié)
6.7 習(xí)題
第7 章 進(jìn)程調(diào)度和內(nèi)核同步
7.1 Linux 的調(diào)度程序
7.1.1 選擇下一個進(jìn)程
7.1.2 上下文切換
7.1.3 讓出CPU
7.2 內(nèi)核搶占
7.2.1 顯式內(nèi)核搶占
7.2.2 隱式用戶搶占
7.2.3 隱式內(nèi)核搶占
7.3 自旋鎖和信號量
7.4 系統(tǒng)時鐘:關(guān)于時間和定時器
7.4.1 實(shí)時時鐘:現(xiàn)在幾點(diǎn)了
7.4.2 讀取PPC 的實(shí)時時鐘
7.4.3 讀取x86 的實(shí)時時鐘
7.5 小結(jié)
7.6 習(xí)題
第8 章 內(nèi)核引導(dǎo)
8.1 BIOS 和Open Firmware
8.2 引導(dǎo)加載程序
8.2.1 GRUB
8.2.2 LILO
8.2.3 PowerPC 和Yaboot
8.3 與體系結(jié)構(gòu)相關(guān)的內(nèi)存初始化
8.3.1 PowerPC 的硬件內(nèi)存管理
8.3.2 基于Intel x86 體系結(jié)構(gòu)的硬件內(nèi)存管理
8.3.3 PowerPC 和x86 的代碼匯集
8.4 原始的RAM 盤
8.5 開始:start_kernel()
8.5.1 調(diào)用lock_kernel()
8.5.2 調(diào)用page_address_init()
8.5.3 調(diào)用printk(linux_banner)
8.5.4 調(diào)用setup_arch
8.5.5 調(diào)用setup_per_cpu_areas()
8.5.6 調(diào)用smp_prepare_boot_cpu()
8.5.7 調(diào)用sched_init()
8.5.8 調(diào)用build_all_zonelists()
8.5.9 調(diào)用page_alloc_init
8.5.10 調(diào)用parse_args()
8.5.11 調(diào)用trap_init()
8.5.12 調(diào)用rcu_init()
8.5.13 調(diào)用init_IRQ()
8.5.14 調(diào)用softirq_init()
8.5.15 調(diào)用time_init()
8.5.16 調(diào)用console_init()
8.5.17 調(diào)用profile_init()
8.5.18 調(diào)用local_irq_enable()
8.5.19 配置initrd
8.5.20 調(diào)用mem_init()
8.5.21 調(diào)用late_time_init()
8.5.22 調(diào)用calibrate_delay()
8.5.23 調(diào)用pgtable_cache_init()
8.5.24 調(diào)用buffer_init()
8.5.25 調(diào)用security_scaffolding_startup()
8.5.26 調(diào)用vfs_caches_init()
8.5.27 調(diào)用radix_tree_init()
8.5.28 調(diào)用signal_init()
8.5.29 調(diào)用page_writeback_init()
8.5.30 調(diào)用proc_root_init()
8.5.31 調(diào)用init_idle()
8.5.32 調(diào)用rest_init()
8.6 init 線程(或進(jìn)程1)
8.7 小結(jié)
8.8 習(xí)題
第9 章 構(gòu)建Linux 內(nèi)核
9.1 工具鏈
9.1.1 編譯程序
9.1.2 交叉編譯
9.1.3 鏈接程序
9.1.4 ELF 二進(jìn)制目標(biāo)文件
9.2 內(nèi)核源代碼的構(gòu)建
9.2.1 解釋源代碼
9.2.2 構(gòu)建內(nèi)核映像
9.3 小結(jié)
9.4 習(xí)題
第10 章 向內(nèi)核添加代碼
10.1 瀏覽源代碼
10.11 熟悉文件系統(tǒng)
10.12 filp 和fops
10.13 用戶空間和內(nèi)核空間
10.14 等待隊(duì)列
10.15 工作隊(duì)列及中斷
10.16 系統(tǒng)調(diào)用
10.17 其他類型的驅(qū)動程序
10.18 設(shè)備模型和sysfs 文件系統(tǒng)
10.2 編寫代碼
10.2.1 設(shè)備基礎(chǔ)
10.2.2 符號輸出
10.2.3 IOCTL
10.2.4 輪詢與中斷
10.2.5 工作隊(duì)列和tasklet
10.2.6 增加系統(tǒng)調(diào)用的代碼
10.3 構(gòu)建和調(diào)試
10.4 小結(jié)
10.5 習(xí)題
媒體關(guān)注與評論
“本書詳細(xì)比較了x86和PPC體系結(jié)構(gòu)下的匯編程序,并介紹了分析工具。非常不錯!” ——亞馬遜讀者評論
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載