官术网_书友最值得收藏!

前言

近些年來,使用安卓操作系統的智能手機熱銷,未來也將是物聯網、大數據、云計算的大時代,而運行在這些相關產品最深處的幾乎都是Linux內核。我一直在凝望你,你看不見我,我是誰?我是奔跑中的Linux內核小企鵝。

說起和Linux的淵源,要追溯到十幾年前的大學時代了。2002年,正在讀大二的我購買了人生第一臺電腦,AMD的毒龍CPU,在同學的指導下安裝了RedHat 9,這是我第一次接觸Linux操作系統。從此,我就被Linux系統深深地吸引了,樂不思疲地折騰著我的RedHat 9。2004年春天在實驗室忙著做畢業設計時,驀然回首看到小伙伴桌上有兩本厚厚的《Linux內核源代碼情景分析》,我再次被深深地吸引了,心里嘀咕著不知道什么時候才能看得完和看得懂。到了2017年的今天,已經畢業12年多了。12年的光景讓我從一名大學生變成了“笨叔叔”,也讓Linux內核這個小企鵝變成今日的科技明星。與12年前相比, Linux內核代碼已經發生了翻天覆地的變化,但是不變的是一群熱愛Linux內核的小伙伴,那是一群奔跑著的年輕人。《Linux內核源代碼情景分析》這本書在Linux內核圈里被稱為經典,可是它講述的內核版本是2001年發布的Linux 2.4.0,距今已經有16年了。

回顧學習Linux內核的那段經歷,我愈發體會到Linux內核的功夫在Linux內核之外。Linux內核變得越來越龐大,特別是現在硬件的發展速度非常快,各種不同的思想和實現如雨后春筍一般,各種各樣的補丁也讓人眼花繚亂。對于一個初學者或者有經驗的工程師來說,要閱讀和理解最新版本的Linux內核變得越來越困難。而且現在市面上Linux內核書籍都比較舊,最經典的《深入理解Linux內核》講述的是Linux 2.6.11內核,它發布于2005年,《深入Linux內核架構》中講述的Linux 2.6.24內核是2008年1月發布的。以每2~3個月發布一個Linux內核新版本的速度,這些書中的內核版本與當前的4.x內核不可同日而語。另外,我發現身邊不少朋友很想把Linux內核吃透,然后購買了不少Linux內核的書籍,但有時好幾天也沒讀幾頁。究其原因是,現在市面上已有的Linux內核書籍大多是教科書式地講述知識點,機械式地講述內核代碼的實現,讀起來很容易讓人犯困。

Linux內核代碼由一個一個補丁組成,這些補丁都是為了解決某個問題或者添加某些新的功能,因此最好的學習方法是:理解代碼是為了解決什么問題,如何解決的,要了解問題的來龍去脈。對于學習Linux內核這件事情來說,應該和孩提時讀“十萬個為什么”一樣,以問題為中心,通過閱讀代碼和書籍來尋找答案,比如你在用C語言寫一個很簡單的程序時,應該想想malloc何時分配出物理內存。當你帶著疑問去閱讀代碼以及獨立思考之后,會得到一種享受和愉悅,這就是我說的“Linux內核的功夫在于內核之外”。因此,站在設計者的角度來提出疑問,進而閱讀代碼和分析推理求索之后,終于有種“撥開迷霧見天日”的喜悅。

本書特色

1.問題導向式的內核源代碼分析

Linux內核龐大而復雜,任何一本厚厚的Linux內核書籍都可能會讓人看得昏昏欲睡。因此本書想做一個嘗試,總結我多年來在學習Linux內核代碼和實際工程項目中遇到的比較常見的疑問,以疑問為中心講述內核代碼。在講述每章之前,首先列舉出一些思考題,激發讀者探索未知的興趣。

這些思考題主要來自于如下3個方面。

? 從我多年來實際工程項目中遇到的問題抽象出來。我們在實際產品的研發過程中,比如手機項目研發或者其他智能產品的研發,難免要編寫驅動或者系統優化,那么常常會遇到一些問題。如果對內核了解很透徹,解決問題的速度也會明顯提高。例如在書中提到的驅動代碼內存越界訪問的問題,如果對內存管理和內核調試很熟悉,可能用幾個小時就能修復bug了,如果換成一個不熟悉的工程師也許耗費很長時間還是找不到方向。系統中一些問題可能會是定時炸彈,隨時可能引爆,因此絕大多數情況下,查找問題花費的時間要遠遠多于提前靜下心來搞懂\2inux內核機制的時間。

? 我在閱讀內核代碼時產生過的一些疑問。

? 我和身邊的朋友在參加面試時經常會被問到的有關Linux內核的問題。

2.力求反映Linux內核社區最新的開發技術

本書基于Linux 4.x內核,我會在每章末尾盡量把內核技術的最新發展情況分享給讀者。另外,我也會加入一些最新的熱點話題,比如內存管理漏洞——Dirty COW的分析;手機領域最新Android 7.1.1版本中的EAS節能調度器、WALT算法、PELT算法改進、Queued Spinlock等。

