對稱多處理
最簡單的提高硬件的性能的辦法是在主板上插上多個CPU(閱讀是最便宜的方法)。要麼讓不同的CPU做不同的工作(非對稱多處理),要麼讓它們並行運行同一工作(對稱多處理,縮寫為SMP)。有效的使用非對稱多處理需要專門研究計算機將要做的任務的知識,而這是在例如LINUX這樣的通用操作系統上不可能的。另一方面,對稱多處理實現起來相對簡單。 相對簡單,我的確切的意思是--不是真的簡單。在一個 對稱多處理的環境中,多個CPU分享同一內存,結果是運行於一個CPU上的代碼可以影響另一個使用的內存。你不再能保證你在前面幾行中設置的某個變量的值保持著相同的值--另一個CPU可能在你沒有看見時修改了它。明顯的,對程序的像這樣的問題是不能忍受的。
在進程編程中這通常不成為一個問題,因為一個進程通常在同一時間(例外是線程,它們可以同時運行於幾個CPU。)只運行於一個CPU上。另一方面,內核可能被運行於不同的CPU上的不同進程調用。SPIN
在 2.0.x版中,這不是問題,因為整個內核在一個大自旋鎖裡面。這意味著當一個CPU在內核裡,而另一個CPU例如因為系統調用而要進入內核,它不得不得到第一個CPU完成它的工作。這使LINUX的SMP安全(意思是和SMP使用它是安全的。 ),但嚴重的低效。
在 2.2.x 版中,幾個CPU同時在內核中。這是一些模塊編寫者應該注意的。我得到某人給我的使用一個SMP單元的權利,因此這本書的下一版有希望包含更多的信息。
常見的陷阱
在我把你送往這個世界和編寫內核模塊外之前,有一些事情我需要警告你。如果我沒能警告你而使某些壞的事情發生的話,請向我報告那個問題並向我索要你為此書而付給我的全額款項。
1. 使用標准庫文件 你不能那樣做。在內核模塊中你只能使用內核的函數,它們在 /proc/ksyms中可以看到。
2. 關閉中斷 你也許需要短暫的關閉中斷而那不會有什麼問題,但是如果你不能隨後打開它們,你的系統將被粘住而你不得不給它斷電。
3. 將頭粘在巨大的食肉動物裡 我或許還沒有警告你這個,但我無論如何會,只在萬一的情況下。
2.0 和2.2版之間的變化
我並不徹底的知道內核以寫出所有的變化。在范例轉化的過程中(或者適應Emmanuel Papirakis的變化)我遇到了下面的差異。我在這兒列出所有的我知道的以幫助模塊程序員,特別是從本書的上一版中學習的那些人和使用和我使用的技術大多相似的人,轉化到新的版本。
一個為希望轉化為2.2版的人有用的附加的資源在 http://www.atnf.csiro.au/~ rgooch/linux/docs/porting-to-2.2.html.
1.asm/uaccess.h 如果你需要 put_user 或者 get_user 你需要 #include 它。
2.get_user 在 2.2 版中, get_user 接收指向用戶內存段的指針和內核內存段的變量以填充信息。原因是如果我們讀的變量是兩個或四個字節長, get_user現在可以一次讀完。
3.file_operations 這個結構在 open 和 close 函數間有刷新函數。
4.file_operations中的關閉函數 在 2.2版中,關閉函數返回整數,因此它允許失敗。
5.file_operations中的讀寫函數 這些函數的頭文件改變了。它們現在返回 ssize_t 而不是整數,而且它們的參數列表也不同。節點不再是參數而是文件偏移量。
6.proc_register_dynamic 這個函數不再存在。你可以調用普通的 proc_register 函數並將結構的節點成員設置為0。
7.Signals 任務結構中的信號不再是32位整數而是 _NSIG_WORDS 整數數組。
8.queue_task_irq 即使你想從中斷句柄中讓一個任務按進度表發生,你應該使用 queue_task,而不是queue_task_irq.
9.模塊參數 你不能只將模塊參數聲明為全局變量。在 2.2 版中你必須也使用MODULE_PARM 聲明它的類型。這是一個巨大的改進,例如它允許模塊接收以數字開頭的字符串參數而不會混淆。
10.對稱多處理 內核不再局限在一個巨大的旋轉鎖裡面,這意味著內核模塊必須知道對稱多處理。
從這兒到哪兒?
我可以輕易的將更多章節的內容加入這本書。我可以加入關於創建一個新文件系統的章節或者加入新的協議棧(好象這兒需要它--你不得不發掘一個不被Linux支持的協議棧)。我也可以加入我們還未接觸的內核機制的解釋,諸如自舉或磁盤接口。
然而,我沒有選擇這樣做。我寫這本書的目的是為神秘的內核模塊編程提供基本的開端和為此目的的通用技術。對於真正的對內核編程感興趣的人,我推薦位於 http://jungla.dit.upm.es/~ jmseyas/linux/kernel/hackers-docs.html的內核源文件列表。就像 Linus 所說的,學習內核的最好的辦法是自己閱讀源代碼。
如果你對更多的短的內核模塊范例感興趣,我推薦Phrack 雜志。即使你對安全不感興趣(作為程序員你應該感興趣),那兒有很多很好的范例內核模塊讓你知道在內核中可以做什麼,它們足夠短,以至於不需要太多的努力就可以理解。
我希望我已經在你尋求成為更好的程序員上有幫助或者至少通過技術提供了樂趣。而且,如果你寫了有用的內核模塊,我希望你在 GNU通用公共許可協議下發布它以便我也可以使用他們。
商品和服務
我希望沒有人注意到這兒的不知羞恥的宣傳。它們是所有可能對開始Linux內核模塊編程人員有用的事情。
得到這本書的印刷版
Coriolis 團體准備在99年的夏天將這本書印刷出來。如果現在已經是夏天,而且你想得到這本書的印刷版你可以向你的印刷商購買它。
表示你的感謝
這是一個自由文檔。對於除GNU 公共許可協議規定條款以外的事情你沒有責任。然而,如果你因為得到這本書而想為了作為回報而做什麼的話,這有一些你可以做的。
給我發明信片
Ori Pomerantz
Apt. #1032
2355 N Hwy 360
Grand Prairie
TX 75050
USA
如果你想收到感謝回函,請寫明你的e-mail 地址。
向自由軟件團體捐獻財物或更好的--時間。在 GNU公共許可協議下編寫程序或文檔並發布。教其他人如何使用自由軟件,例如 Linux 或 Perl。
向人們解釋自私是和居住在一個社會或幫助別人是矛盾的。我喜歡寫這個文檔並且我相信發布它對我的未來是有幫助的。同時我寫了一本書去幫助你們(如果你得到的話)。記住,讓別人高興通常比讓別人不高興對你自己更有用,讓人們上路 比讓人們低能更好。
高興。如果我遇到你,它將使那次相遇更愉快,也能使你對我更有用。 ;-)。
關於這個文檔 ...
Linux 內核模塊編程指南
這個文檔是使用 LaTeX2HTML 翻譯器生成的 (98.1 發布版February 19th, 1998)
Copyright ©1993, 1994, 1995, 1996, 1997, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
中文版 Copyright ©2001 cherami
命令行參數是:
latex2html -dir html mpg.tex.
格式轉化是從 1999-05-19開始的。
中文的翻譯工作是從2001-2-5開始的。