寫給Linux內核新手-關於Linux內核學習的誤區

寫給Linux內核新手-關於Linux內核學習的誤區 寫給Linux內核新手-關於Linux內核學習的誤區

         寫給Linux內核新手-關於Linux內核學習的誤區

  先說句正經的:其實我沒資格寫這篇文章,因爲自己也就一兩個月以來纔開始有所領悟的。因此,這裏與其說是關於Linux內核學習的經驗,不如說是自己的教訓吧,希望不要扔雞蛋砸我^_^

   常常有人問:我想學習內核,需要什麼基礎嗎?Linus Torvalds本人是這樣回答的:你必須使用過Linux。這個……還是有點太泛了吧,我想下面幾個基礎可能還是需要的,儘管不一定必需:
  1, 關於操作系統理論的最初級的知識。不需要通讀並理解《操作系統概念》《現代操作系統》等鉅著,但總要知道分時(time-shared)和實時(real-time)的區別是什麼,進程是個什麼東西,CPU和系統總線、內存的關係(很粗略即可),等等。
  2, 關於C語言。不需要已經很精通C語言,只要能熟練編寫C程序,能看懂鏈表、散列表等數據結構的C實現,用過gcc編譯器,就可以了。當然,如果已經精通C語言顯然是大佔便宜的。
   3, 關於CPU的知識。這塊兒可以在學習內核過程中補,但這樣的話你就需要看講解很詳細的書,比方後面將會提到的《情景分析》。你是否熟悉Intel 80386 CPU?嘗試着回答這幾個問題來判斷一下:1)說出80386的中斷門和陷阱門的區別;2)說出保護模式與實模式的區別;3)多處理器機器上,普通的讀- 改-寫回一塊內存這樣的動作,爲什麼需要特殊的手段來保護。等等。講解基於其它CPU的Linux內核的書,目前好象只有一本《IA64Linux內核: 設計與實現》──也還是Intel的,其它都是講解基於IA32的。
  以上算是知識方面吧,如果還要再補充一條,我想就是:動手編譯過內核。


  好了,我們接下來走。好多人裝上Linux之後,第一件事找到內核源碼所在的路徑,打開一個C程序文件,開始嘩嘩譁翻頁,看看大名鼎鼎的Linux內核代碼到底長啥模樣──然後關閉。這是可理解的,但卻不是學習的方法。剛開始,必須從讀書入手。至少要對內核有一個Overview之後,纔有可能帶着問題去試圖閱讀源代碼本身。 下面就講一下我讀過的幾本書:
  1, 《Linux內核設計與實現》,英文名Linux Kernel Development(所以有人叫它LKD),機械工業出版社,¥35, 美國Robert Love著,陳莉君譯者。 評說:
   此書是當今首屈一指的入門最佳圖書。作者是爲2.6內核加入了搶佔的人,對調度部分非常精通,而調度是整個系統的核心,因此本書是很權威的。這本書講解 淺顯易懂,全書沒有列舉一條彙編語句,但是給出了整個Linux操作系統2.6內核的概觀,使你能通過閱讀迅速獲得一個overview。而且對內核中較 爲混亂的部分(如下半部),它的講解是最透徹的。對沒怎麼深入內核的人來說,這是強烈推薦的一本書。
   翻譯:翻譯水平、負責任程度都不錯,但是印刷存在一些錯誤。買了此書的朋友可以參考我在Linux高級應用版的《Linux內核設計與實現中文版勘誤》:
http://bbs.chinaunix.net/forum/viewtopic.php?t=541234
另外,此書2005年有了第二版,目前尚無中譯本面世。我就是對照着2nd-en勘誤1st-cn的。

  2, 《Linux內核源代碼情景分析》上、下。毛德操、胡希明著,浙江大學出版社,上冊¥80,下冊¥70. 評說:
   本書是基於2.4.0內核的,比較早,也沒聽說會出第二版。上冊講解內存管理、中斷、異常與系統調用、進程控制、文件系統與傳統Unix IPC;下冊講解socket、設備驅動、SMP和引導。關於這套書的評價褒貶不一,我個人認爲其深度是同類著作中最優秀的。本書基於Intel IA32體系,由於厚度大,很多體系上的知識都捎帶講解了,所以如果你想深入瞭解內核的工作機制而又不非常熟悉Intel CPU的體系構造,本書是最合適的。缺點是:版本較老,沒有TCP/IP協議棧部分(它講的socket只是Unix域協議的),圖表太少,不適合初學者 入門。還有就是對學生朋友來說,可能書價偏高,這樣的話可以考慮先買上冊,因爲上冊是核心部分,下冊一大部分都在講具體PCI/ISA/USB設備的驅 動。
  翻譯:沒什麼翻譯,作者是國人,而且行文流暢。本人書桌上諸多計算機經典圖書當中,這套是唯一又經典又無閱讀障礙的。
   www.linuxforum.net內核版好多朋友已經把這書讀到六七遍了,我很慚愧,上冊差不多讀熟了,下冊就SMP部分還看過──但這就花費了整整 1年的時間,還有好多弄不懂的。這裏順便說明另外一個研究內核常見的誤區:目標太龐大。要知道Linux內核(最新的2.6.13)bzip2壓縮之後 37M,解壓縮之後244M,根本不是哪個人能夠吃透的。即使是內核的核心開發團隊中,恐怕也只Linus Torvalds、Alan Cox、David Miller、Ingo Molnar寥寥數人會有比較全面的瞭解,其它人都是做自己專門的部分。我自己來說,目前已經決定放棄內存管理的全部(slab層、LRU、rbtree 等)、文件系統部分、外設驅動部分,暫時也沒打算弄IA32以外的其它體系的部分。

  3, 《深入理解Linux內核》第二版。中國電力出版社。也是陳莉君譯。此書是Linux內核黑客在推薦圖書時的首選。評說:
   此書C版的converse兄送了我一本第一版,因此就沒買第二版,比較後悔。因此只就第一版說一說,第一版基於2.2,第二版2.4 。我見O'Reilly官方主頁上說第三版的英文版將於2005年11月出版,也不知咱們何時才能見到。此書圖表很多,形象地給出了關鍵數據結構的定義, 與《情景分析》相比,本書內容緊湊,不會一個問題講解動輒上百頁,有提綱挈領的功用,但是深度上要遜於《情景分析》。

  4, 其它的幾本書。市面上能見到的其它的Linux內核的圖書,象《Linux設備驅動程序》、《Linux內核源代碼完全註釋》以及新出的《Linux內核分析及編程》等。
   《Linux設備驅動程序》第二版是基於2.4的,中文翻譯不錯,中國電力出版。這書強調動手實踐,但它是講解“設備驅動”的,不是最核心的東西,而且 有些東西沒硬件的話無法實踐,可能更適合驅動開發的程序員吧,不太適合那些For fun and profit的人。此書有第三版英文版,東南大學出版社影印,講解2.6的,行文流暢,講解的面也比第二版更廣泛,我讀過其中關於同步與互斥、內存分配的 部分,感覺很不錯。
  《Linux內核源代碼完全註釋》(機械工業出版社)是同濟大學的博士生趙炯的著作,講解0.1Linux內核,我沒買也沒看,有看過的朋友說一說。
  《Linux內核分析及編程》(電子工業出版社)是剛剛出版的,國人寫的,講解2.6.11 。很多人說好,但有人說不夠系統,我沒買,不敢評說。
  還有一本清華出的《Linux內核編程指南(第三版)》,原書應該是好書,但是翻譯、排版十分糟爛,脫字跳行,根本沒法看,我買了一本又扔掉了。

   5, 其它資源。 TLDP(The Linux Documentation Project)有大量文檔,其中不少是關於內核的,有些是在國外出版過的,象《Linux Kernel Interls》《The Linux Kernel》《Linux Kernel Module Programming Guide》等,作者都是親身參加開發的人,著作較爲可信。