3.Linux內核奔跑卷

本書開篇會提供一份Linux內核奔跑卷,這也是Linux內核書籍中一個新的嘗試。讀者可以將其用于Linux內核水平測試或面試題目,我希望能給讀者帶來閱讀Linux內核的興趣和探索知識的樂趣。

4.QEMU調試環境和內核調試技巧

在閱讀Linux內核時,大多數人都希望有一個功能全面且好用的圖形化界面來單步調試內核。本書中會介紹一種圖形化單步調試內核的方法,即Eclipse+QEMU+GDB。另外,本書提供首個采用“-O0”編譯和調試Linux內核的實驗,這樣可以解決調試時出現光標亂跳和<optimized out>等問題。本書也會介紹實際工程中很實用的內核調試技巧,例如ftrace使用、systemtap、內存檢測、死鎖檢測、動態打印技術等,這些都可以在QEMU+ ARM Linux的模擬環境下做實驗。

5.ARM32和ARM64體系架構

本書以ARM32和ARM64體系架構為藍本,介紹Linux內核的設計與實現。

本書主要內容

Linux內核涉及的內容包羅萬象,但本書不想成為一本大而全的書,因此只選取了最基本最常用的內存管理、進程管理、并發與同步和中斷管理這4個內核模塊進行講述,力求把我所理解的東西完整記錄下來。

本書中每節的內容都是一個Linux內核的話題或者技術點,在每節開始之前會先提出若干個問題,讀者可以根據這些問題先思考,然后圍繞這些問題進行內核源代碼的分析,最后是對相應內容的一個小結。

Linux內核奔跑卷一共20道題目,每題10分,一共200分,讀者可以在2小時內完成。

第1章處理器體系結構。簡單介紹ARM32和ARM64結構中一些比較常見的問題,例如cache組織架構、cache一致性管理、頁表訪問、MMU、內存屏障等與體系結構相關的內容。

第2章內存管理。包括物理內存初始化、內存分配、伙伴系統、slab分配器、malloc內存分配、mmap系統調用、缺頁中斷、匿名頁面的宿命、物理頁面page結構、反向映射、頁的遷移、KSM、DirtyCOW、頁面回收、內存管理數據結構框架等內容。

第3章進程管理。包括fork系統調用、CFS調度器、PELT算法改進、SMP負載均衡、HMP調度器、WALT算法、EAS綠色節能調度器等內容。

第4章并發與同步。包括原子變量、spinlock、信號量、讀寫信號量、Mutex、RCU等內容。

第5章中斷管理。包括硬件中斷處理、軟中斷、Tasklet、workqueue等內容。

第6章內核調試。包括內核單步調試、ftrace使用、systemtap使用、內存檢測、死鎖檢測、動態打印技術等內容。

本書羅列的內核代碼均為代碼片段,顯示的行號也并非源代碼的實際行號,只是為行文描述方便。另外,在實際代碼中有大量的注釋,本書為了節省篇幅而省略了大量的代碼注釋,建議讀者對照代碼來閱讀。

本書在實際代碼講解時還列舉了一些關鍵的patch,閱讀這些patch有助于幫助讀者理解代碼。建議讀者下載官方Linux的git tree。下載代碼命令如下:

      #git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
      #git reset v4.0 -hard


列舉的patch格式如下:

Linux2.6.29, commit bf3f3bc5e, <mm: don't mark_page_accessed in fault path>, by Nick Piggin.

表示在Linux 2.6.29中加入了此patch, git commit的前幾位ID號是“bf3f3bc5e”,讀者可以通過“git show bf3f3bc5e”命令來查看該patch,該patch的標題是“<mm: don't mark_page_accessed in fault path>”,作者是Nick Piggin。

由于作者知識水平有限,書中難免存在紕漏和理解錯誤之處,敬請各位讀者朋友批評指正。我的郵箱:runninglinuxkernel@126.com。新浪微博:@奔跑吧Linux內核。大家也可以掃描下方的二維碼,到我的微信公眾號中提問和交流。

關于作者

本書作者從事Linux內核和驅動開發十余年,是Linux內核的愛好者,曾在多家芯片公司從事過手機芯片底層軟件開發和客戶支持工作。

寫一本Linux內核方面的書籍是筆者多年來的一個小心愿。本書取名為《奔跑吧Linux內核》,一是Linux內核在蓬勃發展,全球眾多杰出的公司和開發者都在為Linux內核社區開發令人激動的新功能;二是我們要不斷地向前狂奔才能趕上Linux內核發展的步伐;三是作者有一個人生目標,希望每天能堅持奔跑5千米,直到80歲,因此作者希望和廣大讀者共勉。在開始撰寫本書時Linux內核版本才到4.0,完稿時Linux內核已經發展到4.10版本了,作者選擇一個整數版本Linux 4.0作為本書學習和分析的版本。譚校長有一首歌叫《八十歲后》,歌詞是“總相信,八十歲后,仍然能分享好戲”,他堅持要開演唱會到八十歲。我也有一個小小的目標,希望日后Linux內核發展到5.0、6.0……版本時,《奔跑吧Linux內核》依然能以最快的速度修訂和大家見面。

