本文系轉載,著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。 作者: 陳莉君 來源: 微信公眾號linux閱碼場(id: linuxdev) 初次踏入Linux 幾多耕耘,幾多收穫,不小心在Linux這個自由王國暢游了多年。依稀記得剛進入這個世界時的那份恐慌和無知,更慶幸那時的無 ...
本文系轉載,著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
作者: 陳莉君
來源: 微信公眾號linux閱碼場(id: linuxdev)
初次踏入Linux
幾多耕耘,幾多收穫,不小心在Linux這個自由王國暢游了多年。依稀記得剛進入這個世界時的那份恐慌和無知,更慶幸那時的無知無畏。在那個20世紀的最後一年,貿然帶著幾個弟子踏入一無所知的Linux世界。
1999年的那個春天,也是在講授操作系統,只不過是鼓勵大家參加我的興趣小組。居然有10個人報名了(驚喜)。最初也無非是希望在課堂之外,讓大家能夠多接觸一些東西,有點盲目,但大家興緻很高。在我們每周相約討論的過程中,思路越來越多,機會之神也來光顧。人民郵電出版社希望就開源的Linux寫一本分析其內核的書。從來沒有寫過書的我,敢承接嗎?不知勇氣從何而來,出版社約定我3個月拿出書稿,當時居然毫不猶豫地答應了。
這書該怎麼寫?從何入手?既然是分析內核源代碼,那就從源代碼開始閱讀吧,於是,劃分任務,給堅持下來的7個每人一部分內容。到我們興衝衝地下載了源代碼後才發現,這麼龐大的源代碼遠不是我們能吃得動。真是自不量力!可有約在先,不做不罷呀。
那個炎熱的假期,大家苦戰的場面還歷歷在目。炎熱無空調,小伙子們光著膀子端杯水,有的乾脆晚上徹夜在乾,累了就在水泥地睡一會兒。終於,在暑假快結束時,那本書總算草草封筆。之所以說草草,是因為,有太多的東西無法納入書本,還有太多的內容,我們更沒有一一理清楚。有點遺憾,有點不甘心,但時間有限,就那麼交稿了。
2000年,《Linux操作系統內核分析》出版了,讀者的好評撲面而來。有點驚訝,有點受寵若驚,更沒有想到的是後來中科院指定該書為考博參考書。有份喜悅,更有份慚愧,總覺得那麼不成熟的毛小孩受人尊敬有點不相稱。
不僅僅是開源
在接觸Linux之後,希望把這種開源文化傳播給學生。每當第一次講起Linux,我的第一個頁面都是徐悲鴻的一匹奔放的馬。
我會問學生,從這匹馬中看到了什麼,“自由奔放”,有的學生回答。其實,因為那一頁的標題就是“Linux-自由而奔放的Linux黑馬”,所以這樣的回答,並沒有新意。我再問他們為什麼一匹畫出來的馬不同於一張拍照?這樣的問題曾經是我思索而不得其解的。也是因為看到了徐悲鴻的馬,才覺得答案就在眼前…
關於Linux,我總結成三句話“誕生於學生之手,成長於Internet,壯大於自由而開放的文化”,這幾句話展開,可以寫出若幹頁來,但簡練的話更能讓學生產生較強的記憶。
我在想,Linus在起初公佈這個稚嫩的操作系統時,是否想到會被人嘲笑,是否會想到沒有人會理會它,是否會想到一個錯誤百出的東西竟敢放在公共場所。也許,他只有一個理由,業餘愛好做出來的東西,就是它了。喜歡者,儘管參與進來,不管你身處何地,也不管你技藝如何,做不了開發,可以找問題,bug找出來了,那也是一種貢獻了。
我在想,是誰都那麼主動的參與進去了?赫爾辛基大學的學生嗎?也許,最初,只有他們才能訪問到自己校園網的FTP伺服器。當他們下載到這樣一個還不成型的操作系統時,會是怎樣一種行為,試試用?叫罵的帖子?找出bug貼出來?把自己的補丁打上去?也許,都有。但估計,有一種行為占據了上風:有人用了,有人找出bug了,更有人願意把自己改寫的代碼也貢獻出來,他們是誰呢。我在閱讀源代碼時,看到過這些人的Email地址。在源代碼前面的註釋部分,附上自己的Email,這是他們唯一呈現自己貢獻的方式了。
我在想,開源世界五彩繽紛,為什麼Linux這匹黑馬奔跑不止呢?也許,有人說,壟斷的Windows給了Linux競爭的場地。其實,這隻是今天的Linux形成了足以壓倒Windows的優勢。在Linux還是搖搖晃晃的嬰兒時呢?也許因為,它攀到好兄弟Unix,還有Linus本人的魅力和技術,也許更重要的是開源文化這片肥沃的土壤和場地。但,這些,好像還不是充足的理由…
我在想,Internet到底給人帶來了什麼。在這個開源的社區,我們感到的是一種平等,自由,開放,和諧的社會也不過如此吧。弗里德曼在《世界是扁平的》中描繪的全球化的三步中,是否解答了我的疑惑:第一步是由於航海的發展而利於強國侵略所形成的全球化;第二步是由於生產力和貿易的發展而形成的市場全球化;第三步則是近些年開始加速的通信的發展而形成的信息全球化。一些強國是要加強自己對於別國的強權,而全球化是打破這種強權的大趨勢,是使那些強權的非中心化。
只是,弗里德曼站得更高, 而我常常會告訴學生,如果你喜歡權利或被奴役,那不要到這個社區來…
翻譯之路
不知不覺,居然有很多本書從自己的手上脫稿而出。回想第一次欣然答應翻譯《Understanding The Linux kernel》第一版時的茫然和興奮。從來沒有做過翻譯的自己居然敢承擔業界最有名的Linux內核書的翻譯,因為無知,也就無畏了。當真正著手翻譯時才發現,翻譯遠不是自己想象的那麼簡單。專業知識,英文底子,中文表述,哪一個也不能少。對第一版的傾情翻譯完全出於當時那種對Linux內核的狂熱。依然記得那些不知疲倦的日子,看著那一頁頁的英文被自己消化掉,再讀著自認為還過得去的表述,更從作者對知識的組織和表達中學到不曾瞭解到的東西,可以說,整個翻譯過程就在這種激情中悄然度過的。
現在都很驚訝自己獨立翻譯《ULK》第二版時的那種投入,找出第一版和第二版的差異就花去大量的時間。出版社總是給譯者較為嚴格的時間界限,這讓我除了吃飯就是翻譯了。
出版社再找我翻譯《ULK》第三版時,面對800多頁的書,有點猶豫和退縮了。那些辛苦,興奮,忘我的日子有點不敢迴首了。但是,前兩版的翻譯,傾註了太多心血,又不捨得就這麼把自己撫養的孩子送給別人。當我把這個想法告訴在全國操作系會上認識的張瓊聲老師(石油大學)時,她欣然答應,讓我把關,她願意接收繼續翻譯。她的認真和負責我是有所瞭解的,因此,還是答應了第三版的翻譯。
一個春夏和暑假過去,又成了記憶中一段難忘的日子。經常為了一個詞的準確翻譯,在網上來回多次討論,有時甚至快要吵起來了。但即使這樣,當我們不得不按原定的日期交稿時,依然覺得有不少遺憾隱藏在譯稿中,如果讀者在閱讀時,發現任何的bug,希望誠懇指出,發佈出來,讓更多的讀者知曉。
Linux內核書籍點評
從99年開始帶學生分析Linux內核,一路走來,積累了不少資料,也編寫和翻譯了近10本相關書籍,一直在摸索怎樣才能使大家儘快走入內核,但似乎沒有捷徑。尤其是內核版本的不斷更新,更是不少內核愛好者無所適從。
我們初次接觸的內核資料是“The Linux Kernel”( kernelbook.sourceforge.net),介紹的是Linux2.0,儘管其中的內容過於概略,但其引導性的全面概述,使我們逐步找到了進入內核的入口。
依然記得“Concrete Architecture of the Linux Kernel”這篇文章,當我在網上查到這篇文章時,一遍遍的閱讀之後,雖然還是朦朦朧朧的感覺,但這種高屋建瓴式的對內核的整體性把握,使得內核這個龐然大物有了骨架,這也符合了從整體入手,各個擊破的思維模式。這篇文章對內核的分析採用了反向工程中自頂向下和自低向上的策略,
對內核這樣一個沒有起點,也沒有終點的圓球,首先得找一個入口點。也許大家認為從進程入手是個不錯的選擇,但我們啃的第一塊硬骨頭是“Unix下保護模式的編程”,主要閱讀其中的第四章,關於保護模式。
另外,我們經常閱讀的資料還有Linux Kernel howto。其實,最直接的資料還是源代碼以及其中的doc。我經常訪問的源代碼網站是lxr.linux.no,其進行了較大的調整,不僅有內核的每一版本的源代碼,而且增加了不少的文檔。
我們的第一本書《Linux操作系統內核分析》在2000年出版後,很多讀者給予認可。我想這可能因為,在本書的編寫過程中,我們沒有拘泥於任何框框,只是把我們在分析2.0內核時,閱讀的相關資料以及自我認識,比較原始的展現出來。儘管書所涵蓋的內容遠非我們曾經設想的,但對入門而言,可以讓讀者少走不少彎路。
本書之後,我們翻譯了內核紅寶書《Understanding The Linux Kernel》(已經出版了三版),在本書的翻譯過程中,我時不時有插入源代碼的願望,也就是說,本書的原理和敘述比較順暢,但如果沒有源碼在手,有時如墜霧裡。因此建議,本書的閱讀,儘量要與源碼結合。
在這之後,在《Linux操作系統內核分析》基礎上,對2.4版的內核進行分析。 當我著手《深入分析Linux內核源代碼》這本書的編寫時,看到了毛德操、胡希明 著的《Linux內核源代碼情景分析》一書。厚厚的兩大本,完全是娓娓道來。本書作者以英語情景會話的方式,對閱讀內核代碼路途中遇到的幾乎每個函數,都一一說明。但是,因為內核代碼的深層次嵌套,如果你在閱讀的過程中,沒有做好返回“現場”的準備,很可能走入某條小徑後不知返回的路途在哪裡了。但是,如果你有時間,而且有耐心,仔細閱讀本書,應該說可以全景式掌握Linux內核。
在此說明,《深入分析Linux內核源代碼》是針對Linux 內核2.4的,本書編寫過程中,依然遵循了“Concrete Architecture of the Linux Kernel”一文的從頂向下的思路,同時還不斷的比較2.2與2.4內核在開發驅動程式方面的差異。總體感覺,新版本對內核函數進行了較好的封裝,讓內核介面變得越來越容易。
《Linux kernel development》一書(中文名“Linux內核設計與實現”,已出三版,2.6內核),又一本口碑較好的Linux內核書籍。當我們費勁翻譯完這本並不厚的書時,才感覺其涵蓋信息量之大,相比《Understanding The Linux Kernel》,可以說,如果沒有內核的基礎知識,閱讀之後,大有不知所以然之感。儘管這本書深得讀者喜歡,我們的翻譯也得到讀者的極大認可,但還是建議讀者有一定內核基礎知識之後再去讀這本書。
《The Linux® Kernel Primer: A Top-Down Approach for x86 and PowerPC Architectures》,我們翻譯的另一本2.6內核書籍,本書的作者在IBM呆過多年,有開發經驗。書中對涉及到的代碼逐行給予瞭解釋,因此,在一定程度上適合於初學者。
在翻譯和編寫了以上書籍之後,我們為清華大學出版社編寫了《Linux操作系統原理與應用》教材,本書的側重點不在逐行分析源代碼,而是對部分源代碼有所瞭解後,讓讀者能夠動手進行內核模塊的編寫,每章後面的例子有一定的難度,但是,動手之後,再去瞭解內核相關內容就具有針對性了。
以上對內核書籍的簡評,只限於我們編寫和翻譯的書籍,像《Linux Device Driver》也是經典內核書籍,在此並沒有給予說明,近幾年出版了不少內核方面的好書,建議讀者擇優去讀。
在Linux內核這樣一片茂密無邊的樹林面前,如果說我曾給過大家有所幫助,其實也只是引領了一條小徑而已,那種探究的路途,全憑的是個人的悟性和不懈的執著,路漫漫兮,尋覓者自有探索,而後,我更希望是一旁觀者,希望看到勇者無往的憨勁!
從機制與策略探究Linux內核設計之道
2011年的Linux內核開發者大會邀請我做主題發言,但給大家分享些什麼,起初選定Linux的安全,因為那幾年的項目是這方面的。但是,當我著手準備講稿時,才發現安全是個太廣的話題,根本難以把握。於是想起自己常常告訴別人的話,從自己最熟悉的地方下手。於是,還是從自己最熟悉的Linux內核入手吧。但是,內核也是太大的話題,漫無邊地,怎樣才能在有限的時間把自己這麼多年的體會分享出去,有兩個詞在瞬間跳在眼前:機制與策略,這也是自己常常掛在口邊的詞,怎樣從內核的設計釋義這兩個詞的含義,這實際上也是一個哲學命題。當開始寫講稿時,題目自然就蹦出來了:”從機制與策略探究Linux內核的設計之道“
當題目確定下來後,才發現跳進自己挖的大陷阱中,這個涉及哲學、技術的寬泛題目我能把握麽?但,沒有其他令自己更滿意的題目,只能是它了。因此,講稿的第一頁分別引用了易經和聖經中的兩句話:“形而上謂之道,形而下謂之器”;“看見的是暫時的,看不見的是永遠的”。這兩句話一齣來,思路一下子打開了。實際上,我要分享給大家的不是具體的技術,而是思考問題的方式。於是,第二頁上引用了龍應台在”百年思索“中對文、史、哲的釋義—”文學-使看不見的東西被看見,哲學-迷宮中望見星空,歷史-沙漠玫瑰的開放“。當我們僅僅在技術的坐標系中看問題時,實際上總有一定的局限性,那些萬事萬物之間的聯繫因為我們固有的觀念而被割裂了。至此,我定位了自己的位置:如果說”道“是一隻大象(忽然想起老子說的“大象無形”,但我這裡是偷換概念),那麼我在這裡講的觀點只是摸到了大象的鼻子。這樣以來,自己一下子釋然了,我並不是什麼專家,我只是在這個領域呆的時間長了,比大家早知道一些東西,多知道一些道理,有些感悟,但遠不是全部事實。
當這樣的開場白後,講稿上打出屈原“天問”中的幾句(這是學人家龍應台)“天何所沓 十二焉分 日月安屬 列星安陳 何闔而晦 何開而明 角宿未旦 曜靈安藏”,屈原一個文學家,怎麼問天文地理不著邊際的這些問題:“天為什麼和地相合,...",這是為了引出胡適的觀點“做學問要在不疑出有疑”。
引子部分全部結束後就進入主題,首先用一組數據觀察Linux內核演變歷史,然後,從Linux整體結構入手,分析機制與策略分離的設計原則,再然後,從各個子系統中這一設計原則的應用入手,說明機制與策略的分離實際上是電腦科學中的設計理念,而不僅僅用在操作系統中。最後引出手機操作系統Android以及虛擬機xen的設計思路。
回頭看整篇講稿,與自己最初設想的根本不一樣了。一件事情動手做起來以後完全是按照事情本身的規律往前走了,而不是腦子固有設想的非得怎樣去做,也許這也是一種“道”。
後來,華為的深研所,西研所,北研所邀請我去他們的大講堂講講關於Linux內核方面的東西,“從機制與策略探究Linux內核的設計之道”的通用性省卻了我每次要重新準備講稿的時間,而把大量的時間花在瞭解他們具體的需求上,在不同的地方,面對不同的人群,只需要針對具體需求實例化後進行發揮,就有游刃有餘的感覺了。
迷時師度 悟了自度
曾在企業實習的學生髮來郵件說,企業在培訓中推薦他們閱讀侯捷寫的《迷時師度 悟了自度》一文,我讀罷嘆為觀止,先把其中的故事貼過來:
● 六祖壇經
佛教東傳中土之後,雖然大德大賢備出,但由中國和尚所著,被奉為「經者],也只「六祖檀經」一書而已。六祖檀經記錄著佛教禪宗六祖惠能一生的思想言行。其中對於六祖得道的過程,有詳細的敘述。
六祖惠能俗姓盧,南海新興人。年少失父,母且寡居,家亦屢空,業無腴產。所以他從小做了樵夫,養家活口。有一天偶聞肆間誦金剛般若經,心有所感,於是詢問鄰人何處學佛,遂安置母親,至河北黃梅山禮拜五祖。
●五祖弘忍
五祖弘忍見惠能談吐甚有根性,不動聲色地讓他到後院碓米。八個月後有一天,弘忍告訴眾弟子說,每一個人寫一首偈,誰能悟道,我便傳他衣缽。當時人人以為五祖座下第一大弟子神秀必得衣缽,所以也沒有人去作這首偈。神秀在這種情況下,一來「責無旁貸」,二來也想讓師父看看自己心中的見解,便在三更時候於南廊壁上寫下心偈一首:
身是菩提樹,心如明鏡臺;時時勤拂拭,莫使惹塵埃。
第二天五祖弘忍見到了這首偈,把神秀叫到座前詢問。並謂:「汝作此偈,見即未到,只到門前,尚未得入...」。要神秀回去再作一偈。過了數天,神秀卻作不出來。
●千古名誦
有個童子行過碓房,唱誦神秀的偈。惠能聞後,問明緣由,便請童子引至大堂。禮拜之後,惠能說自己也有一首偈,但是他既不識字更不會寫字,乃請人代書寫下千古名誦:
菩提本非樹,明鏡亦非台;本來無一物,何處惹塵埃。
此偈一成,眾總皆驚。消息傳至五祖,瞭然於心,但恐人損害,遂脫了鞋子 當抹布,立刻把這首偈擦掉,並且說「這首也嘛沒有悟道」!
第二天,五祖弘忍悄悄來到後院,看到惠能把大石頭系在腰上,增加身體的重量來碓米,很是感動,於是和惠能展開一段非常空靈神妙的對話。弘忍問「米熟也未」?惠能曰:「米熟久矣,猶欠篩在」。於是祖以仗擊碓三下而去。惠能知祖意,是夜三鼓入室,由祖為說金剛經。當說到「因無所住而生其心」,惠能大悟,於是五祖授衣缽以為信,並且說「衣為爭端,止汝勿傳...,汝須速去,恐人害汝」。
●迷時師度,悟了自度
五祖弘忍親自送惠能到九江驛,令上船,把自搖。惠能曰:「請和尚坐,弟子合搖」。祖雲:「合是吾渡汝」。惠能雲:「迷時師度,悟了自度」。
我的觀點:
●誰是師?
古人一字,涵蓋多義。我常常會覺得自己為師多年,是當仁不讓的師,可有一天與一位40多歲還從頭學電腦編程的人聊後 ,就從心裡認他為師,不是因為他的知識,而是因為他純粹的學習興趣和沒有功利心而為的勁頭。
●怎麼悟
一個“悟”字,太有禪意,似乎遙不可及,但每個人都有感受到悟的時刻,只是當你尋找悟的感覺時,它反倒跑的無影無蹤。追溯“悟”的源頭,大都是因為日思夜想,吞下無數文字,馳騁於思維的高山峽谷,有那麼一時刻,有了眾里尋他千百度的頓悟。在這之前,一次次模模糊糊的感覺似影似幻,總困擾著你。如果放棄了,那本該觸手可及的頓悟也就逃之夭夭。
●悟什麼
比如,在Linux內核這樣有禪意的作品中,高人的代碼散落四處,那些代碼後的文字和原理,或者一些經典原理落地有聲的代碼,關聯起他們的,非文字所能描述,悟就別無選擇了。
更多精彩更新中……歡迎關註賬號:linux閱碼場(id: linuxdev)