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

歡迎大家給Linuxer投稿,獲得任意在售技術圖書: Linuxer-"Linux開發者自己的媒體"首月稿件錄取和贈書名單
我和宋寶華老師大約是在2010年時候在以個會議上認識,當時感覺很朴實、很睿智、很有才華。會議結束之后問了小姑娘才知道這位是大名鼎鼎的宋寶華老師。此后我一直有關注他的微信微博以及Linux驅動的書籍,是在國內一個很樂於分享技術的布道者,另外他還是Linux內核ARM SoC分支內的Maintainer之一。
非常榮幸能受到宋老師邀請在他的微信公眾平台上分享一下我的Linux內核學習經驗。我的筆名叫笨叔叔,是最近這一年自己給自己起的名字,因為最近自己不自量力寫了一本《奔跑吧Linux內核》的書。我是一個很普通的工程師,雖然10幾年來一直從事和Linux驅動以及內核的工作,可是卻平平淡淡。至今還沒有在社區發過一個patch,可以說是一個zero patch的Linux內核吃瓜叔叔了。可能和自己工作崗位有關系,從事Linux開發的工程師分為兩種,一種是做產品的工程師,另外一種是做開源社區的工程師。我自己做的不夠好,因此也談不上有什么好的經驗和大家分享,下面就隨便瞎扯淡吧。
我的學習經歷可以分成下面幾個階段吧。
1.畢業設計階段。當年畢業設計階段做單片機相關的,仰慕實驗室的其他同學在學習Linux內核作為畢業設計。當時厚厚的幾本Linux內核書籍吸引我了,我也偷偷的買了,只是心里咕嘟,不知道猴年馬月才能看到懂。

