內核入門

內核入門

取自 西郵linux

http://xiyoulinux.cn/wiki/index.php?title=%E5%86%85%E6%A0%B8%E5%85%A5%E9%97%A8

目錄

[隱藏]

[編輯] 走近Linux內核

作者:[王聰]

 

不要理會任何一個告訴你內核開發是困難,特別或者不同的人。它是一個大的程序,而且bug修復或驅動編寫是一個最佳起點。它也沒有什麼魔力,也不是使用只有留着絡腮鬍的老手才能讀懂的語言編寫。

──Alan Cox

 

[編輯] 簡介

這篇文章是專門寫給那些對Linux內核感興趣,卻又不知道如何着手去讀懂那麼多代碼的內核新手。也許你剛剛瞭解Linux,又急於探索Linux的內部祕密;也許你是一個Linux開發者,熟悉應用程序的開發,又雄心勃勃準備 向內核世界進發。那麼這篇文章正是你需要的,它會帶你走進內核的世界,伴你渡過危險的沼澤。通過分享我們自 己的經歷,希望有更多的人能夠加入到Linux內核開發者行列。

內核開發向來被視爲非常神祕的工作,彷彿只有傳說中的留着長長的絡腮鬍的黑客們才能從事它。其實不然,Linux內核的開發和其它大型項目沒有多少差別,只不過它的調試確實有點特別,需要一些特別的技巧。不要恐慌(Don't Panic!),只要你下功夫,你也能參與內核的開發,它的確是一件非常好玩的事。

[編輯] 需要準備什麼

當然,你首先要有一臺可供支配的電腦,最好裝有Linux。如果可以,最好再有一臺專門供你調試代碼的機器,因爲沒人能保證調試內核的過程中不會讓你的文件系統崩潰。或者,至少有一塊專門給調試內核使用的硬盤。

最好還有一個固定的互聯網接口,畢竟Linux內核開發是在網絡上進行的,而且你也會經常在互聯網上搜索一些有用的信息。

如果你是一位超級geek的話,再準備一根雙機串口線,它能幫助你從一臺機器上“聆聽”另一臺機器上內核運行中的“抱怨”。嗯,有點像是外科醫生給病人聽診,這看起來很酷,不是嗎?

如果你準備在一臺非計算機設備上調試你的內核(這沒什麼奇怪的,Linux早已經被移植到千奇百怪的系統上),那麼你還需要準備相應的硬件,或者它的模擬器,或者其它一些工具。如果你有在非計算機設備上調試Linux內核的經驗,請在這裏自由添加相應的內容。

[編輯] 開始

我們假設上面的東西你都準備好了,整裝待發,現在可以正式進軍內核了。當然了,如果你對Linux上的開發已經很熟悉了,你可以安全地跳過這一節。好了,出發,水手們!

[編輯] 1. 精通C語言編程

不是我們一味推崇C語言,而是C語言的的確確太適合做內核開發了。C語言的誕生源於編寫Unix內核代碼,它精練的設計哲學確實做到了這一點。甚至有人這樣評價C語言──“它聯合了彙編的所有威力。”如果你還不懂C,趕快去學吧。

如果你是一名編程新手,不推薦用C作爲你的入門語言,原因如下:

  • 編程新手最需要了解的是編程的概念和對編程的基本認識,而過多的接觸C語言往往會把你引出這一目的,會讓你把注意力集中到一些奇怪的語言特性上,而不是編程語言本身。
  • 編程新手往往對計算機瞭解不夠深刻,不清楚計算機的內部結構,而C語言恰恰就是和計算機內存/編碼/CPU打交道,最起碼,調試那些“隱晦”的錯誤時如此。(想想你是不是沒有把一個指向指針的指針的指針指向正確的位置。)
  • 學好C語言需要下很大的功夫,最起碼不能低於兩年。(當然如果你不打算學好那得另說了。)


所以,最好先學一門比較簡單的編程語言作爲鋪墊。不妨試一下Python,它比Java還要簡單。當然了,這並非絕對,因人而異。如果你真的決定開始學習C語言,那麼推薦的入門書籍仍然是K&R的《The C Programming Language》。過去這麼多年了,它仍然被奉爲入門的首選,可見其有多麼經典。

不過僅僅瞭解C的語法,能編寫一些小的程序是遠遠不夠的。你必須能夠熟練地操縱C語言,瞭解它的一些缺陷和陷阱,讓它變成你的利器。有句話說得好:“C語言就像一把刻刀,簡單,鋒利,並且在技師手中非常有用。和任何鋒利的工具一樣,C會傷到那些不能駕馭它的人。”讀一讀《C Traps and Pitfalls》和《Expert C Programming》吧,它們能讓你有一個大的提升,成爲一名C語言高手。

如果碰巧你是一位C++的推崇者,那麼下面的一些引用或許能說服你開發Linux內核不使用C++(摘自LKML FAQ)。

   Linus在2004年說:
   In fact, in Linux we did try C++ once already, back in 1992.
   It sucks. Trust me - writing kernel code in C++ is a BLOODY STUPID IDEA.
   他認爲:
   C++編譯器是不可靠的,1992年的時候更糟,有一些基礎性的東西沒有改變:
C++的異常處理是broken(不知道怎麼翻譯這個詞好)的,對內核來說它更是broken。
任何一個喜歡把內存分配藏到你背後的編譯器或者語言,都不是你編寫內核的好的選擇。
你可以用C來編寫OO代碼,而不用C++的一些“廢話”。

 

   Andrew D. Balsa如是說:
   Linux一開始的時候gcc還沒有很好的C++實現,而且當時C程序員比C++程序員要多。

 

   Richard E. Gooch 解釋到:
   在Linux誕生之前,也有內核在g++下編譯,但是人們抱怨它的性能。據證明,把C代碼放到g++下編譯
   會產生更糟糕的代碼。它不應該有差別,但的的確確有!

 

[編輯] 2. 熟悉常用的工具

[編輯] 掌握至少一種編輯器

掌握一種你喜歡的編輯器是非常有必要的,它能爲你節省很多時間。在Linux上,最著名的編輯器莫過於emacs和vi了。一些內核開發者介紹,他們大多數人就是在使用這兩種編輯器中的一種。可能一開始你並不能適應這種環境,沒關係,熟練之後你的效率會有質的飛躍。

  • vi

在內核開發中使用vi有如下好處:
1. 佔用內存少,加載速度快; 2. 高度可定製化,經配置的vi可以很好地重映射命令按鍵; 3. 可以自動補齊一些函數名和變量名; 4. 可以和ctags很好地配合使用,通過ctrl+]能很快定位函數的定義位置。

