歡迎光臨
每天分享高質量文章

臺灣開源人年會之Linux內核之旅(附演講PPT及講解)

    今年是第一次參加COSCUP 開源人年會,到底與大家分享些什麼,與社區大牛BOB溝通後,他建議我就分享自己這20年來的Linux內核之旅。

   今年COSCUP 邀請各領域大伽,大打”你今天open source 了嗎”活動口號,宣揚開源精神。印象深刻的是歌手與知名音樂人林強在座談會上的分享:“2006 年正式與中華著作權協會解約,就是為了推動 CC (知識共享)授權,因此所有作品上網,都可以自由複製散佈。”林強認為”你喜歡我的歌,跟我說要拿去用,是你的心意”,取之於公,用之於公是他的核心價值。因為自己的作品被人喜歡,因此更應該與公眾分享

   我的演講安排在會議第二天(8月12日)的11點20分,第一天聽了各路大伽的講座後,看到大家上臺後首先會介紹我是誰,‘我是誰?’, 這是一個很難參透的問題,回答什麼似乎都不完全對,於是,轉換思路,回答一下“我從哪裡來”,自己的家鄉法門寺和學校所在地大雁塔具有標誌性,想必大家知道的。當這一想法出來後,整個演講的大思路就理清楚了,

1. 我從哪裡來?(通過家鄉和學校所在位置勉強來回答,非究竟回答)

2. 我是誰?(通過自己20年所做開源相關事情來回答,也非究竟回答)

3. 我要到哪裡去(通過“六祖壇經”中的“悟”給出究竟回答)

(為了讓聽眾更容易理解內容,整個講稿是繁體版的)

2018年COSCUP 開源人年會在臺灣科技大學舉辦。

我從哪裡來?

法門寺(Famen Temple),又名“真身寶塔”,位於炎帝故里、青銅器之鄉——寶雞市扶風縣(我的家鄉),2004年被聯合國教科文組織評為“世界第九大奇跡”。

大雁塔是為儲存玄奘由天竺經絲綢之路帶回長安的經卷佛像而修建的塔,這是西安郵電大學所在地、

  屈原的“天問” 問出了若干看似司空見慣的問題,在講授操作系統的過程中有若干問題,其中最核心的問題是行程到底是什麼?當fork()一個行程後,操作系統是如何生出一個孩子行程的?一個行程產生以後到底是怎麼運行的?一個行程結束後,操作系統又做了哪些事情?

  一個程式編譯鏈接後形成怎樣的地址空間?運行時是如何裝入到記憶體的?一個虛擬地址到底是如何轉換成物理地址的?硬體是如何參與的?操作系統是怎樣配合的?

  

學界和業界對微內核和宏內核操作系統各有偏愛,我們曾閱讀了《操作系統設計與實現》這本書,其原理的清晰性為後來深入分析Linux內核打下基礎。在這裡,特別強調的是,操作系統的原理相當於機制或者說面向物件中的基類,而各個具體的操作系統相當於策略或者物件,因此,把握原理的清晰脈搏,對深入某個具體的操作系統有很大的幫助。雖然業界偏好宏內核操作系統,但google最新操作系統Fuchsia是微內核。

操作系統本身是硬體和軟體的橋梁,這一橋梁體現在何處?記憶體的尋址方式是突破口,我們曾閱讀了《保護樣式下的80386編程》,搞清楚虛擬記憶體管理的硬體支撐後,驀然迴首,OS只是在燈光闌珊處與硬體相會,誰也離不開誰。

    內核版本不斷的在變化,在那些變化的背後,一定有不變的東西。很幸運,我們在1999年的時候閱讀了《Linux Kernel Architecture》這篇文件,從此,有了導航圖,在以後多年的內核變化中,我們始終手上拿著這張圖,使得進入內核這片茂密的森林後不至於迷失方向。

   進入Linux內核上千萬行原始碼的世界,就像走入迷宮,你手上必須有地圖,首先,你得搞清楚內核原始碼的目錄結構,知道每一部分原始碼它的歸處何在,不僅如此,你還得知道哪些大大小小的原始碼檔案它們之間的內在聯繫,好在,內核開發者知曉你的困惑,在每一個目錄下都有兩個檔案,那就是Kconfig和Makefile,二者的配合,讓你有了前進的燈塔。

