不知不覺涉足Linux核心已經十多個年頭了,與其它有志(興趣)於此的朋友一樣,我們也經曆了學習—實用—追蹤—再學習的過程,也就是說,我們也是從漫無邊際到茫然無措,再到初窺門徑,轉而覺得心有戚戚焉這一路走來的。“在你的立足處深挖下去,總會有泉水湧出,別管蒙昧者們叫嚷: ‘下邊永遠是地獄!’”,尼采哲語的警鐘時常在腦海敲起。
Linux最為人稱道的莫過於它的自由精神,所有原始碼唾手可得。源碼在前,了無秘密。是的,但是我們在面對它的時候,為什麼卻總是因為這種規模和層面所造就的陡峭學習曲線陷入困頓呢?很多朋友就此倒下,縱然Linux世界繁花似錦,縱然核心天空無邊廣闊。但是,眼前的迷霧重重,心中的陰霾又怎能被陽光碟機散呢?縱有雄心壯志,拔劍四顧心茫然,腳下路在何方?
Linux核心入門是不容易,它之所以難學,在於龐大的規模和涉及的層面。規模一大,就不易現出本來面目,渾然一體,自然不容易找到著手之處;層面一多,就會讓人眼花繚亂,盤根錯節,怎能讓人提綱挈領?
“如果有這樣一本書,既能提綱挈領,為我理順思緒,指引方向,同時又能照顧小節。闡述細微,協助我們更好更快地理解STL源碼,那該有多好”,這番話雖然針對的是C++,但道出的是研習源碼的人們共同的心聲。但Linux源碼研究的方法卻不大相同。這還是由於規模和層面決定的,比如說,在語言學習中,我們可以採取小步快跑的方法,通過一個個小程式和小嘗試,就可以取得漸進的成果,就能從新技術中有所收穫。而Linux呢?如果沒有對整體的把握,即使你對某個局部的演算法、技術或是代碼再熟悉,也無法將其融入實用。其實,像核心這樣的大規模的軟體,正是編程技術施展身手的舞台(當然,目前的核心雖然包含了一些物件導向思想,但還不能讓C++一展身手)。
那麼,我們能不能做出點什麼,讓Linux的核心學習過程更符合程式員的習慣呢?
Robert Love回答了這個問題。Robert Love是一個狂熱的核心愛好者,所以他的想法自然貼近程式員。是的,我們註定要在對所有核心的子系統有了全面認識之後,才能開始自己的實踐,但卻完全可以捨棄旁支末節,將行李壓到最小,自然可以輕裝快走,迅速進入動手階段。
因此,相對於Daniel P. Bovet和Marco Cesati的核心巨著《Understand Linux Kernel》,它少了五分細節,相對於實踐經典《Linux Device Driver》,它多了五分說理。可以說,本書填補了Linux核心理論和實踐之間的鴻溝,“一橋飛架南北,天塹變通途”。
就我們的經驗,核心初學者(不是編程初學者)可以從這本書著手,對核心各個核心子系統有個整體把握,包括它們提供什麼樣的服務,為什麼要提供這樣的服務,又是怎樣實現的。而且,此書還包含了Linux核心開發人員在開發時需要用到的很多資訊,包括調試技術、編程風格、注意事項等等。在這消化這本書的基礎上,如果你側重於核心的瞭解,可以進一步研究《Understand Linux Kernel》和原始碼本身;如果你側重於實際編程,可以研讀《Linux Device Driver》,直接開始動手工作;如果你想有一個輕鬆的核心學習和實踐環節,請訪問我們的網站www.kerneltravel.net。
Linux核心像一艘永不停息的輪船,它將駛向何方我們並不知曉,但在這些變化的背後,總有一些原理是恒定不變的,總有一些變化是我們想知曉的,比如發送器的大幅度改進,核心效能的不斷提升,本書第三版雖然針對的是較新的2.6.34核心版本,但你在舊版本上積累的知識和經驗依然有效,而新增內容將使你在應對變化了的核心代碼時有了一種從容。
感謝牛濤和武特,他們在第二版和第三版差異的校對中花費了大量精力。感謝素不相識的網友Cheng Renquan,他主動承擔了其中一章的修訂。還要感謝蘇錦繡,黃偉,王澤宇,趙格娟,劉周平,周永飛,曹江峰,陳白虎,孟阿龍,他們參與了後期的校對和查錯補漏。
最後,特別感謝我的合作者康華,從十年多前一塊分析Linux核心代碼到十年後的今天,他對技術孜孜不倦的追求不但在業界贏得聲譽,也使我們在翻譯過程中所遇到的技術痛點和晦澀句子被一一降服。感謝合作者張波,他流暢有趣的文筆讓本書少了份枯燥,多了份趣味。