2. 初入職場。第一份工作是在一家做ARM開發板的公司工作,有點類似FAE。可是就是這樣的工作,讓我從單片機過渡到了ARM處理器和Linux內核。從移植成熟的開發板開始玩起,從簡單的字符設備讀取做起,慢慢深入到驅動開發中。
3.獨立開發驅動。離開第一家公司之后,在其他公司陸續獨立開發了幾個驅動程序,比如基於V4L1和V4L2的視頻數據采集卡。獨立開發驅動程序其實很鍛煉人,首先需要對所寫的硬件規范要很熟悉,其次對需要采用的內核接口和框架也要有所了解,然后才能開始寫驅動程序,在調試過程中你會發現遇到很多問題,帶着這些問題在深入思考。
4. ARM芯片系統移植。后來到了一家芯片公司,做基於ARM的手機芯片的。從基於ARM9開始,一直做到雙核Cortex-A9以及4核Cortex-A7。做新芯片的系統移植比第一份工作的開發板移植要有意思的多,開發板移植的大部分工作芯片原廠就做完了。做芯片的,自己就是芯片原廠。需要和ARM core以及芯片內部的很多IP打交道。這樣讓我對ARM core和SoC內部實現有更深入的了解。
5.參與UKSM項目。有幸參與了和內存管理相關的一個項目,並且得到夏老師的悉心指導和點撥,讓我對內存管理有了更深入的理解。
6.到了櫻桃公司的手機部門做客戶支持。我又回到做FAE的崗位了,可能有人瞧不起FAE,可是FAE可以讓我從多方面了解Linux內核,而不局限於某一個技術點。比如說,有客戶問,你們家芯片是怎么支持多CPU調度的?怎么支持大小核調度的?有時候從研發的角度思考問題會有一些技術的局限性,多接觸一些不同的觀點也是好事情,同時被客戶吊打也是一種人生體驗。我依然覺得技術是為產品服務的,多了解一下技術以外的事情也不是壞事。
7. 撰寫《奔跑吧Linux內核》。因為有了上述研發和FAE的經驗,加上《情景分析》十多年來一直沒有人更新,我一直在等毛老師更新最新版本或者國內大牛來做這個事情。可是十多年了一直了無音訊,因此我就自告奮勇,冒着被天下讀者吊打的風險來撰寫一本基於《情景分析》的最新版本的內核書籍。《奔跑吧Linux內核》基於情景分析,但是由增加了一些新的構思,比如說基於實際問題來分析代碼,以奔跑卷為開篇。書中里盡可能的多畫一些圖,每章之前有思考題,每章之后有總結等。總來的說就是“毛氏情景分析”+“笨氏吊打法”。
真要總結一些什么學習經驗的話,我覺得有如下幾點:
1. 要有一顆熱情的心和對Linux充滿了興趣和好奇心。如果想在學習內核可以賺大錢,那真不必了,因為連Linux校長linus同志都沒發大財。雖然這幾年Linux內核的熱情被雲計算、AI、自動駕駛等新興熱點超越了,可是Linux內核作為基礎設施未來幾年還是很難被替代的,無論雲計算、AI、自動駕駛還是ARM服務器等等,這些應用場景大部分還是運行在Linux內核之上,因此學習和掌握Linux內核還是必不可少的一門手藝。Linux內核像股市中的白馬股和藍籌股,雖然不在是被爆炒的熱點,但依然星光璀璨。可以讀讀Linus同志的自傳《Just for fun》。
2. 要有實際動手的機會。如果公司里有實際的Linux驅動或者內核項目,那是很好的鍛煉機會。如果沒有,那可以自己創造一個。比如可以按照《奔跑吧Linux內核》第6章的實驗內容,采用Qemu+gdb+eclipse+O0調試方法來對感興趣的內核模塊進行單步調試,這樣可以加深對內核代碼的理解。另外也可以參與一些其他的開源項目,github上有不少很不錯的內核開源項目
3. “笨氏吊打法”即要帶着問題去看內核代碼。這些問題可以是自己工作上遇到的問題,也可以是自己閱讀代碼中產生的疑問,總之你有疑問就不要放過,被客戶吊打的問題更不能讓它輕易溜走。內核代碼變得越來越龐大,不帶着好奇心和問題去看代碼很容易在代碼中迷失了方向。這也是《奔跑吧Linux內核》推崇的做法。拿mmap來說,相信很多驅動開發者或者應用開發者都用過這個API,可是有沒有想過mmap是怎么實現的?使用mmap需要注意哪些方面?如果用戶程序采用只讀的方式來mmap文件內容到用戶空間然后往這段進程地址空間寫入,會發生什么情況?再比如get_user_page()這個函數,有不少驅動程序使用了它,你有沒有想過它是如何實現,又是如何pin住物理頁面的?
4. 參與內核社區開發。在這一點上,我給自己打分的話一定是0分。我自己沒有參與過內核社區的開發,也沒有一個patch,雖然定閱了Linux-mm的mailist,可是真的沒有時間很認真的參與討論。希望讀者朋友們如果有時間和精力可以訂閱自己感興趣的mailist,盡可能的參與社區的討論,這樣對自己的提高是顯著的。能參與開源社區的開發固然是好事,如果你是做產品研發的部門,沒有時間和精力參與到社區里,其實也不用傷心,很多Linux專家也不在社區里混。參與一款好產品的研發也是一件很了不起的事情,因為好產品不僅僅是開源技術,還涉及好多方面。
總之一句話,帶着問題去看內核代碼,然后擼起袖子動手實踐吧,這也是《奔跑吧Linux內核》給大家推薦的做法。

《奔跑吧Linux內核》經歷了2年多的痛苦奔跑,終於和大家見面,我希望把我這10多年來對Linux的理解和被吊打的東西抽象出來與大家分享。作品不完美依然有不少瑕疵,期待讀者慷慨的給出批評和吊打意見。
京東:http://item.jd.com/12152745.html?dist=jd
亞馬遜:https://www.amazon.cn/dp/B074JV6WGN/ref=sr_1_1?ie=UTF8&qid=1502099486&sr=8-1
異步社區:http://www.epubit.com.cn/book/details/4835
當當:http://product.dangdang.com/25138842.html
笨叔叔聯系方式:
微信號:runninglinuxkernel
微博/微信公眾號:奔跑吧Linux內核