1999年的那個春天,有7名學生加入分析內核原始碼的興趣小組,他們每人分析一個子系統(啟動,記憶體,行程,檔案,驅動,調度,IPC等),有的同學啃得動,飛速進步,有的同學退縮了,但最終,我們還是把2.0版的內核啃完了。並出版了第一本書《Linux操作系統內核分析》。

  2002年,隨著內核版本的變化,又出版了針對2.4內核的《深入分析Linux內核原始碼》一書,2006年後這本書就不再出版了,但很多讀者來郵件說希望看到這本書,於是在2007年,就在我們的“Linux內核之旅”網站全文發佈了這本書的原文,從此,這本書就像插上自由的翅膀,不知道飛到哪去了。

   撰寫這些書時,是順著知識和原始碼的結構來寫的,都不太適合教學,為了把Linux內核引入課堂,於是編寫了《Linux 操作系統原理與應用》這本書,第一章就讓學生動手寫Linux內核模塊,在實踐中掌握內核。

   開源之門打開後,西郵Linux興趣小組於2006年成立了,這是得力於王亞剛老師和王聰同學。小組的理念是“Free, Open&Share;”

  2008年Richard Stallman來到西郵興趣小組與學生交流。

2008年內核核心成員Herbert.xu來到西郵,為學生們講述Linux內核的開發過程以及如何參與。

LVS(Linux Virtual Server)的作者,開源界大牛章文嵩博士來到西郵與學生交流曾經開發LVS的過程。章博士09年去阿裡後推動了阿裡的開源,目前阿裡有200多個(可能更多)款軟體開源。目前,國內各大互聯網企業都不同程度的加入開源的行列,開源軟體在各大企業的應用形成一種強大的氛圍了。

  從2006年開始,西郵Linux興趣小組參國際自由軟體日 Software Freedom day活動,每年的9月份大概有500名左右的學生參加這項活動。

 2018年第十三屆開源中國開源世界高峰論壇在北京舉行,本人有幸獲得開源傑出貢獻獎,本次大會,各大企(華為,騰訊,百度,阿裡,小米,浪潮等企業)展示了其不僅大規模應用開源軟體,還深度參與開源。

  2002年,翻譯《UnderStanding The Linux Kernel》這本書時的場景還歷歷在目。“曾經’我們拿到Linux內核代碼開始研究時,可以說茫然無措。其規模之大,叫“覆壓三百餘里,隔離天日”似乎不為過;其關係錯綜複雜,叫“廊腰縵回,檐牙高啄,各抱地勢,勾心鬥角”也不言過其實;阿房宮在規模和結構上給人的震撼,可能與Linux有異曲同工之妙。“楚人一炬,可憐焦土”,可能正是因為它的結構和規模,阿房宮在中國兩千多年盛極的封建歷史中終於沒有再現,只能叫後人扼腕嘆息;但是,Linux卻實實在在的矗立在我們面前,當我們徘徊在這宏偉宮殿之前時,或許,我們也需要火炬——不是用來毀滅,而是為了照亮勇者腳下的征途”

LinusTorvalds在我們面前展現的Linux魔法卷軸,讓我們的視野進入一個自由而開放的新世界。自由意味著自我價值的實現,開放代表著團結協作的理想,這對於從沒把握過操作系統的中國人來說,無疑點燃起了心中的夢想。於是,許多人毫不猶豫地走進來了,希望深入到那散髮自由光彩、由眾人團結協力搭造起的殿堂。但是很快,不少人退縮了。面對這樣一個汪洋大海,有的人迷惑了,出海的航道在哪裡?有的人倒下了,漫漫征途何時是盡頭?我常常想,如果那時他們手中就有這本書的話…

P.Bovet和MarcoCesati攜手,為我們打造了這本鴻篇巨著,自此我們有了火把,有了航海圖,於是我們就有了彼岸,有了航道,也有了補給碼頭。不是嗎,中斷雖繁,但第四、六兩章切中肯綮地剖析,肯定能讓你神清氣爽;儲存器管理雖難,但多達三章細緻入微的說理,一定會讓你茅斯頓開。而內容的組織更是別具匠心,每章開始部分一般性原理的描述,打破知識的局限,將每個部分的全景展現在你面前。而針對每個知識點,落到實處的獨到分析,又會使你沉迷於知識的融會貫通之中。第三版對Linux2.6的全面描述,會使你為2.4與2.6之間的溝壑而感嘆,但請放心,你曾從Linux舊版本獲取的點滴依然是你前進的基石。總之,你面對的不再是赤裸裸的代碼,而是真正能雅俗共賞的藝術。

