圖解Linux內(nèi)核(基于6.x) 姜亞華
定 價:139 元
- 作者:姜亞華
- 出版時間:2024/5/1
- ISBN:9787111745471
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:TP316.85-64
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
全書共五篇,以從易到難的順序詳細剖析了Linux內(nèi)核開發(fā)的核心技術(shù)!爸R儲備篇”介紹了Linux的數(shù)據(jù)結(jié)構(gòu)、中斷處理、內(nèi)核同步和時間計算等內(nèi)容,這些是理解后續(xù)章節(jié)的前提;之后通過“內(nèi)存管理篇”“文件系統(tǒng)篇”“進程管理篇”詳細介紹了Linux的三大核心模塊;最后的“綜合應(yīng)用篇”則融合了前面諸多模塊知識展示了Linux內(nèi)核開發(fā)在操作系統(tǒng)、智能設(shè)備、驅(qū)動、通信、芯片、云計算和人工智能等熱點領(lǐng)域的應(yīng)用。書中的重點、難點均配有圖表、代碼和實戰(zhàn)案例,力求直觀、清晰。
學(xué)習(xí)本書的讀者需要熟悉C語言,建議對Linux內(nèi)核有一定了解。推薦初學(xué)者按照本書的編排順序閱讀,而熟悉Linux內(nèi)核的讀者可以跳過知識儲備篇,直接從三大核心模塊篇進行閱讀。
本書深入淺出、配圖豐富,可作為Linux初中級讀者系統(tǒng)學(xué)習(xí)Linux內(nèi)核開發(fā)的指導(dǎo)手冊,也可作為從事嵌入式、操作系統(tǒng)、Linux編程、驅(qū)動/內(nèi)核開發(fā),以及智能設(shè)備開發(fā)的工程師的案頭指南和進階工具書。
濃縮數(shù)百萬行代碼
308張圖表深度解析
掃碼觀看教學(xué)視頻
源代碼及電子課件
本人編寫的《精通Linux內(nèi)核:智能設(shè)備開發(fā)核心技術(shù)》出版已有多年了,這期間我讀了很多書評,也跟行業(yè)內(nèi)的工程師交流過多次,發(fā)現(xiàn)在編寫該書的過程中有一點做得并不到位,那就是當時寫作只站在閱讀了幾百萬行內(nèi)核代碼之后做總結(jié)的角度敘述問題,而忽略了初學(xué)者學(xué)習(xí)新知識的思維過程,表現(xiàn)為其中的有些知識點,出于慣性思維我認為比較簡單,但實際上可能對于初學(xué)者來說并不一定容易理解。同時,Linux的內(nèi)核版本又更新到了6.x時代,因此就有了《圖解Linux內(nèi)核(基于6.x)》一書的寫作想法,我希望用圖來直觀、清晰地闡述復(fù)雜的問題,讓初學(xué)者更容易理解。
當前的Linux內(nèi)核版本已經(jīng)更新到6.x,本書隨之更新至6.2版本。其中,有少數(shù)知識的討論也涉及3.10版本,保留它們主要是希望可以讓讀者看到內(nèi)核的更新和優(yōu)化思路。建議讀者在閱讀本書時可以下載3.10和6.2兩個版本的內(nèi)核代碼作為參考。
內(nèi)容
全書分為5篇內(nèi)容。
知識儲備篇:包括常見的數(shù)據(jù)結(jié)構(gòu)、時間和中斷處理等內(nèi)容,它們是后面幾部分內(nèi)容的學(xué)習(xí)基礎(chǔ),希望讀者能夠從中了解內(nèi)核的概況,在后續(xù)的章節(jié)中見到相關(guān)的知識時不會感到陌生。尤其是2.1【圖解】關(guān)系型數(shù)據(jù)結(jié)構(gòu)一節(jié),它是理解其他章節(jié)數(shù)據(jù)結(jié)構(gòu)間關(guān)系的基礎(chǔ),以及2.2【圖解】內(nèi)核中常見的設(shè)計模式一節(jié)闡述了內(nèi)核程序的設(shè)計思想,對理解復(fù)雜系統(tǒng)的設(shè)計思路很有幫助。
內(nèi)存管理篇:包括內(nèi)存尋址、物理內(nèi)存、線性內(nèi)存空間的管理和缺頁異常等內(nèi)容。希望讀者能夠從中學(xué)習(xí)到內(nèi)存映射的原理,理解管理內(nèi)存的過程,在調(diào)用內(nèi)核提供的函數(shù)時明白內(nèi)核為用戶做了哪些操作。
文件系統(tǒng)篇:包括VFS的流程、sysfs和proc文件系統(tǒng)的實現(xiàn)、ext4文件系統(tǒng)的解析等內(nèi)容。希望讀者能夠掌握文件系統(tǒng)的設(shè)計思路、文件操作的實現(xiàn)、sysfs等文件系統(tǒng)的特點以及ext4文件系統(tǒng)的原理。尤其是ext4文件系統(tǒng),本書列舉了大量的動手實例,希望讀者可以理解它的精髓。
進程管理篇:包括進程原理、進程調(diào)度、進程通信和信號處理等內(nèi)容。希望讀者能夠掌握進程間的關(guān)系、進程調(diào)度的過程、進程通信的原理和信號的處理過程等。理解進程的創(chuàng)建過程尤為重要,它涵蓋了進程實現(xiàn)的原理。
綜合應(yīng)用篇:包括程序的執(zhí)行、I/O多路復(fù)用、Binder通信、Linux設(shè)備驅(qū)動模型和V4L2架構(gòu)等內(nèi)容。本篇綜合了前幾部分的知識,希望讀者可以靈活掌握它們的原理,在工作中使用起來得心應(yīng)手。
從難易度角度來講,這5篇是由淺入深的。本書僅羅列了關(guān)鍵或者復(fù)雜的代碼,從它們包含的代碼篇幅就可以知道難易程度。知識儲備篇偏向工具和基礎(chǔ)知識,以原理分析為主。內(nèi)存管理篇、文件系統(tǒng)篇和進程管理篇是重點,代碼量巨大,這些代碼一方面可以幫助讀者理解整體的軟件架構(gòu),另一方面方便讀者在學(xué)習(xí)的時候不會因為手頭沒有代碼而感到無所適從,最重要的是代碼才是結(jié)論背后的真相,直接給出結(jié)論無疑會讓技術(shù)變成了死記硬背的工具。
特色
本書在搭建知識體系和配套學(xué)習(xí)資源的過程中進行了如下優(yōu)化。
前言圖解Linux內(nèi)核(基于6.x) 基于新發(fā)布的Linux 6.x,包含前沿的技術(shù)(如近幾年流行的CXL)和巨量的代碼更新。
以【圖解】【看圖說話】等巧妙形式增強讀者的閱讀體驗,涉及的復(fù)雜機制均配圖表且提供下載,幫助讀者快速厘清脈絡(luò)。
重點案例和難點操作均制作了配套視頻教學(xué)課程,讀者在閱讀過程中,只需拿出手機掃一掃頁面相應(yīng)位置的二維碼,即可打開視頻課程學(xué)習(xí)。
提供書中所有案例的完整源代碼,幫助讀者快速學(xué)習(xí)內(nèi)核知識。
配備了授課用電子教案等教學(xué)服務(wù),滿足大中專院校及相關(guān)培訓(xùn)班教師授課所需。
致謝
首先,感謝機械工業(yè)出版社的編輯丁倫老師,丁老師與我寫《圖解Linux內(nèi)核(基于6.x)》的思路不謀而合。從確定目錄結(jié)構(gòu)就開始耐心指導(dǎo)我,對知識的內(nèi)容也提出了客觀準確且專業(yè)嚴謹?shù)男薷囊庖。沒有丁老師的認真負責,本書就無法得到升華。
感謝我的研究生導(dǎo)師蘆鵬宇,蘆老師待人平和耐心,工作一絲不茍,讓我在校時就樹立了正確的做人和做事的方向,使得對技術(shù)不懈追求的理念在我畢業(yè)時就已經(jīng)深深烙在心里。同時還要感謝哈爾濱工業(yè)大學(xué),“規(guī)格嚴格,功夫到家”的八字校訓(xùn)一直激勵著我,無數(shù)個像蘆老師一樣的辛勤園丁用行動將其傳授給一批又一批的學(xué)子。
感謝華為技術(shù)有限公司的陳棟,很幸運在我第一份工作中可以遇到一個對技術(shù)有信仰的前輩,他對技術(shù)不懈追求的態(tài)度讓我在第一份工作中養(yǎng)成了良好的職業(yè)態(tài)度和習(xí)慣。
感謝英特爾(Intel)公司的劉駿、徐杰、黃衛(wèi)強、王龍和Foster,劉駿將我招入Intel,開闊了我的視野,改變了我的人生軌跡。我曾經(jīng)問他,他希望我在有余力的情況下學(xué)習(xí)些什么知識,他的回答是“只要是學(xué)習(xí),就會有幫助,無論學(xué)什么知識”;徐杰在我的工作中,對我信任有加,處處委以重任,讓我在很短的時間內(nèi)快速成長;黃衛(wèi)強和王龍是我在Intel的師傅(Buddy),在工作和生活中給了我很多建議,至今受用;Foster是BIOS和x86專家,幫助我快速地熟悉x86的原理。
感謝AMD公司的Winston、Gavin和Jennifer,讓我在AMD學(xué)習(xí)到了很多芯片相關(guān)的知識,完成了本書的最后一環(huán)。Jennifer交給我挑戰(zhàn)性的工作,讓我在新的角
姜亞華
先后就職于華為、Intel、AMD、壁仞科技和曦智科技。
?就職于華為期間,負責華為手機的Touch和Sensor的驅(qū)動和軟件優(yōu)化,包括Viva、D1、Mate1、Mate2和P2等。
?就職于Intel期間,負責Intel安卓平臺的Camera和Sensor的驅(qū)動,包括Baytrail、Cherrytrail、Cherrytrail CR和Sofia等。
?就職于AMD期間,負責DMA、Interrupt、Semaphore等模塊的優(yōu)化和驗證,包括Vega系列、Navi系列和多款A(yù)PU產(chǎn)品。
?在曦智科技負責多款產(chǎn)品的系統(tǒng)軟件開發(fā)至今,包括PCIe驅(qū)動、設(shè)備固件和系統(tǒng)類庫等。
一直從事與Linux內(nèi)核和Linux系統(tǒng)編程相關(guān)的工作,研究內(nèi)核代碼十余年,對多數(shù)模塊的細節(jié)如數(shù)家珍。
序
前言
知識儲備篇
第1章Linux內(nèi)核概述
1.1基于Linux的操作系統(tǒng)生態(tài)
1.2【圖解】Linux工程師技能和領(lǐng)域
1.3內(nèi)核代碼結(jié)構(gòu)
1.4【看圖說話】Android操作系統(tǒng)
第2章數(shù)據(jù)結(jié)構(gòu)和設(shè)計模式
2.1【圖解】關(guān)系型數(shù)據(jù)結(jié)構(gòu)
2.1.1一對一關(guān)系
2.1.2一對多關(guān)系
2.1.3多對多關(guān)系
2.2【圖解】內(nèi)核中常見的設(shè)計模式
2.2.1模板方法設(shè)計模式
2.2.2觀察者設(shè)計模式
2.3【看圖說話】input子系統(tǒng)第3章中斷
3.1【圖解】中斷處理的軟硬件分工
3.2中斷的處理
3.2.1注冊中斷服務(wù)例程
3.2.2中斷處理和返回
3.3軟中斷
3.3.1tasklet小任務(wù)
3.3.2timer定時器
3.4【看圖說話】系統(tǒng)調(diào)用與程序優(yōu)化
第4章Linux的時間
4.1數(shù)據(jù)結(jié)構(gòu)
4.2時間的衡量
4.2.1時鐘芯片
4.2.2時間的計算
4.3【圖解】時鐘中斷
4.4【看圖說話】timer和hrtimer內(nèi)存管理篇
第5章內(nèi)存尋址
5.1DRAM和MMIO
5.2【圖解】內(nèi)存分頁
5.2.1尋址
5.2.2內(nèi)存映射
5.3【看圖說話】訪問GPU的
Framebuffer
第6章物理內(nèi)存的管理
6.1【圖解】物理內(nèi)存的布局
6.1.1【圖解】node
6.1.2【圖解】node的管理
6.2物理內(nèi)存申請的三個階段
6.2.1啟動程序
6.2.2memblock分配器
6.2.3伙伴系統(tǒng)
6.3【看圖說話】搭建管理物理內(nèi)存的
系統(tǒng)
第7章虛擬內(nèi)存的管理
7.1線性空間的劃分
7.2【圖解】內(nèi)核線性空間布局
7.2.1直接映射區(qū)
7.2.2動態(tài)映射區(qū)
7.2.3永久映射區(qū)
7.2.4固定映射區(qū)
7.3用戶空間內(nèi)存映射mmap
7.3.1數(shù)據(jù)結(jié)構(gòu)
7.3.2mmap的實現(xiàn)
7.4【看圖說話】/dev/mem的巧用和限制
第8章內(nèi)存管理進階
8.1內(nèi)存申請
8.1.1申請連續(xù)物理內(nèi)存
8.1.2vmalloc的使用
8.2緩存
8.2.1TLB緩存
8.2.2內(nèi)存緩存
8.3【圖解】缺頁異常
8.3.1異常的處理
8.3.2COW的精髓
8.4【看圖說話】看似簡單的malloc
第9章內(nèi)存回收
9.1【圖解】內(nèi)存回收調(diào)用棧
9.2掃描過程的控制
9.3選擇掃描對象
9.4掃描inactive鏈表
9.4.1頁隔離
9.4.2folio的原理
9.4.3回收隔離頁
9.4.4掃尾
9.5掃描active鏈表
9.6【看圖說話】反向映射
9.6.1匿名映射的mapping
9.6.2文件映射的mapping文件系統(tǒng)篇
第10章虛擬文件系統(tǒng)
10.1數(shù)據(jù)結(jié)構(gòu)
10.2【圖解】文件系統(tǒng)的掛載
10.3文件查找
10.4文件操作
10.4.1軟鏈接和硬鏈接
10.4.2創(chuàng)建和刪除目錄
10.4.3打開和關(guān)閉文件
10.4.4創(chuàng)建節(jié)點
10.4.5刪除文件
10.5文件的IO
10.5.1讀寫
10.5.2ioctl操作
10.6【看圖說話】proc文件系統(tǒng)
第11章sysfs文件系統(tǒng)
11.1基本框架
11.2數(shù)據(jù)結(jié)構(gòu)
11.3創(chuàng)建文件
11.4文件的IO
11.5【看圖說話】sysfs和驅(qū)動
第12章ext4文件系統(tǒng)
12.1【圖解】ext4布局
12.2數(shù)據(jù)結(jié)構(gòu)
12.2.1ext4_super_block結(jié)構(gòu)體
12.2.2ext4_group_desc結(jié)構(gòu)體
12.2.3ext4_inode結(jié)構(gòu)體
12.2.4ext4_sb_info結(jié)構(gòu)體
12.2.5ext4_inode_info結(jié)構(gòu)體
12.3ext4的掛載
12.4【圖解】ext4目錄結(jié)構(gòu)
12.4.1線性目錄
12.4.2哈希樹目錄
12.4.3硬鏈接
12.5【圖解】ext4文件的IO
12.5.1映射
12.5.2區(qū)段樹
12.6【看圖說話】文件的恢復(fù)進程管理篇
第13章進程
13.1概述
13.1.1數(shù)據(jù)結(jié)構(gòu)
13.1.2擴展討論
13.2進程的創(chuàng)建
13.2.1dup_task_struct函數(shù)
13.2.2復(fù)制creds
13.2.3設(shè)置時間
13.2.4sched_fork函數(shù)
13.2.5復(fù)制資源
13.2.6申請pid
13.2.7重要的雜項
13.3創(chuàng)建進程
13.3.1fork/vfork系統(tǒng)調(diào)用
13.3.2創(chuàng)建線程
13.3.3創(chuàng)建內(nèi)核線程
13.4進程“三巨頭”
13.5進程退出
13.5.1退出方式
13.5.2退出過程
13.5.3使用wait等待子進程
13.6【看圖說話】Android的thread
目錄圖解Linux內(nèi)核(基于6.x)第14章進程調(diào)度
14.1數(shù)據(jù)結(jié)構(gòu)
14.2進程調(diào)度的過程
14.2.1進程被創(chuàng)建
14.2.2喚醒進程
14.2.3時鐘中斷
14.2.4進程切換
14.3stop調(diào)度類
14.4實時調(diào)度類
14.4.1優(yōu)先級和搶占
14.4.2task_tick_rt函數(shù)
14.4.3選擇下一個進程
14.5【圖解】完全公平調(diào)度類
14.5.1task_fork_fair函數(shù)
14.5.2enqueue_task和check_preempt
14.5.3task_tick_fair函數(shù)
14.5.4進程切換
14.6最后期限調(diào)度類
14.7idle調(diào)度類
14.8進程優(yōu)先級
14.9【看圖說話】idle進程
第15章進程通信
15.1經(jīng)典的管道
15.1.1創(chuàng)建pipe
15.1.2pipe的操作
15.1.3命名管道
15.2POSIX通信
15.2.1POSIX信號量
15.2.2POSIX共享內(nèi)存
15.2.3POSIX消息隊列
15.3XSI通信
15.3.1IPC對象的key和id
15.3.2XSI信號量
15.3.3XSI消息隊列
15.3.4XSI共享內(nèi)存
15.4【看圖說話】多線程和多進程
第16章信號
16.1數(shù)據(jù)結(jié)構(gòu)
16.2捕捉信號
16.3發(fā)送信號
16.4【圖解】信號處理的過程
16.4.1處理信號的時機和方式
16.4.2處理信號后如何返回
16.5【看圖說話】監(jiān)控文件的IO綜合應(yīng)用篇
第17章玩轉(zhuǎn)操作系統(tǒng)——程序的
執(zhí)行
17.1【圖解】elf文件
17.1.1概述
17.1.2文件格式
17.2exec函數(shù)族
17.2.1數(shù)據(jù)結(jié)構(gòu)
17.2.2系統(tǒng)調(diào)用
17.3【看圖說話】main函數(shù)的來龍去脈
第18章玩轉(zhuǎn)操作系統(tǒng)——IO多路
復(fù)用
18.1select機制
18.2poll機制
18.3【圖解】epoll
18.3.1數(shù)據(jù)結(jié)構(gòu)
18.3.2epoll的使用
18.4【看圖說話】改良管道通信
第19章玩轉(zhuǎn)操作系統(tǒng)—