Http://www.linuxforum.net
   中國Linux論壇的內核版。該版是研究內核的中文Linux社區中水平最高的,有很多專家級別的牛人,強烈推薦去學習一下(但建議不要問太過分簡單的 問題,人家脾氣再好也會煩的^_^),它的置頂貼簡直是一個包羅萬象的FAQ,精華區也有很多資料。只可惜太過曲高和寡,人氣不是很旺。

   6, 一本不是講解Linux的書:《現代體系結構上的Unix系統:內核程序員的SMP和Caching技術》,人民郵電出版社2003版,定價¥39. 本書雖然不是講解Linux,但是對所有Unix內核都是適用的,適合對SMP和CPU的Cache這些組成原理知識不是很熟的朋友,而且是很多國外牛人 推薦的書。中文版翻譯非常負責。


  還有個很重要的問題:怎樣瀏覽內核源代碼。有的朋友喜歡在Windows上工作,用 Source Insight;有的在Linux,用Source Navigator;還有專門瀏覽源代碼的軟件,象lxr(Linux Cross Reference);還有用ctags/ectags/cscope等,這些都是很優秀的軟件。我個人用Vim + ctags瀏覽(參考了www.linuxforum.net內核版wheelz大俠的文檔,)。

  此外,前邊已經提到的一個重要的問 題是:你研究內核的目的是什麼,開發? 樂趣?如果是開發,而且是國內做開發,把kernel API熟悉一下就差不太多了(你也知道國內的水平有多差),比方說copy_from_user()、kmalloc()函數等,kernel API在Internet上找得到,編譯內核時也可以用DocBook生成(具體請參考內核源代碼包下的README文件);如果是研究,那就差別很大 了,需要下很大的苦功:會用kmalloc()絕不說明你懂得Linux內核的虛存管理子系統,正如同會講漢語不說明你懂中國文化一樣。




  說完了,發現前面講的太羅嗦了,簡化一下:
  1, 動手編譯內核
  2, 精讀《Linux內核設計與實現》
  3, 上www.linuxforum.net內核版看置頂貼與精華區
  此外就憑自己興趣選擇吧。

下面是一篇沒寫完的《Linux內核模塊編程入門》,不補寫了,將就着看吧。

albcamus 2005-10-13 02:41

寫給Linux內核新手-關於Linux內核學習的誤區

Linux內核模塊編程入門
看到昨天有好幾個問linux內核編程問題的帖子,不少是卡在了入門問題上,就整理一下入門的初步流程。針對2.6內核的Linux系統,需要你的機器上已經安裝了kernel-devel這個包,也就是編譯模塊所必須的東西:內核的頭文件和一些Makefile。

一,Hello World程序:
[code]/*file: hello.c*/
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include <linux/init.h>;
#include <linux/module.h>;
#include <linux/kernel.h>;