大多數Linux發行版本默認安裝了vimtutor這個快捷的入門教程,其學習模式是邊操作邊學習。你可以在30分鐘內學習到vim編輯器(vi的拓展版本,功能強大)的所有基礎特性。要使用vimtutor,在SHELL下輸入:

$ vimtutor en

如果瞭解更多的vi使用說明,請參考:《Learning the vi Editor, Sixth Edition》, L.Lamb, O'Reilly

  • emacs

emacs的優點如下:

1. Lisp擴展可以大幅度提高效率; 2. 和etags的良好整合; 3. 按鍵組合更具指導性。
更多的emacs使用知識請參考:《Learning GNU Emacs, Third Edition》, Debra Cameron, James Elliott and Marc Loy, 2004, O'Reilly

[編輯] 熟悉Linux命令行工具

內核開發者一般都在命令行下面工作,是的,圖形界面有時會讓事情變得更糟,對內核開發尤爲如此。你應該能在命令行下面進行一些簡單的工作,比如:編譯程序,提交補丁,控制版本,收發郵件等。一些常用的命令行技巧會有幫助,所以也不妨去了解一些shell編程知識。下面僅介紹一些常用的:

  • gcc

gcc是GNU提供的優秀的軟件之一,其性能不亞於任何商業編譯器。它具有驚人的可移植性,而它也號稱其最優化功能非常強大,所以Linux內核就是採用了gcc作爲編譯器(Compiler)。gcc的選項這裏無法一一列舉,只能介紹一些常用的選項。
-o filename:這可能是你最常用的一個選項了。它用來產生以指定名字的可執行輸出文件。如果不指定文件名,gcc產生默認的a.out。