對整個Linux社區來說,這絕不是微末的貢獻而已,連Andre Morton都已經指出:“內核的學習曲線變得越 越長,也越來越陡峭。系統規模不斷擴大,複雜程度不斷提高。長此以往,雖然現在這一撥內核開發者對內核的掌握越發爐火純青,但卻會造成新手無法跟上內核發展步伐,出現青黃不接的斷層”。而這本書的目的,無疑於此吻合。按照這本書指明的道路,我們可以躲過暗礁,繞過險灘,穿過逆流,勇往直前。這也是為什麼這本書總在Linux書籍排行榜中穩居前列的原因之一。

對整個Linux社區來說,這絕不是微末的貢獻而已,連Andre Morton都已經指出:“內核的學習曲線變得越 越長,也越來越陡峭。系統規模不斷擴大,複雜程度不斷提高。長此以往,雖然現在這一撥內核開發者對內核的掌握越發爐火純青,但卻會造成新手無法跟上內核發展步伐,出現青黃不接的斷層”。而這本書的目的,無疑於此吻合。按照這本書指明的道路,我們可以躲過暗礁,繞過險灘,穿過逆流,勇往直前。這也是為什麼這本書總在Linux書籍排行榜中穩居前列的原因之一。–摘自譯者序

Linux最為人稱道的莫過於它的自由精神,所有原始程式碼唾手可得。原始碼在前,了無秘密。是的,但是我們在面對它的時候,為什麼卻總是因為這種規模和層面所造就的陡峭學習曲線陷入困頓呢?很多朋友就此倒下,縱然Linux世界繁花似錦,縱然內核天空無邊廣闊。但是,眼前的迷霧重重,心中的陰霾又怎能被陽光驅散呢?縱有雄心壯志,拔劍四顧心茫然,腳下路在何方?

 Linux內核入門是不容易,它之所以難學,在於龐大的規模和涉及的層面。規模一大,就不易現出本來面目,渾然一體,自然不容易找到著手之處;層面一多,就會讓人眼花繚亂,盤根錯節,怎能讓人提綱挈領?

“如果有這樣一本書,既能提綱挈領,為我理順思緒,指引方向,同時又能照顧小節。闡述細微,幫助我們更好更快地理解STL原始碼,那該有多好”,這番話雖然針對的是C++,但道出的是研習原始碼的人們共同的心聲。但Linux原始碼研究的方法卻不大相同。這還是由於規模和層面決定的,比如說,在語言學習中,我們可以採取小步快跑的方法,通過一個個小程式和小嘗試,就可以取得漸進的成果,就能從新技術中有所收穫。而Linux呢?如果沒有對整體的把握,即使你對某個區域性的演算法、技術或是代碼再熟悉,也無法將其融入實用。其實,像內核這樣的大規模的軟體,正是程式設計技術施展身手的舞臺(當然,目前的內核雖然包含了一些面向物件的思想,但還不能讓C++一展身手。)

就我們的經驗,內核初學者(不是編程初學者)可以從這本書著手,對內核各個核心子系統有個整體把握,包括它們提供什麼樣的服務,為什麼要提供這樣的服務,又是怎樣實現的。而且,此書還包含了Linux內核開發者在開發時需要用到的很多信息,包括除錯技術、編程風格、註意事項等等。–摘自譯者序

《The Linux kernel primer》以Linux操作系統為基礎,詳細介紹了Linux內核子系統,並輔以大量內核原始碼和示例程式進行演示,引領讀者深入Linux內核。《Linux內核編程》的主要內容包括:Linux基礎知識、內核探索工具集、行程的整個生命周期、儲存器區、頁面、Slab分配器、用於輸入/輸出的各種設備、檔案系統、搶占、自旋鎖、信號量、內核引導、構建Linux內核,以及向內核添加代碼等。同時還簡單介紹了一些應用工具和實用程式,從而可以獲取理解內核內幕所需的信息。每章末尾都給出一些練習,涉及內核運行的操作及工作原理。

作為初學者,你可以先從《Linux操作系統原理與應用》入門,然後消化理解《The Linux Kernel Development》,在這本書的基礎上,如果你側重於內核的瞭解,可以進一步研究《Understand Linux Kernel》和原始碼本身;如果你側重於實際編程,可以研讀《Linux Device Driver》,直接開始動手工作。

從原始碼的結構,可以羅列出Linux內核的各個子系統,各個子系統代碼量有怎樣的變化,可以從SLOC(Source Linux Of Code)看出:

(1)Linux 的體系結構相對穩定

(2)系統結構和子系統數變化不大,平均每模塊的圈複雜度呈下降趨勢.但系統整體規模和複雜性分別呈超線性和接近線性增長趨勢。

