經過之前的摸索,對Linux內核的學習有一些自己的看法,就列一下自己支持的學習方法:
1、要選最新的內核去學。Linux內核版本變化太快了。Linux 0.11就是一個自己動手寫操作系統的范例,而到Linux 2.4則發展到百萬行級,被移植到各種平台。到2.6呢,Linux在這個版本停留最久,小的版本差異,整個子系統完全不同。就我所知,在2.6中,devfs被廢棄,sysfs新加入,usb支持到3.0,整個內核支持內核態搶占,等等。即使你學會了2.4,那也是一個和2.6相差很大的系統。何況內核的變化,也反映了硬件平台的巨大變化。有SMP多核、APIC、ACPI電源管理、PCI、PCI Express總線、PCH芯片組,緩存一致性、大內存支持等等,這中間的變化太大了。而且,Linux經歷2.6的風風雨雨,各個子系統都逐漸成熟,模塊結構更加合理,你會看到最優秀的系統設計,盡管也是最龐大的。綜上所述,要學就要選最新的,但這也並非一定要選3.0,選2.6中版本靠前的即可,推薦2.6.32以上的。
2、從設備驅動入手。Linux內核就像一個大鐵球,往往找不到地方下嘴。Linux內核中動辄幾萬行的子系統,內存管理、線程管理、定時器、信號量臨界區,等等內容耦合在一起,各種gcc的特殊用法,為了性能而極其復雜的代碼,被濫用的宏定義,為支持多種硬件平台而抽象到極致的層層封裝...... 最為一個學習用的內核,Linux真是糟透了。幸好它還給我們留了一絲光亮,就是設備驅動。最簡單的字符設備驅動可以只有幾百行代碼,絕對看得懂,而較為復雜的usb驅動則達到31萬行代碼,更不要提被過分優化的塊設備驅動了。設備驅動足以為我們提供一個入口點,寫一個模塊,讓它在內核中跑起來。但要記住,這只是起點。
3、進階-從看代碼說起。如果你只會照葫蘆畫瓢地寫一些幼稚的字符設備驅動,你一定不敢對人說你對Linux內核如何如何。學習一個東西,最基本的要求就是能看懂它。遺憾的是,系統往往用起來簡單,學起來難;內核API容易調,但卻滲入不到核心的地方去。這是就必須找一條進階之路—那就是能看到、接觸、學習Linux代碼。這個代碼量不能太大,但也不能太小,與其它模塊耦合度盡量低,最好能動手試一試。我覺得usb驅動是個不錯的選擇。雖然如此,看設備驅動都有一個不可避免的問題,就是對設備的認識程度直接決定你對相應代碼的理解程度。usb不是核心設備,規范也比較清晰,但它的工作方式過於復雜,驅動的層次劃分至少三層,很有挑戰性。
4、進階-從寫代碼說起。雖然看Linux代碼是個很有挑戰性、很鍛煉思維的事情,但它卻無助於你寫代碼能力的提高。往往你看懂八成,理解五成,融會貫通三成,能用出來的也只剩一成。但就這一成,也要往死裡用才行。我發現只寫簡單的驅動,無濟於事;看比較復雜的驅動,好像看得挺熱鬧,卻摻和不進去。所以學Linux絕非只看看就能了事。要寫代碼,要修改代碼。要學習的就不只是驅動本身,而是整個Linux內核提供的編程環境。包括內存管理、線程管理、定時器 、臨界區、信號量、工作隊列等等,許多東西來支持設備驅動。你不學這些東西,就改不了驅動,寫代碼也就無從談起。其實這些東西本身並不復雜,只是比較零散,你看驅動時很容易看懂,卻不注意,到時也用不出來。只要拿些例子練練,從驅動中看到的多拿出來用,慢慢就積累起來了。
5、目標。操作系統的根本目的是管理硬件資源和提供用戶服務。我想,當我們能把目光專注於硬件,不再為寫驅動而寫驅動時,就真的是學有所得了。而對Linux內核有所創新,對內核算法有所改進,那還不是我所能眺望到的。