static int hello_init(void)
{
printk(KERN_ALERT "Hello, The fucking crazy world/n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Bye, The fucking crazy world!/n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("albcamus <[email protected]>;");[/code]

2.6內核的kbuild子系統跟2.4相比有本質的改變。我們下面嘗試兩種方式編譯這個程序:
1, 你可以在本目錄下這樣寫一個Makefile
[code]obj-m := hell.o
clean:
rm -rf *.o .*.cmd *.ko *.mod.c .tmp_versions[/code]
然後用這樣的命令行編譯:
make -C /lib/modules/`uname -r`/build M=`pwd` modules
這時ls一下,就能看到生成了很多文件,其中hello.ko就是我們需要的內核模塊。
2, 專業點兒,Makefile這樣寫:
[code]obj-m := hello.o
KERNELBUILD := /lib/modules/`uname -r`/build
default:
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
rm -rf *.o .*.cmd *.ko *.mod.c .tmp_versions[/code]
然後只要make一下就可以了。

插入模塊用insmod命令:
insmod ./hello.ko
這 時候大家可能會問:爲什麼我的屏幕上沒有見到輸出?這個是console的日誌記錄級別和你printk消息時指定的級別(本例中指定爲 KERN_ALERT,爲次高,僅次於KERN_EMERG)決定的。無論如何,你可以tail 或者cat看看系統日誌的最後幾行,系統日誌一般爲/var/log/messages,或者直接用dmesg命令,肯定能看到輸出了。

二,頭文件問題。
C 程序員都知道,要使用某個外部的函數,應當#include某個頭文件,這個頭文件包含了那個函數的原型(prototype)。內核的頭文件在 include/下,其中include/asm是個符號鏈接,指向你所用內核的具體的體系結構目錄,比方說我的系統是i386的,那麼 include/asm就指向include/asm-i386 。
內核編程中我們不能鏈接libc庫,不能使用libc庫中的函數,所以很有些 麻煩。一些重要的函數,象strcpy/strcmp/snprintf等,kernel也爲我們實現並導出(export)了,而我們需要 #include相關的頭文件,在include/linux和include/asm中,你需要自己尋找你所要使用的函數在哪個頭文件中聲明,並將其 #include進來。


寫給Linux內核新手-關於Linux內核學習的誤區

說點別的
1、樓主 4K太屈材了,但是中國現在這個狀況沒法說。我曾經去清華紫光面試,做AS400的售前/後支持「當時他們說有Unix基礎就可以,不需要很瞭解 400」,底薪4K+提成,提成完全看銷售業績,估計很大一部分工作是配合銷售去把產品騙出去,技術性工作估計不多。如果銷售情況好的話收入還是很可觀 的,但是具他們內部人說沒有銷售掙得多。在國內許多大公司,一羣本科是什麼雜7雜8專業的,後來混了個“計算機”方面的“研究生”,啥都不懂成天混的人也 都隨便拿上5K+

2、牛人在中國會是什麼下場?牛人就是象老牛一樣多幹活,還不一定有草吃。去年冬天我出差去昆明部署一個我們的軟件,本 來我只負責技術支持,職責就是按照文檔把整個系統搭建起來。臨走前開發人員和測試人員拍胸匍向我發誓程序完全沒有問題了,我去到那裏只要安裝一下即可。結 果到了那裏,首先是客戶系統被入侵而癱瘓,費了好大勁重建了系統恢復了數據庫;接着發現程序有很嚴重bug,花了整整一天時間我給它debug。
知 道我最終的下場是什麼嗎?400塊長途手機費不給報銷,領導說按照規定每天只給報20。嗯,“按照規定”的話,發現被黑我就應該立刻打110『沒必要估計 客戶的面子』,然後叫合作伙伴的人來裝系統(系統原來是他們裝的),這樣就省下200塊打電話請示領導、聯絡客戶領導的手機費;“按照規定”的話,我作爲 非開發人員和測試人員沒義務給程序debug,當我發現程序不能正常運作的時候就應該打道回府,這樣就又能省下200塊了
我當時所在中國非常有名的一家軟件上市公司「比紅旗用友什麼的大得多」,在這裏我就不點名了

3、“到一家實力強勁的公司(如IBM,redflag)給人家打下手”?
IBM內部的中國開發人員,只能從老美那裏拿到裁減版的API手冊,很多“牛人”的主要工作是漢化、debug、寫文檔和打包
redflag? 以前曾經有一個項目需要郵件系統,看了一下redflag的郵件服務器宣傳還不錯,聯繫了一下,跟一個什麼產品經理談了談,結果是,爲了拿到項目,他們完 全可以放棄linux平臺把它移植到客戶指定的Solaris上去,總之就是只要能中標,怎麼都行!所以我看redflag需要的不是“打下手”的,需要 的是能夠拿到單子的sells


中國阿,就這麼回事了
PS:我現在在搞linux教育培訓工作,收入還湊合,感覺這個環境銅臭味道少一些,可以有一些閒暇時間和精力去搞自給喜歡的研究,而且沒人管^_^ 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章