(3)drivers 和arch 等子系統的快速變化引起是引起系統複雜性增加的主因。

(4)Linux 演化的主要推動力是系統新特性新功能的增強,以適應系統資源的進化 。

Linux新功能的增加是以機制的形式提供的,表現在具體實現上就是內核提供了Linux內核模塊(LKM)機制:

操作系統系統的設計原則:提供機制而不是策略

機制:提供什麼樣的功能。

策略:怎樣實現這些功能。

   OS是應用程式服務的提供者,與應用程式之間是C/S結構,應用的需求在不斷變化,OS所提供的服務也隨之要改變,但是一定要有一個不變的仲裁者,這就是相對穩定的系統呼叫

  VFS機制之經典在於自從70年代從Unix系統中提出以後,就穩定不變,但又適應任何的變化,即使雲儲存的CEPH檔案系統也不能逃出VFS的如來掌。

 在Linux內核代碼中,每一個新功能的出現,幾乎都是以機制的形式呈現,當你發現這一規律,驀然迴首,會發現很多時候自己只不過是一個策略的跟隨者,而不是機制的創新者,於是乎,謙虛和恭敬心油然而生。

   講座後,有位軟體開發者來與我交流,說聽了機制與策略分離的思想後豁然開朗,曾經迷惑的問題知道了頭緒,我建議他自己再繼續悟下去。

Linux內核過於龐大,代碼量如此之多,不經然間,走進去了,迷失了,戚戚然誰能幫你?在知識和能力之間要有一個轉身,非“悟”難以到達。

《六祖壇經》中,神秀大師說:“身是菩提樹,心如明鏡臺,時時勤拂拭,莫使惹塵埃”,慧能大師說“菩提本無樹,明鏡亦非台。 本來無一物,何處有塵埃! ”,兩位大師都是生命的悟者,對我們一般人來說,”時時勤拂拭,莫使惹塵埃“更適合些。

“祖相送直至九江驛。祖令上船,五祖把櫓自搖。惠能言:請和尚坐,弟子合搖櫓。祖雲:合是吾渡汝。惠能曰:迷時師度,悟了自度;度名雖一,用處不同。惠能生在邊方,語音不正。蒙師付法,今已得悟,只合自性自度。祖雲:如是如是。以後佛法,由汝大行,汝去三年,吾方逝世。汝今好去,努力向南,不宜速說,佛法難起。” 摘自《六祖壇經》自序品第一。

    我們平時所學所思都屬於意識範圍內的,還不具備把我們從此岸度到彼岸的力量,當把知識“悟”之後內化為智慧時,這條船就有了自己的發動機,可以自行航行了,也就是自度的力量才真正出來。

這位初中專稅務專業的謝寶友同學,在自學計算機的道路上孜孜不倦,曾把《ULK》這本書通讀並註釋了所有代碼,並除錯了相關代碼,成為對內核中出現的任何故障都能很快定位並解決掉的“老中醫”,更值得稱贊是他開始自己編寫工業級操作系統了。

這次講座後,臺大有位同學來問我,說內核的書看了不少,代碼也看了不少,但是依然覺得有一個陡度無法爬上去。我說這時候,你可能需要有一位具有一線工程經驗的導師來手把手的帶你。

    基於師徒樣式開源大學的想法由來已久,主要基於韓愈《師說》中“是故弟子不必不如師,師不必賢於弟子”,人人皆可為師,也可為弟子,當弟子賢於師時,他可以找到更厲害的師,如此迴圈,除非你達到六祖慧能大師的程度,否則,必然需要一個師的引領。

   說一千道一萬,你可能會問到底如何才能入門Linux內核,《Linux操作系統原理與應用》一書全程錄製了講課視頻,目前放在騰訊視頻上,你可以搜索,也可以加入藍墨雲班課開放分享班381045,有完整的資料可以觀看和下載。

   COSCUP給我的講座時間是40分鐘,講完這些內容花了38分鐘,隨後有各種提問,甚至有聽眾問到了翻譯的書是否在臺灣出版,這個可以與出版社聯繫的。

    這裡要特別感謝的是,會議的主辦方利用午飯間隙,還組織了1個小時關於“開源與教育”的專場討論,臺灣大學,臺灣科技大學的教授,還有企業一線的工程師等20多人進行了自由而熱烈討論,討論中談及最多的是如何把開源文化和開源軟體引入到教學,或許,每年會有這樣的專場。希望我們內地更多的人參加 COSCUP大會,加深加大兩岸的交流

    在次附上內地來參加這次會的部分人員的合影:

   


赞(0)

分享創造快樂