2019 年是 Linux 內(nèi)核誕生的第 28 年,1991 年 8 月 26 日,當(dāng)年還是大學(xué)生的 Linus Torvalds 向 comp.os.minix 新聞組的成員透露了出于“業(yè)余愛好”而正在研究操作系統(tǒng)的消息。
Linux Kernel 是全球最大的開源項目,知名的科技公司幾乎都參與其中,包括微軟、谷歌、Red Hat、SUSE、Intel、Facebook、百度、阿里、華為、Oracle 與騰訊等。同時,基于 Kernel 衍生出的發(fā)行版與各種周邊項目也讓其生態(tài)多姿多彩。
另一方面,在當(dāng)今云原生高速發(fā)展的時代,其底層也大多基于 Linux Kernel,甚至連微軟也表示 Linux 運行了 Azure 工作負(fù)載的 50% 以上。
Linux Kernel 短期內(nèi)不會過氣,而是會進(jìn)一步影響到更多開發(fā)者,但是 Linux Kernel 的入門和實踐卻很困難,這讓許多初學(xué)者望而卻步,哪個開發(fā)者說自己是 Linux Kernel 領(lǐng)域的,那其他人必定會肅然起敬。
最近了解到有一本值得初學(xué)者學(xué)習(xí)的相關(guān)書籍《精通 Linux 內(nèi)核——智能設(shè)備開發(fā)核心技術(shù)》,我們就如何學(xué)習(xí) Linux Kernel、Linux Kernel 2019 年的發(fā)展與相關(guān)應(yīng)用領(lǐng)域等問題采訪了作者姜亞華,希望能給到想要了解、研究 Linux Kernel 的開發(fā)者一些啟發(fā)。以下是對話內(nèi)容:
2019 年 Linux Kernel 進(jìn)入了 5.x 時代,雖然 Linus 自己說從 4.20 到 5.x 只是因為自己手指不夠用,但是實際上以您的理解,這對于項目的生命周期管理、特性合并或者社區(qū)文檔建設(shè)等方面有沒有比較大的影響呢?
姜亞華:
5.x 其實更新蠻多的,patch 文件 40 多 M,涉及 10000 多個文件。
這是一個大版本更新,從用戶意識角度來講,4.x 已經(jīng)是舊的了,就好像 iPhone 更新,Apple 維持兩年一個大更新的節(jié)奏,買了一款 iPhone,下一年的小更新不會有啥感覺,但是第二年大更新后,才覺得我的手機(jī)不是最流行的了。
新的項目,文檔等肯定都需要向 5.x 看齊了。
從代碼角度來講,我們可以從內(nèi)核更新的過程中學(xué)習(xí)到很多優(yōu)化的思路。我開始寫作《精通 Linux 內(nèi)核——智能設(shè)備開發(fā)核心技術(shù)》的時候內(nèi)核還是 3.x,在書中也刻意保留了部分 3.x 的討論(sysfs、進(jìn)場切換等),就是為了通過對比總結(jié)這方面的經(jīng)驗。
書中講到文件系統(tǒng),但是沒有關(guān)于最近微軟件開放出來的 exFAT,猜想是因為您這書已經(jīng)在此之前就寫了,那目前您有沒有繼續(xù)研究 exFAT 相關(guān)的內(nèi)容呢?目前 exFAT 也已經(jīng)在 5.4 中支持,它的能力上會帶來什么影響呢?
姜亞華:
是的,我接下來打算再深入一些模塊,exFAT 是其中之一。它的未來如何還很難說,Linux 已經(jīng)有很多優(yōu)秀的文件系統(tǒng)了,它們都經(jīng)過了多年的驗證,bug 可能也相對少一些,exFAT 還需要在 Linux 上經(jīng)過時間的考驗。
近期另一個內(nèi)核新特性也引起了廣泛的討論,那就是內(nèi)核鎖定,這個特性其實討論了多年,最后它的表現(xiàn)形式似乎也挺讓人不解的。該特性限制了 root 角色的權(quán)限,但是 root 是系統(tǒng)的最高級權(quán)限都有不能訪問的地方,這對于 root 來說是挺奇怪的一件事情,在開發(fā)、運維或者日常使用上這會產(chǎn)生什么比較大的影響嗎?
姜亞華:
內(nèi)核鎖定主要是為了防止 root 帳戶篡改內(nèi)核代碼,從而在用戶態(tài)進(jìn)程和代碼之間劃清界限。啟用鎖定模塊后,各種內(nèi)核功能都會受到限制。其中包括對內(nèi)核功能的訪問限制;對 /dev/mem 的讀寫操作的阻止;對 CPU MSR 訪問的限制;以及防止系統(tǒng)進(jìn)入睡眠狀態(tài)等等。
這對 root 來說其實并不奇怪,它依然是超級用戶,可以訪問所有正常的門。只不過內(nèi)核鎖定把一些“后門”去掉了,這些門常閉或者不存在了。
引入內(nèi)核鎖定(CONFIG_SECURITY)后,root 的訪問受到限制,開發(fā)、運維等過程中使用的腳本或者 sequence 可能就不能工作了。比如 root 可以通過 /dev/mem 文件訪問內(nèi)存,引入內(nèi)核鎖定后可能會受到限制。
說句題外話,root 是個挺危險的東西,慎用。記得我負(fù)責(zé)管理部門服務(wù)器的時候,有一次供應(yīng)商幫我移植驅(qū)動的過程中,安裝軟件的時候不小心刪除了一些文件,服務(wù)器斷電后就無法啟動了。我?guī)е獗P,在無數(shù)服務(wù)器轟鳴的實驗室中,花了好幾天才將它“搶救”回來。
相信很多開發(fā)者,或者剛在大學(xué)學(xué)計算機(jī)的人在了解了 Linux Kernel 之后都會想要去讀它的源碼,但是應(yīng)該大部分都會不得其法,最終放棄。您是怎樣閱讀 Linux 內(nèi)核源碼的呢?有什么工具、方法與其它經(jīng)驗可以分享?
姜亞華:
我也是一行一行代碼看下來的,幾點建議供大家參考。
首先,先大概弄清原理,再仔細(xì)研究代碼,事半功倍。對于已經(jīng)成熟的模塊,可以先借助書籍和博客大致理解它的基本信息。
其次,邊讀代碼邊做筆記,防止看了后面忘記前面。做筆記的軟件蠻多的(比如微軟的 OneNote),選擇用的習(xí)慣的就好。
最后,自我激勵,堅持到底,最好是興趣使然。
好在大家不需要從頭開始了,我已經(jīng)把自己看過的代碼的截圖放在隨書資料中了,算是一小段捷徑吧。這些截圖里面,某函數(shù)、它調(diào)用的函數(shù)等函數(shù)調(diào)用關(guān)系使用紅線標(biāo)示(如下圖),內(nèi)容包括內(nèi)存管理、文件系統(tǒng)和進(jìn)程管理三大模塊。
大家遇到疑問也可以聯(lián)系我,共同探討,OSC 站內(nèi)信(always_first_meet)或者郵件(linux_kernel_os@163.com)都可以。
Linux 內(nèi)核十分龐大,閱讀源碼的時候哪些部分是最開始的時候必須的,而哪些部分可以作為后續(xù)針對性的補(bǔ)充?
姜亞華:
內(nèi)核代碼量龐大,模塊間的關(guān)系也錯綜復(fù)雜,建議初學(xué)者可以從相對簡單而且獨立的模塊入手,比如一個簡單設(shè)備的驅(qū)動。
先了解驅(qū)動本身的邏輯,之后是它的上下游,然后擴(kuò)展到相關(guān)模塊,最后自由發(fā)揮。
舉個例子,在 drivers/input/keyboard 下面的文件是鍵盤驅(qū)動,我們選擇一個文件。
第 1 階段,查看 xxx_probe 等函數(shù),梳理控制和數(shù)據(jù)流程,理解驅(qū)動需要做什么。
第 2 階段,適當(dāng)拓展,代碼內(nèi)調(diào)用的函數(shù)大概是如何實現(xiàn)的,驅(qū)動涉及的中斷、定時器、input 子系統(tǒng)等機(jī)制的原理,這些機(jī)制相對獨立,文檔也多,多花些時間即可。
第 3 階段,追根溯源,研究 xxx_probe 是如何被調(diào)用的,i2c 總線的驅(qū)動(假設(shè)鍵盤接 i2c 總線),device/device_driver/bus 的關(guān)系(驅(qū)動架構(gòu))。
階段 2 與 3 可以同時進(jìn)行。
第 4 階段,自由發(fā)揮,按照工作需要和興趣,進(jìn)軍內(nèi)存管理、文件系統(tǒng)和進(jìn)程管理等模塊。
就算是能夠閱讀源碼,另一個問題也會出現(xiàn),就是讀了源碼,理解了它的邏輯,但是有什么用呢?最簡單的是增長了自己的見識,但是實際上這就像閱讀了一本書但是不輸出自己的理解與觀點,沒有太大的作用。您是怎么看待并且怎么解決這個問題的呢?
姜亞華:
研究內(nèi)核有什么用,這是一個值得深思的問題。
中國現(xiàn)在這個時候的確需要沉下心玩底層系統(tǒng)的人,中國渴望自主操作系統(tǒng)已經(jīng)很久了,尤其是現(xiàn)在這種多事之秋。但是如果沒有大批工程師在這個領(lǐng)域積淀的話,操作系統(tǒng)無疑是一種空談。
先不論未來的國產(chǎn)操作系統(tǒng)是否一定是 Linux 內(nèi)核的,研究 Linux 內(nèi)核本身也是很好的技術(shù)積累途徑。
僅僅從個人職業(yè)生涯角度出發(fā),研究內(nèi)核對個人技術(shù)的成長有極大幫助,可以分多個層次看待。
第 1 層次,初識,對內(nèi)核有大概的了解,需要花時間深入工作相關(guān)的模塊。研究內(nèi)核會占用大量時間,產(chǎn)出并不明顯。
第 2 層次,入門,熟悉工作相關(guān)的模塊,理解內(nèi)核模塊間的關(guān)系。研究內(nèi)核會讓你豁然開朗,經(jīng)常有“原來 xxx 是這么實現(xiàn)的”之類的感嘆。
第 3 層次,熟悉或精通,對內(nèi)核常用模塊有一定研究,熟悉代碼。即使是新模塊,也可以快速厘清脈絡(luò)。
除了第 1 層次“浪費”時間外,花時間研究內(nèi)核可以反過來提高我們的效率。研究到了一定程度后就可以進(jìn)入一個良性循環(huán),研究得越多,效率越高,節(jié)省的時間越多,可以研究的越多。
另外,看的代碼越多,越有能力解決錯綜復(fù)雜的問題,金老爺子也說“重劍無鋒,大巧不工”,絕對的實力才是硬道理。
還是 xxx_probe 的例子,如果我們的 probe 沒有被調(diào)用,新手可能會檢查 device 和 device_driver 的名字是否匹配,研究過驅(qū)動架構(gòu)的工程師可能分 device、device_driver 和 match 三部分檢查。
如果三部分看似都沒有問題,但是 probe 依然沒有調(diào)用呢?研究過代碼的工程師可能會想到 device 是不是已經(jīng)和另一個 device_driver 匹配了。
經(jīng)驗可以幫助我們看到問題的關(guān)鍵部分,真正研究過代碼才能看到問題的本質(zhì)。庖丁看到的不是牛,而是肌理結(jié)構(gòu),到了這種境界換成羊也是一樣的。
最近經(jīng)常聽到一句話,“工作 xx 年,就是一年的工作經(jīng)驗重復(fù) xx 年”,如果只是要求“會用”的層次,的確一年足夠,但工程師在這種情況下早晚會失去核心競爭力。
有人傾向于使用結(jié)論,但要做的應(yīng)該是總結(jié)和解釋結(jié)論。
現(xiàn)在學(xué)習(xí) Linux Kernel,主要有哪些工作方向呢?又是哪些類型的公司、業(yè)務(wù)會主要需要這種能力?
姜亞華:
驅(qū)動工程師、嵌入式工程師、系統(tǒng)工程師、Linux 程序開發(fā)工程師,甚至運維工程師這些崗位都需要了解內(nèi)核,就像從事 Java 開發(fā)的工程師需要研究 JDK 一樣,并不是只有從事內(nèi)核相關(guān)工作的工程師才需要研究內(nèi)核,反過來懂內(nèi)核的人向上發(fā)展也是很容易的。
有半導(dǎo)體相關(guān)業(yè)務(wù)的公司都需要這類人才,以前傳統(tǒng)的半導(dǎo)體公司需求大一些,但近幾年互聯(lián)網(wǎng)公司也紛紛涉足半導(dǎo)體領(lǐng)域,BAT 都包括在內(nèi)。美國一系列動作之后,近期中國進(jìn)入了芯片和操作系統(tǒng)研發(fā)熱潮,一大批芯片公司成立,燧原、平頭哥、寒武紀(jì)與商湯科技等等,它們也都需要內(nèi)核相關(guān)的人才。
您這本書講到關(guān)于智能設(shè)備的開發(fā),Linux Kernel 與 AI 有什么特別大的關(guān)系呢?
姜亞華:
其實這個問題我在這次寫的書里有解釋。
如上圖,“硬件廠商負(fù)責(zé)硬件,原語(primitives)庫一般也由他們維護(hù),比如 AMD 的 MIOpen、Intel 的 MKL 和 Nvidia 的 cuDNN,多數(shù)程序員并不會接觸這部分內(nèi)容,而是使用已有的 Framework。
Framework 的選擇也是多樣化的,Google 的 TensorFlow,F(xiàn)acebook 的 PyTorch,微軟的 CNDK,亞馬遜的 MXNet、Theano 和 Keras。很明顯,目前依然是百花齊放的局面,但技術(shù)的發(fā)展終歸只能是“三分天下”,甚至是“一統(tǒng)天下”。目前已經(jīng)存在與這些 Framework 配套的工具,比如 Tensorboard,可以用來查看 TensorFlow 的訓(xùn)練狀態(tài)。
由于深度學(xué)習(xí)計算量太大,并行計算技術(shù)也會有所涉及,比如 MPI(Message Passing Interface)通信協(xié)議、英偉達(dá)的 NCCL(NVIDIA Collective Communications Library)。
數(shù)據(jù)對深度學(xué)習(xí)十分重要,大數(shù)據(jù)是必不可少的。數(shù)據(jù)作為輸入,模型作為輸出,應(yīng)用于數(shù)據(jù)中心、個人計算機(jī)、機(jī)器人和無人駕駛汽車等設(shè)備中。
縱觀這整個過程,并沒有哪一個環(huán)節(jié)提到了 Linux,但實際上多數(shù)環(huán)節(jié)都與 Linux 有關(guān)。雖然這些關(guān)系可能只有少數(shù)程序員關(guān)注,但隨著技術(shù)的成熟,新的智能設(shè)備,甚至新的操作系統(tǒng),又會轉(zhuǎn)回到我們熟悉的內(nèi)核。
在您研究 Linux 內(nèi)核的過程中,有沒有覺得 Linux 內(nèi)核其實還可以用其它語言實現(xiàn)一次,這樣對于入門學(xué)習(xí)會好很多,比如用 Python 這種簡單理解的語言。這樣的想法可行嗎?會遇到什么技術(shù)問題?
姜亞華:
內(nèi)核里面有很多代碼采用的都是面向?qū)ο蟮乃枷耄热?VFS 采用了較多面向?qū)ο蟪绦虻脑O(shè)計模式,像 command 與 template method 等,使用其它語言尤其是面向?qū)ο笳Z言來實現(xiàn) Linux 內(nèi)核是可行的,但是不得不說的是其它語言(比如 Python)很難有 C 語言的執(zhí)行效率。
2019 年是 Linux Kernel 28 周年,分享一下您在這其中關(guān)于 Linux Kernel 印象最深的事情吧。
姜亞華:
Linux 內(nèi)核是開源的,天生與微軟(更確切的說是 Windows)就是宿敵。微軟對 Linux 前期的敵對和近些年的轉(zhuǎn)變是件很有趣的事情,敵對時期就不多說了,近幾年微軟宣布“愛 Linux”,也做了很多實事,Azure、SQL Server 和 Visual Studio Code 等都有了 Linux 的身影。
這對 Linux 是好是壞先不說,這起碼說明了 Linux 的強(qiáng)大,有種“東方教主,千秋萬代,一統(tǒng)江湖”的感覺哈哈。
這是一件關(guān)于 Linux Kernel 印象比較深的事情,還有另一件也值得一提,那就是我今年寫了一本 Linux Kernel 相關(guān)的書籍《精通 Linux 內(nèi)核——智能設(shè)備開發(fā)核心技術(shù)》,借此也宣傳宣傳,同時希望能夠通過這本書為道友們提供些許幫助。
這本書基于 Linux 5.x,歷時五年,研究數(shù)百萬行代碼總結(jié)而成,共分為五個部分,按照先易后難的順序剖析內(nèi)核。首先介紹基礎(chǔ)知識,包括數(shù)據(jù)結(jié)構(gòu)、中斷處理、內(nèi)核同步和時間計算等,它們是理解后續(xù)章節(jié)的前提,在此基礎(chǔ)上詳細(xì)討論內(nèi)存管理、文件管理和進(jìn)程管理三個核心模塊,最后一部分升華篇融合了前面多個模塊。重點和難點部分均配以圖表、代碼或?qū)嶒?,力求深入淺出。
除此之外,本書列舉了大量實例,分析了安卓操作系統(tǒng)的核心技術(shù),使讀者能夠深刻的理解理論知識。本書的讀者需要熟悉 C 語言,能夠?qū)?nèi)核有一定了解更好。推薦初學(xué)者按照本書的既定順序閱讀,熟悉內(nèi)核的讀者可以直接閱讀三個核心模塊。
當(dāng)然了,借這個平臺,也希望與道友們多多交流(包括但不限于本書的內(nèi)容),歡迎大家跟我交流共同促進(jìn)。另外本書是機(jī)械工業(yè)出版社《Linux 技術(shù)與應(yīng)用叢書》的開篇之作,后續(xù)還會有一系列書籍出版,大家也可以關(guān)注關(guān)注。
采訪嘉賓介紹
姜亞華,一直從事與 Linux 內(nèi)核和 Linux 編程相關(guān)的工作,研究內(nèi)核代碼十多年,對多數(shù)模塊的細(xì)節(jié)如數(shù)家珍。曾負(fù)責(zé)華為手機(jī) Touch、Sensor 的驅(qū)動和軟件優(yōu)化(包括 Mate、榮耀等系列),以及 Intel 安卓平臺 Camera 和 Sensor 的驅(qū)動開發(fā)(包括 Baytrail、Cherrytrail、Cherrytrail CR、Sofia 等)。現(xiàn)負(fù)責(zé) DMA、Interrupt、Semaphore 等模塊的優(yōu)化與驗證(包括 Vega、Navi 系列和多款 APU 產(chǎn)品)。