-c: 只編譯(Compile)不連接(Link),產生以.o結尾的目標文件,目標文件中存放着目標代碼。當然它也可以同時編譯多個文件。

   $ gcc -c hello.c

-Idir: 要求gcc在搜尋頭文件時除了默認的目錄/usr/include,也要到指定的目錄dir中去找。比如,編譯test.c時要用到/home/myname/test.h,我們可以:

$ gcc -I/home/myname test.c -o test

-On: 最優化選項。後面的n越大最優化程度越大。一般最常用的是-O2。-O0是不優化,這也是默認的。

   $ gcc -O2 -o foo foo.c


-Wall/-w: -Wall將打開所有警告,而-w將關閉所有警告。在編譯C程序時,強烈建議你加上-Wall選項,因爲gcc給出的很多警告都是相當有用的。當然還有折中的選擇,具體請參閱man手冊。
-W: 打開一些額外的警告。
-S:用來產生相應的彙編源文件,默認的文件名是filename.s

  • make

make是一個通用的工程管理工具,它可以“自動化編譯”,極大地提高了軟件開發的效率。make的使用是根據預先設定的規則來運行的,這些設定的規則記錄在一個文件中,即makefile。

make命令的格式是:

   make [ -f makefile ] [ option ] ... target ...

-c dir :將指定目錄設爲make開始運行後的工作目錄。 -f filename :將指定的文件作爲makefile -k :使make儘可能地編譯,即使命令調用返回一個錯誤,make也不會停止運行。這個功能很有用,例如,當需要移植的時候;你可以創建儘可能多的目標文件,然後可以在不用等待中間文件創建的同時,移植到不能創建的文件處。

makefile的書寫規則是一個大的話題,我們在這裏難以展開論述。[這裏]有一篇介紹makefile書寫的Howto,不妨仔細讀一下。要對make進行更深入的瞭解,請參考《Managing Projects with GNU make》一書。

 

  • grep

grep用來在文件中查找一個給定的字符串模式,比如可以快速定位函數或結構體定義。它還可以自動匹配一些正則表達式,非常強大。比如:你要搜索task_struct的定義, 你可以:

   $grep -r task_struct * | less

-r選項或許是你需要的,它可以幫你掃描源代碼樹中的所有源代碼文件。查看grep的man手冊來了解更多信息。

 

  • diff/patch

如果你在維護包含很多源文件的一個大型項目,每次更新後都推出完整的源程序是不太可行的,所以最好就用patch程序來更新原來的程序。這樣,當你的程序升級時,你只要推出源文件對應的patch文件,其他人就能通過執行patch來使用那個patch文件,以獲得最新版本的程序。
比如我們有一個程序foo,我們把它更新爲bar,我們可以用diff程序這樣產生patch文件:

   $diff -u foo bar > foo.patch


-u參數指定使用特殊的diff輸出格式,否則得到的patch格式怪異,一般人都沒法看懂。foo.patch就包含了描述foo和bar不同的信息,我們將用這個文件來更新。

提示:一定要注意diff命令後面的文件名順序,一定是舊的文件在前,新的文件在後!
接下來,我們用patch來更新:

   $patch foo < foo.patch

使用過某個patch文件後,若要再次使用該patch文件,patch程序會產生警告信息:詢問是否以-R方式執行,-R將還原文件。這樣很好,防止進行了誤操作。當然,有時你想更新的是整個目錄中的所有源文件,比如foo和bar兩個目錄,我們可以:

   $diff -cr foo bar >foo.patch
   $patch -p0 < foo.patch


diff的-c參數表示輸出上下文格式,-r參數表示遞歸的比較兩個目錄。 -p0告訴patch程序被更新的文件的路徑名並沒改變。
diffstat是一個很有用的工具,它可以列出patch 所引起的變更的統計(加入或移出的代碼行)。輸出關於patch的信息,執行:

$diffstat -p1 foo.patch

更多選項請參閱patch和diff的使用手冊。

[編輯] 3. 良好的英文閱讀能力和表達能力

