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