致謝

幾經放棄,幾經堅持,聽著Beyond的歌,咬著冷冷的牙,堅持著心中那個萬里奔跑的信念。在繁忙工作之余寫書是很枯燥的,但是期間我得到了眾多Linux內核社區朋友的熱心幫助和鼓勵。特別是陳緒、吳峰光、Tim Chen、肖光榮、李澤帆、Waiman Long、馮博群、謝寶友、杜雨陽、郭健、孟衛國、修志龍、朱輝、宋寶華、吳章金、王齊、薛坤、劉勃、劉杰、郭哲佑、郭雄飛以及胡振波,他們為本書審閱了全部或者部分稿件,提出了很多很好的意見和建議。另外還要感謝石慶、Fane Li、Law Hock Yin、周祥、何章龍、杜秉權、楊永剛、張思超、段夕華、周琰玉、涂小兵、楊晨星、楊冬冬、孟皓、王建強、王智、宋吉科、何劉宇、Tian Jun等給予的幫助。感謝南京大學軟件學院的夏耐老師在KSM項目中的指導,讓我對Linux內核內存管理有了更深刻的理解和認知,還要感謝任德志老師的鼓勵和幫助。

本書在編寫過程中得到了Linux內核社區眾多杰出華人開發者以及maintainer(維護者)的鼓勵和幫助,他們仔細審閱本書并提出了獨特的見解和建議,這些都是無價的。在此再一次表達我的感激之情,他們都是Linux內核社區最杰出的華人代表(排名不分先后)。


陳緒 中國開源軟件推進聯盟常務副秘書長。


吳峰光 Linux內核社區資深技術專家,0-day內核測試項目的發起人,其預讀算法和回寫算法享譽內核社區。


肖光榮 Linux內核社區資深技術專家,KVM社區和Qemu社區的核心開發者和maintainer。


Tim Chen Linux內核社區資深技術專家,Linux MCS鎖和Mutex自旋等待機制的作者。


Waiman Long RedHat公司Linux內核資深技術專家,Linux內核著名的鎖專家,為讀寫信號量、Mutex和Queue Spinlock等做出杰出的貢獻。


李澤帆 華為資深Linux內核技術專家,Cgroup及cpuset模塊的co-maintainer。


謝寶友 Linux內核社區ZTE平臺維護者,中國開源軟件推進聯盟專家委員,《深入理解并行編程》譯者。


郭健 Linux內核資深技術專家,技術網站蝸窩科技創始人。


馮博群 Linux內核社區資深技術專家。


孟衛國 Linux內核資深技術專家。


杜雨陽 Linux內核社區CFS調度器專家,為CFS中的PELT算法做出重大優化和貢獻。


修志龍 ARM公司應用工程師經理,精通Cortex系列處理器架構。


王齊 計算機體系結構資深技術專家,著有《Linux PowerPC詳解——核心篇》和《PCI Express體系結構導讀》。


宋寶華 Linux內核資深技術專家,ARM Linux社區maintainer,著有《Linux設備驅動開發詳解》。


吳章金 魅族手機研發中心BSP部技術總監。


劉杰 百度主任研發架構師,Linux內核資深技術專家,XFS文件系統核心開發者。


朱輝 小米科技Linux內核技術資深專家,KGTP項目發起人,GDB項目的maintainer。


夏耐 南京大學計算機博士,操作系統資深專家。


感謝我的領導Liu Song先生和Luebbers Enno先生對我的支持和幫助。同時感謝人民郵電出版社的張濤和張爽兩位編輯的辛勤付出,才讓本書順利出版。最后感謝我的家人對我的支持和鼓勵,雖然周末時間都在忙于寫作本書,但是他們總是給我無限的溫暖。

致敬

浙江大學計算機學院是全球最早開始從事Linux內核研究和教學的高校之一,非常感謝陳文智院長為本書作序,陳老師一直持續關注和鼓勵本書的編寫和出版,給了我很多指導性的意見和建議。

毛德操和胡希明老師編寫的《Linux內核源代碼情景分析》一書是中國Linux內核發展史上一個永恒的經典,在此向這兩位老學者和前輩致敬。此時此刻,腦海里響起了一首歌:“一追再追,只想追趕生命里,一分一秒”。愿和大家一起奔跑、一起追趕、不浪費生命的一分一秒。

張天飛

2017年夏于上海

主站蜘蛛池模板: 菏泽市| 白水县| 醴陵市| 德安县| 喀喇| 湖南省| 遵化市| 宁远县| 乳源| 平潭县| 阿城市| 保康县| 郸城县| 黄大仙区| 松江区| 苏尼特左旗| 巫山县| 梧州市| 柞水县| 岱山县| 曲沃县| 洪湖市| 祥云县| 彰化县| 汝州市| 武川县| 南木林县| 大丰市| 佛学| 龙里县| 新余市| 乐山市| 泉州市| 临夏县| 定陶县| 琼海市| 乌兰浩特市| 辉县市| 嘉善县| 灌云县| 灵川县|