不管是在Linux內核中,還是在Linux大多數應用程序中,文檔基本上都是用英語寫成的,到目前爲止,大多數還沒有對應的漢語翻譯。而且Linux內核黑客之間也是用英語交流的,雖然他們可能來自世界各地。熟練地駕馭英文肯定讓你受益非淺。
引用ESR在《如何成爲一名黑客》一文中的話:

   “當前英語有着比其他語言豐富得多的技術詞彙,因此是一個對於工作來說相當好的工具。基於類似的原因,
   英文技術書籍的翻譯通常不令人滿意(如果有翻譯的話)。”


“Linus Torvalds,一個芬蘭人,用英語註釋他的代碼(很明顯這對他來說不是湊巧)。他流利的英語成爲

   他能夠管理全球範圍的Linux開發人員社區的重要因素。這是一個值得學習的例子。”


如果你不懂實用性的英語,趕快去學習吧。

[編輯] 進階

如果你能來到這裏,那說明你已經是一名合格的Unix/Linux程序員了。但是,如果你要成爲一名內核程序員,還需要下面的一些知識。

[編輯] 1. 理解操作系統原理

內核是操作系統的核心和靈魂,要理解內核的原理和運作,必須具備基本的操作系統知識。操作系統課上的一些理論性的東西很有幫助,比如信號量的定義和使用,死鎖的預防,內存頁面的置換等等。列舉如下:

  • 1. 進程管理

進程的定義和PCB,進程和線程的區別,進程的三個基本狀態及它們之間的轉換關係,進程的同步,競爭和死鎖,進程間通信

  • 2. 內存管理

分頁式管理,分段式管理,虛擬內存的概念,頁面置換算法,內存分配算法

  • 3. 設備管理

中斷的概念,中斷處理,I/O控制方式,緩衝區管理,設備驅動,磁盤調度和高速緩存

  • 4. 文件管理

文件的概念,文件的管理,文件系統

  • 5. 系統調用

系統調用的概念,系統調用的處理,系統調用類型

關於操作系統理論方面的書籍,推薦Andrew S. Tanenbaum編寫的《Operating Systems: Design and Implementation》一書。

[編輯] 2. 一些硬件知識

由於內核本身的特殊性,一些時候你不得不和計算機硬件打交道,尤其是CPU。以i386爲例說明:

  • 常用寄存器,常見指令
  • 實模式和保護模式
  • 分段和分頁機制
  • TSS和任務管理
  • 中斷機制
  • 時鐘機制
  • 高速緩存

關於Intel CPU最權威的資料莫過於Intel的官方手冊,它們可以在Intel網站上免費[下載] 。其實你只要讀一下System Programming Guide就夠了。

如果你在做嵌入式Linux或者Linux設備驅動,相關的硬件知識更是必須的,可惜這裏無法一一列舉。

[編輯] 3. 其它

你還需要足夠的耐心和一些運氣,畢竟內核調試不像用戶程序那麼容易,一些bug讓整個社區好幾天都食不甘味了。用戶程序的調試經驗或許有用,但用處不大。這就更要求你對內核本身有足夠多的瞭解了,實際上,你對內核越是瞭解,bug就越容易清除。

最後,你可能還需要一些想像力。沒錯,Linux內核開發者有着豐富的想像力,他們經常使用一些“神來之筆”來解決令旁人苦惱的問題,或者爲內核添加一項新奇的功能來讓內核運行更流暢。

推薦相關書籍:

  • 《Linux內核完全剖析》

講述Linux 0.11版的源代碼,是一個不錯的起點。

  • Understanding the Linux Kernel, 3rd Edition

中文版是《深入理解Linux內核》,第三版即將上市。第三版主要是講解2.6版的內核,保持了前兩版的風格,是深入學習內核的必讀書籍。

  • Linux Kernel Development, 2nd Edition

中文版是《Linux內核開發》。其內容樸實,風格簡練,便於整體把握Linux內核架構。當了解操作系統原理後,便可閱讀這本書。

  • The Linux Kernel Primer - A Top Down Approach For x86 and PowerPC Architectures

中文版是《Linux內核編程》,此書最大的特色是能夠把x86和ppc兩個平臺結合起來講述內核,從用戶程序講起,深入到內核,而且每章後面還配有練習題。

  • Linux Device Drivers, 3rd Edition

中文譯本是《Linux設備驅動程序》,該書是設備驅動開發的最好工具書。其中的例子對於內核開發者來講是最好的啓蒙教材。

  • 《Linux操作系統原理與應用 》

