linux内核深度解析_十年磨一剑,第一本龙芯平台的Linux内核书来了
《用“芯”探核:基于龍芯的Linux內核探索解析》是一本基于龍芯平臺,結合源代碼來探索和解析Linux-5.x內核的書。
市面上解析Linux 內核的經典書籍已有不少,尤其是被稱為Linux 內核領域的“四庫全書”:《Linux 內核設計與實現》 《Linux設備驅動程序》 《深入理解Linux 內核》和《Linux內核源代碼情景分析》。
但是,一方面,大多數已有書籍是基于X86 或者ARM 體系結構的;另一方面,大多數已有書籍基于2.4 版本或者2.6 版本的Linux 內核,雖然近年來有了許多不錯的原創新書。
同時,一直以來,從事龍芯內核開發工作的“標準教程”是《龍芯處理器用戶手冊》、《MIPS 體系結構透視》和《深入理解Linux 內核》。然而,《龍芯處理器用戶手冊》不涉及Linux 內核;《MIPS 體系結構透視》講述的是傳統的MIPS 處理器,離真正的龍芯差距太大;而《深入理解Linux 內核》所使用的內核版本又過于陳舊。
因此,正如中科院計算所研究員張福新在推薦語中說的:“這本基于龍芯平臺的內核開發書籍的出版,恰逢其時。”
本書作者:陳華才
博士,高級工程師?,F任江蘇航天龍夢信息技術有限公司副總工程師,負責龍芯3 號處理器的內核開發。作為Linux內核中MIPS/ 龍芯3 號的Maintainer,向Linux 內核官方提交了大量的代碼。
為什么寫這本書?
我是誰?我就是一個既愛Linux也愛龍芯的開發者。十六年前開始接觸Linux內核,十二年前開始接觸龍芯電腦,十年前加入龍芯產業化基地,十年來伴隨著龍芯一起成長,如今已成為Linux內核中龍芯3號的Maintainer。
有人說,“干一行,愛一行”,但我覺得“愛一行,干一行”更加符合可持續發展。龍芯和Linux都是我所愛,研究起來動力十足。一直以來,我在閱讀內核源代碼時都有做筆記的習慣,因為人腦畢竟容量有限,在知識體系不斷擴張的過程中,筆記是必不可少的。我做筆記的方法以“代碼摘抄+適度精簡+注釋解析”為主,但是隨著時間的發展和內核版本的升級,筆記總量越來越大,不同版本中的同名函數也已經變得面目全非。于是,我經常不得不在筆記中記錄源代碼的多個版本,并且在代碼片段的開始處加上版本標識。雖然說筆記主要是給自己看的,但正如熱力學第二定律所昭示的一樣,筆記的可讀性已經不可避免地越來越差了(熵值太大)。
于是乎,便萌生了整理筆記并編寫成書的想法。最初的想法成型于2013~2014年,但真正開始動筆的時候是2015年。在寫書的過程中,解析方法盡量保留了筆記中精簡代碼的特點,但在內核版本的選擇上全部采用了最新的LTS版本(長期維護穩定版本),即5.4.x版本。
用“芯”探核 基于龍芯的Linux內核探索解析
這本書選擇了哪些內容?
全書以龍芯平臺為重點,主要解析Linux 內核源代碼。首先對龍芯處理器和Linux 內核進行概括性的介紹,并引入一種快速而有效的代碼閱讀方法,即“先觀其大略,再咬文嚼字”。
操作系統是整個計算機的管理者,其本質上是一個大型軟件平臺,順著程序的執行流程一起前進是自然而然的事情。因此,從Linux內核在龍芯計算機上的啟動過程開始研究Linux 內核是一個比較好的切入點,以此獲得一個對龍芯處理器和Linux 內核的宏觀印象。
內核是操作系統中最基礎、最重要的部分,其三大基本功能分別是中斷/異常處理、內存管理、進程管理。這3章內容盡量遵循“從基礎到上層”和“廣度優先深度其次”的寫作原則,更方便讀者根據自己的需求安排閱讀順序。Linux內核支持X86、ARM、MIPS、PowerPC等多種體系結構,但對上層應用提供了基本一致的操作接口。因此,內核的三大基本功能中一部分是體系結構相關的特定內容,一部分是體系結構無關的通用框架。
由于Linux 是一體化內核操作系統,因此設備驅動也放在內核層實現。設備驅動所涵蓋的范圍非常廣泛,本書不可能面面俱到,只選取了兩種常用的典型設備驅動——Radeon 顯卡與E1000E 網卡,來做舉例性的原理說明。
Linux內核博大精深,本書雖然洋洋灑灑幾百頁,然而在兩千多萬行源代碼實不過是滄海一粟。雖然我試圖讓內容覆蓋更加全面,但也只是涉及了內核啟動、異常中斷、內存管理、進程管理、設備驅動和電源管理等幾個常見話題,而對于文件系統、網絡協議等方面的內容幾乎只字未提。
怎樣閱讀上千萬行的源代碼?
閱讀軟件源代碼是每個開發者的必由之路,尤其是內核開發者。因為內核開發在很大程度上并不是重新發明輪子,而是深入理解并盡量復用現有的內核設計框架,然后參照相似的功能模塊去添加或改寫某項需要的功能。在對內核整體框架以及某些子系統融會貫通以后,才有可能站在巨人的肩膀上去改進框架本身,實現自主創新。
閱讀代碼有“廣度優先”和“深度優先”兩種方式。代碼好比一棵樹,“廣度優先”就是說我們要先找到主干,然后搞清楚主干上有幾根樹枝,再去某條感興趣的樹枝上尋找有意義的葉子;而“深度優先”指的是是碰到第一根樹枝,就趕緊深入進去把所有的葉子給找出來。本書建議以廣度優先為主,但在適當的時候也需要兼顧深度。因此,本書使用“樹形視圖”和“鏈式視圖”來解析內核源代碼,而這也是我以及我的同事在日常工作中常使用的方法。樹形視圖具有廣度,能夠快速理解大型函數的主干;鏈式視圖具有深度,能夠直觀理解重點函數的調用。
(樹形視圖)
(鏈式視圖)
在很多現有的書籍中,都會使用流程圖來描述代碼邏輯。然而,流程圖雖然直觀,但是其描述能力有限(尤其是缺乏樹形視圖的層次化表達能力),往往很難精確描述一個函數的執行過程。而一個費盡心機畫出來的精確的流程圖,往往又會因為其復雜性而失去了直觀的功能。并且,單靠流程圖并不能完全理解源代碼,而是需要將源代碼與流程圖兩相對照。
因此,本書盡量用精簡版的源代碼(即樹形視圖和鏈式視圖)來代替流程圖,一方面可以快速理解多級函數的復雜調用關系,另一方面可以不需要在源代碼和流程圖之間反復切換。
本書除了引入樹形視圖和鏈式視圖,在開篇第1章首先介紹了“先觀其大略,再咬文嚼字”的代碼閱讀方法。具體來說分為四個步驟,即“找準入口點”“理清主脈絡”“顧名思義看功能”“理解補丁文件”。
從2015年開始動筆,到如今《用“芯”探核:基于龍芯的Linux內核探索解析》一書成型,其中的曲折艱辛實在是不足為外人道矣。在寫書過程中,當我試圖將一個基本原理向眾人闡述明白的時候,才發現,其實之前自己只是似懂非懂。甚至可以說,寫書最大的受益者是自己,因為整個知識體系真正得到了全面的升華。
謹以此書,獻給一起為信息產業自主化而奮斗的同仁們。也希望此書,能給讀者帶來實質性的收獲。
總結
以上是生活随笔為你收集整理的linux内核深度解析_十年磨一剑,第一本龙芯平台的Linux内核书来了的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: addeventlistener事件参数
 - 下一篇: 【LeetCode笔记】39. 组合总和