陳老師寫的一本不錯的內核書籍,從原理、設計思想的角度對Linux操作系統的核心內容進行全面的闡述。

  • 《Linux內核情景分析》

本書採取類似於英語教學中行之有效的情景會話的教學方法,全面深入地剖析了Linux 2.4.0內核源代碼,並對Linux核心的獨特優點和需要進一步改進的問題作了精闢的評述。 全書分上下兩冊。一些有用的鏈接:

[編輯] 結束語

講了這麼多了,現在該輪到你了。如果你對上面的知識還有沒全部掌握,那麼不妨從你不熟悉的地方入手,一步步去了解和熟悉Linux內核。如果你是一位高手,對Linux內核有初步的瞭解和認識,不妨去動手寫一些驅動程序或者內核模塊,嘗試對Linux內核做一些自己的修改。如果可以,加入Linux內核郵件列表,看看裏面的內核黑客在做些什麼,試着幫他們測試新的內核,修復一些bug。

祝你在Linux內核世界走得更遠!

[編輯] 關於Linux內核學習的誤區

(轉自:chinaunix,作者:albcamus)
先說句正經的:其實我沒資格寫這篇文章,因爲自己也就一兩個月以來纔開始有所領悟的。因此,這裏與其說是關於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內核的虛存管理子系統,正如同會講漢語不說明你懂中國文化一樣。

[編輯] 如何閱讀Linux內核

作者:[牛濤]

[編輯] 閱讀內核源碼的工具

  • 在本地閱讀

這裏介紹一種閱讀內核源代碼的工具,名字叫cscope。具體說應該是cscope + vim +ctags。
對於ubuntu用戶,你可以直接在命令行上搞定這些軟件的安裝。
sudo apt-get install cscope
sudo apt-get install ctags
sudo apt-get install vim-full
因爲ubuntu系統自帶已經安裝了vim,所以我們不必安裝,但最好還是安裝vim-full,這樣在vim中打開的源碼就有了語法高亮顯示,比較容易閱讀。安裝完vim-full後,我們要修改.vimrc來啓用語法高亮:
vim ~/.vimrc
在其中添加
syntax on
這樣我們的vim就支持語法高亮顯示了。之後我們需要下載一個內核源碼包,這個可以在[www.de.kernel.org]上下載。下載下來之後解壓,進入內核源碼目錄,運行cscope,ctags:

find $s -name "*.h"-o -name "*.c" -o -name "*.cc" -name "*.S" >cscope.list
cscope -bkq -i cscope.list

或者使用 cscope-indexer -r 生成cscope的索引文件

ctags -R
現在我們啓動cscope就可以方便的閱讀內核源碼了:
cscope -R
其中我們可以方便快速的搜索我們想要的結構體定義,內數定義。

  • 在vim中ctags的簡單使用
1) 進入
進入vim後,用
:tag func_name
跳到函數func_name

2) 看函數(identifier)
想進入光標所在的函數,用
CTRL + ]

3) 回退
回退用
CTRL + T
查找標識符
:tag write_<TAB>
找到以write_開頭的標識符,如果有多個,繼續按<TAB>,直到找到想要的。
如果想跳到包含block的標識符
:tag /block
然後用<TAB>來選擇。
這裏'/'就是告訴vim'block'是一個pattern。
如果想在以write_開頭的標識符中選擇一下,
:tselect /^write_
這裏,'^'表示開頭,同理,'$'表示末尾。
多個同名的標識符
如果某個函數有多個定義,':tag'命令會跳到第一個,如果當前文件有,則優先用這個。
然後可以跳到下一個同名的
:tnext
跳到第一個
:tfirst
跳到前count個
:[count]tprevious
跳到後count個
:[count]tnext
跳到最後一個
:tlast
你也可以在所有tagname中選擇:
:tselect tagname 
  • 在網上閱讀

第二個方法是如果我們有網絡,我們可以直接在網上瀏覽linux內核源代碼,直接登錄http://lxr.linux.no/linux,我們就可以閱讀linux內核源代碼了。但是如果你的網絡環境不好,反應將會很慢,所以還是建議在本地瀏覽,也就是使用方法一那種方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章