linux 內核郵件列表

第一節 - 通常性問題css

1. 爲何有些時候使用「GNU/Linux"而另外一些時候使用「Linux」?html

答:在這個FAQ中,咱們嘗試使用「linux」或者「linux kernel」來表示內核,而GNU/Linux用於表示整個GNU/GPL的操做系統軟件。咱們須要分清:)linux

       FAQ的目的是提供linux內核更多的信息並避免語義上的歧義。更多GNU軟件和linux關係的討論能夠在http://www.gnu.org/gnu/linux-and-gnu.html獲取。看上去不少人都忽視了linux內核郵件列表是一個討論內核相關事情的論壇,而不是討論整個GNU/Linux。請不要把這方面的郵件發佈出去。ios

2.什麼是實驗內核版本?
答:linux內核版本被劃分爲兩個序列:試驗版(奇數序列,如1.3.xx或者2.1.x)以及企業級(如,1.2.xx, 2.0.xx)。這些實驗序列用於測試新的功能,算法,驅動。所以,試驗內核不是很是穩定,會形成系統穩定或者數據丟失。

3. 什麼是一個企業級內核?
答:企業級或者穩定內核有一個良好定義的功能集,較少的bug和已經通過測試的驅動。他們發佈的次數少於實驗性質的內核。GNU/Linux正式版通常使用企業級的內核版本,而不是最新的版本。

4. 什麼是凍結特性?
答:凍結特性就是linux在內核列表上宣佈再也不考慮更多的功能,直到新的穩定版本發佈。通常來講,這樣作後,形成的影響就是人們會在linux實際實施特性凍結前提出一大堆的新功能。

5. 什麼是代碼凍結?
答:代碼凍結比特性凍結限制的更多,這意味着,只能修正bug,這是一個很短的狀態,一般預示着新的穩定版本內核將要發佈。

6. 什麼是f.g.hhprei內核?
答:中間發行版本f.g.hh。(這裏解釋好比2.1.105ac4,其中f表明2,g就表明1,hh表明105,而prei就表明ac4)。

7. 從哪裏得到最新的kernel代碼?
答:第一個推薦網站由 Transmeta (Linus Torvalds曾經工做過的公司)維護,網址爲:http://www.kernel.org/.該網站在全球都有鏡像。你能夠經過網址http://www.CODE.kernel.org/ 訪問你國家的鏡像,其中「CODE」是你國家的代碼。好比「au"表示澳大利亞,因此鏡像網站就應該是http://www.au.kernel.org/。
    你一樣能夠選擇ftp,從 
ftp://ftp.CODE.kernel.org/pub/linux/kernel/ 來下載kernel。另外,著名內核高手在people文件夾下有一些目錄,用於放置他們的內核補丁。testing目錄是Linus存放預發行補丁的目錄。預發行補丁主要用於其餘開發者,這樣他們就能夠和Linus的源碼樹保持一致。這一般是測試版本,應此常常致使系統崩潰。請在你本身的硬盤上使用。
    注意,Linus和Marcelo使用GIT來管理他們的內核源碼樹。這讓他們很方便的獲取最新代碼,而提供補丁就不同了。若是你但願獲取這些源碼樹的快照,下列方法能夠得到:
git

  1. CVS: :pserver:anonymous@cvs.kernel.org:/home/cvs/linux-2.[45]
  2. Subversion: svn://svn.kernel.org/linux-2.[46]/trunk

    Linux再也不在BitKeeper源碼管理系統中維護本身的代碼,而是使用GIT。GIT是Linus編寫的,
緣由是BitKeeper不在對開發者提供服務。你能夠瀏覽Linus最新代碼以及其餘人的項目
這裏一樣有一個關於 Overview of GIT and some helper tools 的說明和一個完整的
Tutorial來指導你使用GIT.

8. 我從哪裏獲取額外的kernel補丁?
答:這有不少地方提供了內核新功能的補丁,其中一個好的源就是http://www.linuxhq.com/

9. 什麼是補丁?
答:補丁文件(這裏特指linux內核)是一個ASCII文件包含了新代碼和老代碼的區別,包含文件名和行號。補丁程序(可使用man patch來查看)就會將補丁中涉及的修改加入當前的代碼樹。

10. 我如何建立什麼時候與linux內核的補丁?
答:發佈這裏有一些基本的守則。查看如何生成補丁,請留意下面的文字:程序員

  • 確認每一行的結尾沒有ctrl+M字符。爲了兼容DOS,一些工具會在補丁每行後面增長一個ctrl+M。因此,請正確配置你的工具,不然,你就必須手動刪除這些字符。
  • 在email中用簡單的文字包含補丁,不要使用基於64位的MIME。許多人可能沒法閱讀你的補丁,所以你的補丁會直接被刪除。
  • 對於大的補丁,推薦把它分紅若干個部分,每一個部分使用下面的描述進行註釋:
  1. "[PATCH] cleanup of foo driver [1/5]".

          不要對每個部分都開一個線程,應該一個一個部分的順序執行下去。詳細的能夠查看Documentation/SubmittingPatches。算法

  • 若是你想讓Linus或者主要維護人員中的其中一個來接受你的補丁,你必須明確的Cc:他們,不然你的補丁將被忽略。
  • 當給Linus或者主要維護人員中的一個發送補丁時,你必須使用簡單的文字來包含補丁,不論補丁有多大。
  • 若是你但願徵求補丁的修改意見,你一樣能夠將它發送給Linus/主要的維護人員。若是補丁很大,你可能會好奇如何協調代碼的衝突部分。解決方法很簡單:先發送URL,而後發送補丁。
  • 若是你的郵箱會自動清除空白或者其餘問題,請先修好你的郵箱,不要期待有其餘的解決方法。

      最後,我見過有人質疑上述準則,認爲這些規則過於嚴格,FAQ過於熱心。幸運的是,King Penguin本身迴應了這些,因此,我直接將他的話記錄以下:
   shell

  1.    若是我拿到一個補丁非簡單文本格式,除非有絕對的理由,不然我將忽略它。我甚至不會去閱讀它的內容,除非我期待發件人會給我一些特別的東西。真的,請不要發送這樣的郵件。
  2.                                                                           Linus

       這有一個給使用Mozilla郵件客戶端的用戶的警告。Andrew Morton注意到當補丁被包含在消息體內時,Mozilla會損壞0列的空格。幸運的是,Mozilla 郵件以text/plain或者text/x發送補丁時正常。因此,使用附件發送補丁是安全的。
       生成補丁,你須要使用diff程序(閱讀diff命令說明)。最簡單的方法完成補丁就是在/usr/src/下,創建兩個源碼樹,創建一個連接/usr/src/linux執行修改過的樹,而後diff這兩個目錄,/usr/src/Documentation/CodingStyle下放了更多的信息。注意:編程

  • 永遠使用統一的(-u)diff格式。
  • 避免調整源碼格式而致使diff出現無用的信息。避免使用tab替代空格等行爲。
  • 除非你有特殊的緣由,不然使用diff和最新的官方源碼進行比較。不然,你的補丁將被忽視。
  • 確認你的補丁中只包含須要的修改,而不是你對源碼樹所做的所有修改。通常來講,補丁限制在個別文件或文件夾中。最好對單個文件進行diff。例如,若是我只對文件driver_xyz.c進行了修改,那麼我將使用下面的命令(確認你有源碼樹名稱爲「linux-2.1.105"),並且修改後的使用連接「linux」):
  1. cd /usr/src
  2. diff -u linux-2.1.105/drivers/net/driver_xyz.c \
  3. linux/drivers/net/driver_xyz.c > my_patch
  • 下面兩個確定要說:diff的兩個參數中第一個爲源碼,第二個爲改過的源碼。並確認你已經編譯和測試過。
  • 固然,你須要創建兩個獨立的目錄以方便diff。這裏提供一個好的技巧:
  1. tar xzvf linux-2.1.anything.tar.gz
  2. mv linux linux-2.1.anything.orig
  3. cp -al linux-2.1.anything.orig linux-2.1.anything

       這樣能夠將每一個源文件硬連接到一個新的目錄,由於這不復制文件因此很快。你能夠對linux-2.1.anything源碼樹使用補丁,因爲補丁不修改源文件只是移動他們到filename.org,因此連接的源文件將不會修改。
        確認你的編輯器也是相同的(在修改以前,自動備份源文件)。你能夠隨意的編輯硬連接的源碼樹。若是你的編輯器不能這樣作,你須要在修改文件前作以下備份:api

  1. cp driver_xyz.c temporary; mv temporary driver_xyz.c

       你可使用文件的屬性來提醒你這些,在工做前將可寫屬性去除。

  1. chmod -w *.c

      diff操做會很快,由於大部分的文件都不沒有修改。感謝 Janos Farkas <chexum@shadow.banki.hu> 。

最後,在提交前審查補丁文件,特別要說明:爲何須要這個補丁,以及到底修正了什麼。

11. 如何應用一個補丁?
答:(來源於/usr/src/linux/README)你可使用補丁升級版本。補丁以gzip和bzip2格式發佈。安裝補丁,須要獲取比目前版本新的補丁文件,進入解壓後的源碼樹根目錄,並執行:

  1. gzip -cd patchXX.gz | patch -p1 or:
  2. bzip2 -dc patchXX.bz2 | patch -p1

    (將全部比當前版本新的補丁都作一遍),你能夠刪除全部備份文件(xxx~或者xxx.orig),請確認沒有失敗的補丁(xxx#或者xxx.rej)。若是存在,請確認是否存在操做錯誤。
    此外,腳本patch-kernel 能夠自動執行上述過程。它會自動判斷當前內核版本和補丁版本,使用方法爲:

  1. scripts/patch-kernel .

    第一個參數爲內核代碼位置,補丁默認爲當前目錄,也可使用第二個參數指定。
    應用內核補丁請查看文檔(/usr/src/linux/README)「Installing the kernel」部分。一樣也能夠參考 good explanation on the Linux HQ Project site. 

12. 什麼是vger?
答:vger是發佈LKML服務機器的名字。服務器一樣存放了大量其餘linux相關郵箱。更多的信息能夠在下面的網頁找到:http://vger.kernel.org/

13. 什麼是CVS樹?我如何瞭解關於CVS的更多信息?
答:「CVS」是版本控制系統的簡稱,是一個源碼管理系統。能夠從這裏獲取更多信息:CVS Bubbles page

14. 哪裏有CVS的教程?
答:你能夠從這裏找到在線的教程:An interactive CVS tutorial.
       瞭解CVS大概須要15分鐘。

15. 如何將補丁打入內核?

答:根據你的補丁,有若干種方法來將補丁打入內核。關鍵看你這部分代碼由誰維護(查看MAINTAINERS文件)。若是你的補丁只是一個小的bug修正,而且你很是確定這是正確的操做,那麼用任何方法將其發送給維護者。若是補丁很是緊急(好比一個主要的安全漏洞),那麼你能夠直接發郵件給Linus,可是注意,他可能會忽視一些補丁,除非對他來講是很是正確的。通過維護者的贊成,或者通過完善的測試。假設你想知道什麼是良好的測試,這裏還有一點重要的說明:列表的目的是讓補丁經過別人的評審以及良好的測試。好,若是你的補丁很是大,好比重寫了一大段代碼或者一個新的驅動,爲了節約帶寬和磁盤空間,請經過鏈接發佈補丁。最後,若是你對於本身的補丁不是很是肯定,須要維護者的反饋,你可使用私人郵件。

    若是你想提供補丁的部份內核代碼沒有特定的維護者,你有3個選擇:

  • 發送郵件去linux-kernel@vger.kernel.org 而且期待有人看到並反饋給Linus,或者linus本身看到它。
  • 發送郵件給linux內核和cc:Linus Torvalds <torvalds@osdl.org>期待linus接受它。注意Linus的操做就像一個黑盒。不要期待從他那裏得到任何回信。你須要本身檢查它發佈的補丁來確認他是否採用了你的補丁。若是他沒有采用你的補丁,那麼你須要反覆的發送郵件(屢次)。若是一個星期或者一個月後當他發佈了不少補丁,卻仍然沒有采用你的內核,那麼也許你應該放棄。看來他不喜歡這個補丁。
  • 發送郵件到linux內核和Cc:Alan Cox <alan@redhat.com>。Alan在迴應郵件方面表現的更好,會認真的對待你的補丁,並會按期將補丁發送給Linus。他一樣是一個好的測試人員。若是Alan接受了你的補丁,基本上Linus也會接受。若是他不喜歡你的補丁,你也會得到一個郵件說明狀況。

16. 爲何內核tar包包含的目錄叫作linux而不是linux-x.y.z/?

答:由於Linus但願這樣。這樣使得更新補丁更方便,由於目錄不用反覆的重命名,這對於Linus來講更方便。

17. 官方內核和Alan Cox的 -ac系列補丁有什麼不一樣?

答:Alan的內核是Linus內核的測試溫牀。當Linus只接受穩定的並通過嚴格測試的補丁到2.4內核時,Alan維護了一個內核補丁包含了不少新概念,新驅動,和相對多bug的補丁。若是這個補丁證實本身的穩定,Alan將他們貢獻給Linus幷包含到官方的內核中去。

18. 被污染的內核指什麼?

答:一些廠商發佈的二進制模塊(好比,沒有基於free軟件許可的可用源碼的模塊)。因爲源碼不是免費可用的,發生在這些模塊上的任何bug都不能被咱們檢查。關於這個模塊發現的全部問題都只能返回給對應廠家,而不是內核專家,或者是linux-kernel郵件列表。污染的方案過去用來描述二進制模塊內核bug報告:這些內核被標識爲污染的。若是一個被加載模塊沒有通過公認許可的認證,內核就被標識爲被污染的。公認許可認證相關文字在 linux/include/linux/module.h中。
    "oops"報告被表示成污染的對於內核開發者來講能夠忽略。當這樣一個模塊被加載時,就會產生一個警告。注意,你能夠查看一個存在兼容性許可的卻沒有MODULE_LICENSE TAG的模塊。若是你在modprobe或者insmod操做一個符合兼容性許可的模塊時發現警告,請報告這個bug到這個模塊的維護者。這樣他們就會增長鬚要的TAG。

    若是一個符號使用EXPORT_SYMBOL_GPL被導出,那麼若是模塊沒有GPL兼容性MODULE_LICENSE字符,那麼將沒法被處理,並顯示警告。若是強制加載,模塊也會污染內核。

    對於Alan Cox 「BSD  without advertisement clause」不是一個合適的自由軟件許可。這個許可類型容許只有二進制文件而沒有源碼的模塊。任何知足這個許可的內核tar包中的模塊都應該是「Dual BSD/GPL」。

20. 我是否必須使用GIT來發送補丁?

答:絕對不是,一些內核開發人員包括Linus和Marcelo使用了GIT來管理內核樹,可是這絕對不意味着你必須使用GIT來維護你本身的代碼或提交補丁。許多高手仍然使用其餘工具或技術來維護本身的代碼。

21. 誰維護內核?

答:原來,Linus Torvalds維護內核。隨着內核的發展,他將老的穩定版本維護工做分攤給其餘人,本身繼續開發最新的「bleeding edge」版本。在2002年5月27日,下列內核版本交給其餘人維護:

22. 內核編譯不了,我該怎麼作?
答:首先確認你得到了最新的代碼。也許一些分支代碼確實存在問題。不如不是,查詢是否存在補丁。不要詢問已經有人問過的問題。若是問題沒有獲得修復,嘗試,本身查看代碼和給郵件列表發送補丁。你將成名。注意,clean代碼不算修復。

第二節 - 驅動相關問題

1. 驅動存在問題?

答:須要更詳細的說。請提供你特定的setup的信息(查看Qs How do I make a bug report?)一樣能夠查看Q:「kernel x.y.z broken!」。

    最差的方法就是重寫驅動,儘可能聯繫驅動的做者並報告錯誤。建設性的批評也是歡迎的。

2. 這有一個新的驅動用於硬件XYZ

答:乾的好,請嘗試找到一樣使用該設備的人讓他們測試程序。不會在沒有人使用以前將驅動放進內核。當進行測試時,訥河的開發也在繼續,你可能須要從新寫你的補丁來適應當前版本。因爲整個驅動很大,咱們建議將實際驅動上傳到ftp上,而後將鏈接發送到郵件列表,並描述你的驅動適用於什麼硬件。

3. 是否支持個人TW-345卡在f.g.hh版本內核中?

答:首先檢查硬件是否在啓動時識別。通常來講是這樣。而後看你是否須要進行配置好比modules.conf。第三看內核源碼中是否有文件包含卡的名字(好比你有一個邏輯總線卡,有一個buslogic.c,那麼你就很是幸運)。接着,在內核代碼中尋找供應商的名字,或者卡的model號,或者最大的芯片的芯片號。例如,53C80芯片的驅動可能在源碼中叫作5380。而後檢查DejaNews,使用你在內核源碼中查找的關鍵字,有99.99%的機會找到特定的設備驅動。好了。這樣你不用打攪其餘人就能夠找到你須要的。若是都沒有奏效,你應該問問一些新組織,好比comp.os.linux.hardware。

4. 誰維護驅動?

答:看看/usr/src/linux/MAINTAINERS文件,這裏是最權威的來源。一樣能夠查看驅動源碼自己。一些驅動有本身的網頁和特定的郵件列表。若是你沒法聯繫上維護者,那麼你就能夠給郵件列表發郵件。不論如何,記住維護者通常是很忙的人,他們通常都是利用業餘時間爲linux工做,因此不要期待馬上的迴應。一些維護者可能在短期內獲得太多的郵件以致於不可能回覆所有的郵件。請諒解。

5. 我想爲TW-345寫一個驅動,我應該如何開始?

答:至關的主動!首先有一個創建:你準備好做這些了嗎?不少項目剛開始就結束了。確認你沒有作重複的工做。確認驅動不存在:請閱讀Q/A:2.3。

    首先準備好你本身。下載文檔,閱讀它們。接着,獲取linux內核源碼,查找相似驅動,讀取THAT。(我通常使用最小的那個:wc -l *.c |sort -n |head -4)。好了,你能夠思考一下。如今的問題是,你有硬件設備的說明嗎?你能夠經過逆向工程,但有設備文檔會更簡單。在最黑暗的時候(70年代到80年代),你能夠拿到全部設備的完整資料。這已經不可能了。聯繫你的賣主,禮貌的詢問設備信息或廠家。嘗試聯繫廠家。若是你沒法拿到技術文檔,考慮放棄或者嘗試硬件的競爭對手。若是沒有放棄,好的,下一步就是找到Dos驅動。嘗試在微軟模擬器(dosemu或WINE)上運行。這容許你對工具變成來記錄I/O信息。這將給你不少IO相關的信息。祝你好運,你會用到的。

6. 我想獲取文檔,可是他們讓我籤NDA(不公開承諾)?

答:一些人遇到了真正的麻煩。一些公司只是想知道哪些人擁有文檔,而不關心你是否編寫GPL驅動。這樣,存在一個問題:告訴他你將作的並讓他們寫下他們確實明白了你的意思。這樣,你仍然能夠將驅動編寫進內核。但你不能將文檔發送給其餘人。他們只能讀取源碼中的註釋。另一些公司(好比Netscape)本身簽寫了NDA來限制他們不公開信息。這樣就不容許你來編寫驅動,並將源碼放在網上。請注意。若是有人遇到NDA,我建議不要接受。

7.我想有一個TW-234的驅動,有人願意幫我寫一個嗎?

答:有些linux開發者願意爲了一杯啤酒來開發驅動。另一些可能願意免費幫你。若是你須要,你能夠考慮付錢來購買或維護驅動。

8. 什麼是主驅動號?

答:驅動好是傳統的unix方法,用來在文件系統和設備驅動間尋址。一個驅動號是一個主號和鏡像號的組合。當前linux有8bit的主和鏡像驅動號。當你打開一個設備文件(字符或設備)內核從模塊讀取主號到一個驅動結構表中。有兩個表:一個用於字符設備,一個用於block設備,每一個都有256個最大值。內核源碼中Documentation/devices.tex文件列出了全部的官方和鏡像號。H.Peter Anvin(HPA)維護了這個列表。若是你寫了一個驅動,你須要由HPA得到主號。詳情參看:Q/A on devfs

 9. 爲何不支持WinModems?

答:問題是缺少這個硬件的相關信息。大部分公司生產WinModems拒絕提供信息,而讓微軟操做系統來使用。最根本的問題是,他們和通常的貓不同;他們沒有DSP,而是讓CPU作全部事情。所以你沒法像傳統貓同樣和他通信,你須要運行貓的驅動,或者你會出現數據丟失。他們設計的並很差。

    注意,一些人努力去反逆向winModems,因此若是你很幸運,就能夠找到支持你設備的驅動。不然,你就應該買一個傳統的貓。注意,貓必須通過機構的認證。而WinModems,驅動軟件和硬件都須要通過認證。而這對於開源軟件驅動來講更難,由於須要花費更多的錢。因此,理論上說,修改開源驅動比較容易。實際上99.999%的用戶不知道存在驅動的源碼。若是認證是惟一的問題,那麼生產廠家將會發布二進制驅動。好消息是,大部分的WinModem硬件是被支持的。壞消息是這只是冰山一角。景觀winModems可使用,他們功能與聲卡類似。全部的功能都須要使用本地CPU。能夠在這裏查看更多的信息:see http://www.linmodems.org/。

10. 現代CPU很是快,爲何我本身不能寫用戶模式中斷處理?

答:這問題不等同因而否存在足夠的CPU來浪費。而更像是,當前的Linux結構不容許這樣作。用戶程序經過中斷方式運行,任何終端都必須激發特定的中斷處理代碼來執行。所以,小的設備驅動必須存在於內核模式中。

11. 是否須要針對全部版本發佈驅動?

答:這裏有詳細描述不一樣內核版本區別的記錄。爲SMP編譯的驅動不可能在一個非SMP內核中運行。一樣,不一樣的供應商期待加入不一樣的東西到他們的內核序列中,可能也會改變數據結構。所以,內核中的數據結構是不變的。任何修改二進制驅動的作法可能都會產生問題。內存變化可能會出如今i386-PAE模式。應爲這些區別,一個驅動爲一個內核版本編譯的結果,是不能和其餘內核上工做的。若是你發佈了一個二進制的驅動,你將須要針對不一樣的內核版本提供支持。若是你發佈的驅動是源碼形式,那麼提供寫好的驅動,這些驅動將跨內核版本和結構。固然,它將須要最終用戶進行編譯。版本維護人員ui提供預先編譯的驅動,大部分的用戶將不須要本身編譯驅動。

第三節 - 郵件相關問題

linux內核郵件列表用於討論linux內核自己。關於linux系統員、linux編程、linux發佈的討論不受歡迎。

測試消息不受歡迎。若是你想知道是否訂閱成功,請等待若干小時,你將會受到郵件列表系統告知的郵件。你毫無疑問的會受到一連串的消息。若是你但願本身發送郵件,那麼必須確保本身有重要的事情要說。當你閱讀了下面的段落,寫成一個實際的郵件,而後發送到lkml。請記住,這裏有不少的訂閱者,這將須要你等待好久來獲取反饋郵件。一個小時並不長。

當給linux-內核郵件列表發送郵件時,會有不少忙的人閱讀這些消息。無論你認爲本身有多重要,這裏有不少比你更重要的人。重要並非看你有多少錢,而是看你對linux內核作了多大的貢獻。

記得這些,你必須確保沒有浪費其餘人的時間。

1. 如何向linux-內核郵件列表註冊?

答:訂閱前請仔細考慮。你是否但願郵箱裏面出現不少的郵件?你是否那麼關心linux內核開發期待每週更新一次內核,忍受bug,錯誤和系統崩潰的時間和精力的浪費?你是否準備好加入偉大的企鵝,並被人稱爲怪胎?也許你應該閱讀「Kernel coverage at LWN.net」在網址:http://lwn.net/Kernel/
    好了,若是你仍然期待加入,發送 "subscribe linux-kernel your_email@your_ISP" 到majordomo@vger.kernel.org (注意,不要包含雙引號字符,固然替換你本身的郵箱地址)。你將會完成訂閱。我常常看到以下的報告:

  1. FAILED:
  2. : ...\
  3. <<- RCPT To:<edmond@cedar-republic.com>
  4. ->> 550 <edmond@cedar-republic.com>... we do not relay

    反饋這個問題到網址: http://vger.kernel.org/mxverify.html

    確認你沒有上述問題!詳見: http://vger.kernel.org/majordomo-info.html

2. 如何取消linux內核郵件列表訂閱?

答:由郵件列表服務器發出的每一封郵件底部都有下面的說明:

- 
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in 
the body of a message to majordomo@vger.kernel.org

   詳見: http://vger.kernel.org/majordomo-info.html

3. 我是否必須訂閱郵件?

答:你不是必定須要訂閱郵件。郵件地址爲:linux-kernel@vger.kernel.org。你應當在你的消息中說明你的評論和回答都表明了你我的。

    可是,總的來講,訂閱郵件是有好處的。咱們能夠知道什麼是公認正確的,什麼不是。別將這裏做爲我的的helpdesk。這是一個社區。

4. 存在文件列表嗎?

答:

5. 我如何在文件中查詢特定問題?

答:使用簡單關鍵詞特指一個東西,好比,若是你在使用網卡NIC-007時出現問題,使用「NIC-007」或者「oops NIC-007」。記住,仔細查找文件,你將找到更多的信息而不是簡單發佈一個問題。

6. 郵件列表是否負擔很重?

答:負擔很是重;平均天天的消息量爲~400【07/2007~02/2008】.一個月就超過12000個消息。你真的不會願意去閱讀每條消息。若是你關心郵件列表中的負擔,我建議你嘗試 digest lists,這個負擔會輕不少。這裏還有一個每週的總結叫作"Kernel coverage at LWN.net" 在: http://lwn.net/Kernel/

8. 在列表中,我能夠問什麼問題?

答:基本規則就是避免問已經問過的問題。記住,這裏有個郵件列表用於內核開發的討論。若是你有什麼想法或者bug須要報告,就去這裏吧。若是你找到一個Clib庫或者應用的問題,這不屬於linux-kernel。

9. 郵件風格有什麼要求?

答:當使用郵件列表跟貼,在你引用前請仔細考慮。由於列表上的每一個人都有原來發送的郵件,因此不要所有引用。高亮你須要代表你觀點的部分就行。確認引用的部分使用>(或者>>)。不要引用簽名,補丁,配置文件,和整個郵件。內核list已經很擁擠了。請你們注意。

    注意若是你有太多的引用,你的郵件可能會在沒有閱讀的狀況下被刪除。請在引用的文字後面回覆,而不是在前面回覆。在引用以前看到回覆着實讓人看不懂。我知道有些人喜歡引用整個消息,因此他們回覆在最開頭。不要這樣作。別引用所有的東西。沒人願意看到這樣的郵件。

    請不要使用tab或者空格來表示引用。使用>來表示。使用空格沒有辦法區分引用和回覆。浪費你們的時間。參看如何提升閱讀效率:Write for maximum efficiency of reading.

    不要使用太長的簽名,前們不支持超過4行80個字符。

    不要使用太大的附件。不少人把.config文件做爲附件,這可能會超過1000行,並且還會持續增長。若是你.config的內容有須要加入郵件,那麼能夠將下面的結果附在郵件附件裏:

  1. grep ^C .config
  2. or
  3. grep "=[y|m]" .config

    若是你使用微軟Outlook,那麼你須要使用下面的補丁:

10. 郵件是否有人管理?

答:內核郵件列表無人管理。

11. 我如何拒絕列表的郵件?

答:技術上可行,可是我從沒有據說有人拒絕linux內核郵件。若是你堅持這麼作,那麼你須要作的就是使用程序「fetchmail」,這能夠反覆的發送郵件到特定地址,好比linux-kernel@vger.kernel.org。若是你讓這個發生,你能夠確保你的訂閱將會被刪除。

12. 我須要注意其餘哪些規則?

答:這裏還有些規則須要注意:

  • 注意,這是linux內核的郵件,主要爲開發者服務。
  • 只是用英語。
  • 不要傳輸HTML格式。若是你在使用IE或者Netscape, 請關閉HTML郵件格式。
  • 若是你使用其餘OS, 確認你的郵箱不使用Charset="Windows*",由於這些郵件將被阻止。
  • 若是在你上傳郵件前你被組織,  在文檔中查找答案。記住99%的問題,之前都問過。通常來講第一個問題是最完整的。
  • 準確的詢問問題,或者聲明bug。 避免歧義。
  • 態度誠懇些。 避免攻擊其餘用戶。
  • 不要糾纏於爭議。
  • 一行代碼比千萬句話都管用。
  • 批評別人的代碼很容易, 但本身寫就不那麼輕鬆了。 若是你發現一個問題或錯誤,不要立刻寫下評論,好比"這段代碼真垃圾?"。聯繫代碼的做者, 解釋問題。 之後,當你寫代碼的時候,你們都會承認你。
  • 不要責備新人問的簡單問題。 給他們發送私人郵件說明你的觀點。

13. 我如何發送郵件?

答:你能夠發送郵件到:linux-kernel@vger.kernel.org

14.  郵件列表被列爲垃圾郵件?

答:郵件列表非垃圾郵件。

15. 我再也不從郵件列表得到郵件,出什麼問題呢?

答:Majordomo 是一個智能郵件列表服務器。若是出了什麼問題,郵件沒法發送,屢次嘗試後,你會自動退出訂閱。從另一個方面說,郵件服務器出現故障也是存在的狀況。若是被取消訂閱,那麼請從新訂閱。也有可能由於MTA延時,致使退出訂閱。若是你的郵件路由數據是合法的就證實發生了這種狀況。能夠將你的地址反饋給http://vger.kernel.org/mxverify.html

16. 是否存在NNTP網關?

答:是的,這有一個新組織叫作:fa.linux.kernel。

17. 我想發送一個好想法到郵件列表去,我應該怎麼作?

答:你能夠這樣作:

  • 首先確認你的想法對於內核開發很是重要。在發送郵件前,請確認這是一個內核問題。
  • 那麼你有一個關於內核的想法。 你是否確認之前沒有人想過? 閱讀全部相關的主題。 一樣查詢 the mailing list archives 看之前是否有提出過相似的想法。
  • 這裏,你已經確認過你是第一個提出這樣想法的人。 爲了更好的獲得迴應, 給出一個補丁 發送郵件。若是你提供代碼, 就會有人進行嘗試並給出評論。 若是你不清楚內核hacking,那麼你最好如今開始學習:-) 當你提出了你的想法, 你就能夠把本身稱爲內核專家。
  • 若是你沒有使用代碼實現, 只是一個想法, 併發送郵件。 儘可能寫清楚, 這樣人們才能更好的瞭解你的想法。 若是你幸運, 有人喜歡你的想法並實現它。 若是沒有人去實現,請注意, 咱們都是志願者,每一個人都有太多事情去作。
  • 若是你的想法沒有獲得好的迴應, 別泄氣, 沒有一個嚴格的定義來講明什麼是好的想法或壞的想法。若是有人對你說了不敬的話, 請控制你的情緒。若是有人很客氣的表達不一樣意你的想法,請仔細考慮你的想法。 若是別人仍是沒有清楚你的想法, 請使用其餘方法解釋一遍。
  • 若是你認爲你是對的,不用在意別人的說法,你能夠本身實現它! 若是你是對的,你能夠笑到最後。

18. 若是郵件列表發送了不相干的郵件,我應該怎麼作?

答:不理會他。

20. 能夠自動將「回覆:」加在列表中嗎?

答:有些郵件列表自動增長 「回覆:」幫助查看郵件。但這不是個好想法,有幾個緣由,這裏不想列出。能夠查看以下連接:Reply-To: Munging Considered Harmful 。

21. 我能夠在郵件列表中招聘工做嗎?

答:固然不行,若是你想找工做,仍是去這個網站吧:http://www.hotlinuxjobs.com/

22. 爲什麼我發送私人郵件會出錯?

答:有不少緣由,好比,郵件遞送出現問題。郵件被阻塞。

第四節 - 「我如何」相關問題

1. 我如何提交補丁?

答:我假設你已經按照前面的要求作了補丁。如今寫一個簡短的說明來描述你的補丁,包含針對的內核版本,你的測試用例,你想要的反饋等。最好10行之內。給你的補丁和一行的ReadMe文件(描述你的名字和郵件)放在一塊兒。在你的郵件中,寫明[PATH]<驅動名或代碼段>,kernel<內核版本>。而後發送。小的README文件保證你的補丁在網絡上傳送而不會泄漏你的名字。若是你不關心版權,那麼你能夠略過這些文件,直接gzip補丁文件將其放在附件中上傳。

    注意,linus不閱讀linux-內核list。若是你但願他看見補丁,你就必須直接發送給他。注意,Linus喜歡在ASCII下閱讀補丁。若是你的補丁太大,你只能發送一個URL給Linus。同時注意,Linus不會回覆你的郵件。

2. 我如何捕捉異常?

答:若是異常發生,系統會將內存數據寫入/proc/kmsg文件。你可使用dmesg命令打印其內容。可是klogd和syslogd會自動的捕捉異常並寫入日誌文件。

    有些時候,異常致使內核崩潰。出現這種狀況時,全部功能都死掉了,此時,異常沒法寫入日誌文件。在全面的崩潰狀況下,你有三種對策:

  • 手動抄寫異常文字。
  • 你能夠預先安裝終端連接(read linux/Documentation/serial-console.txt)那麼你也能夠遠程記錄問題。
  • 從2.3.10開始,你就可使用串口打印機做爲終端。能夠打印屏幕信息。
  • 還有補丁可使用硬件記錄linux內核日誌。

3. 我如何發送一個異常?
答:假設已經發現了一個異常,你應該將相關的系統日誌、內核配置文件、內核符號map以及你的硬件和環境描述。該異常是特殊的函數形成的?他是否發生在你硬件配置修改?不要在你查看linux/Documentation/oops-tracing.txt文件、linux/scripts/ksymoops的README前,發送異常報告。這些文檔描述了內核異常的基本原理。好的跟蹤信息使得解決問題更方便。若是沒有運行ksymoops將內核緩存造成文件,請不要發送異常報告。報告將被忽略由於沒有提供任何有價值的信息。確認,你拷貝了正確的system.map文件到/boot文件夾,不然你沒法獲取正確的結果。
    下列狀況會使得內核異常沒法處理。最典型的兩個就是若是你的CPUoverclock,或者在VMWARE下運行。緣由是overclock可能形成隨機bit錯誤,而VMWARE下運行可能改變內核數據。在這兩種狀況下,內核數據報告是沒有用的。

4. 我認爲本身找到了一個bug,如何進行報告?
答:一個bug和異常有明顯的不一樣。異常是當內核檢測到有東西出現異常。bug是事物沒有按照應該的方式運行。若是你發現了不正確的功能,你可能也有可能不遇到異常。

5. 什麼樣的信息我應該發送在bug報告?
答:他是否影響了系統安全?是否跟驅動和硬件配置有關?你是否可以識別出相關的代碼?這都依賴於你找到的bug。

   請遵照bug報告準則:記住,開發者沒有權利進入你的系統,他們也不是思想閱讀者。告訴咱們內核的版本,你的硬件狀況(若是你不清楚,更多的細節老是須要的)。至少,告訴咱們你使用的處理器和主板,多少錢,多大的硬盤,使用什麼磁盤控制器以及其餘的擴展版。若是有下面這些的話會更有幫助:gcc編譯器的版本和binutils版本。嘗試找個可複製的方法來觸發問題。告訴開發者搭建一個複雜的應用環境會致使不少開發者直接刪除郵件。

    總的來講,提供數據比直接給出結論更有效。若是你想在你的bug報告中給出你的猜想,咱們歡迎,可是這不是具體數據的替代品。有些問題並非看上去的那樣。硬件問題可能可能會假裝爲一個VM問題。一個設備驅動或者VM問題可能會致使文件系統差別。

    若是你得到一個異常消息,你必須把系統信息高速咱們,不然將會沒有用處。使用最新的syslogd/klogd,這將更加簡單。若是系統異常並死機致使klogd沒法記錄信息到syslog文件。拷貝異常信息,稍後使用ksymoops來獲取符號信息。

    若是你能夠,嘗試鎖定問題到特定的內核版本。這將很是有用。

6. 我在老版本的內核中找到一個bug,我應該報告它嗎?

答:最好在新版本的內核上進行測試。

7. 我如何編譯內核?

答:查看 Kernel HOWTO 以得到更多信息。一樣,在 http://www.kernelnewbies.org/有不少人能夠幫助你。

    Buildkernel 能夠指導你進行編譯,包括下載須要的文件,補丁,編譯內核和模塊,安裝lot進入lilo,有選擇的構建pcmcia-cs,cipe和freeswan。下載和安裝整個tar或者rpm版本,運行下面的命令:

  1. buildkernel NEWESTSTABLE #To build the most recent stable kernel.
  2. buildkernel NEWESTBETA #To build the most recent beta kernel.
  3. buildkernel 2.4.7 #If you know the version you wish to build.

8. 我如何檢查是否內核被污染?

答:

  1. cat /proc/sys/kernel/tainted

    若是結果爲「0」表示沒有污染,不然表示被污染。

第五節 - 「誰負責」相關問題

1. 誰負責?

答:你是否指「誰維護郵件列表」或者「誰負責Linux內核」?若是是前者,是Majordomo(服務器的名字)。

2. 爲何不作一個Linux內核Team網頁,就像其餘項目同樣?

答:緣由恐怕是由於Linux沒有組。一樣的,由於全部人都對linux內核作了貢獻。最後,linux內核貢獻者都很是的低調。

3. 爲何下面不回答個人郵件?

答:由於他們太忙了。若是你天天得到1000個郵件,你會怎麼作?這不意味着粗魯。

第六節 - CPU相關問題

1. 最好的linuxCPU是什麼?

答:這裏沒有最好的CPU。選擇什麼CPU通常取決於你的價格/性能/技術需求。在x86上,咱們有Intel,AMD,Cyrix和IDT/Centaur.不少選擇。這些均可以,除了x86處理器,linux內核也能夠在68k處理器,MIPS R3000和R4000,PowerPc, ARM, Alpha和sparc處理器上運行。

    linux內核是有四個普遍傳播的版本:x86,Alpha,Sparc和Power-PC。而Alpha和Sparc版本的發展有很大的侷限性。若是你不想花費大量時間安裝和配置Linux,你最好使用x86機器。

第七節 - OS相關問題

1. xxx操做系統有一個很Nice的功能,因此它比GNU/linux強大。

答:對不起,這隻能說明xxx操做系統被設計爲擁有xxx功能,而Linux被設計爲另一種。不存在誰比誰更好。

2. 爲何linux內核沒有一個圖形化的boot界面就像xxx操做系統同樣?

答:由於它不須要。若是你想,你能夠增長這個功能。

3. CTE-variant操做系統的內核有一個很好的功能,我能把它放進linux內核嗎?

答:固然,你能夠對free軟件作任何事。可是CTE-variant好像不是一個free軟件吧。

5. 是否最新的linux版本被老的bug更多?

答:最新的bug比起老的內核版原本說沒有更多的已知bug。可是linux內核代碼在持續的增長。做爲一個規律,更多的代碼意味着更多的未知bug。

6. 爲何linux內核代碼持續增多?

答:有四個緣由:

    1)增長新的功能單元。

    2)增長新的驅動。

    3)老代碼持續的增長評論和註釋。

    4)老代碼上增長新功能。

7. 內核源碼太大,須要太長時間來下載。可否將其分解爲小的tar包?

答:內核(從2.1.110)有150萬行代碼。大約25萬行(17%)分在不一樣的目錄下,大約81萬行(54%)是針對不一樣平臺的驅動。若是你只對i386感興趣,你能夠保留23萬行代碼而刪除其餘部分。能夠節約15%的空間。核心內核代碼大約43萬行,約29%。

     若是你想去掉驅動,那麼麻煩就來了。這樣設計不是由於你下載的時間有多長,而是會給Linus以及其餘發佈內核版本的人帶來多大的工做量。對整個內核構建tar包是一個可預知工做量的工做,而將其分解爲不一樣的結構獨立的tar包就須要增長不少的工做量,並且也會帶來不少的維護問題。

     若是你真的須要一個小內核,你就應該創建一個程序來實現實現上述功能。一旦你這樣作並將其公開,就會有更多的人來欣賞你的努力。若是僅僅想內核論壇抱怨,我想linus和其餘內核開發人員會直接忽視這樣的信息。

8. linux內核基於什麼條款?

答:在linux內核根目錄,你將找到一個COPYING。這個文件就是linux內核基於的GNU基本條款。若是你還有疑問,能夠到論壇上提問。可是請別在這裏問。

9. 什麼是「bazaar」和「cathedral」?

答:這用於描述兩種不一樣的開源軟件開發冒失,首先有Eric S Raymond提出。你能夠查看他的原文:his original article

10. 爲何說linux是「World Domination」?

答:希臘式的幽默?請別當真,這只是想說有愈來愈多的人開始使用GNU/Linux。注意,開源軟件的「free」指的是自由,恰好是World Domination的相反一邊。

11. Linux內核未來的計劃是什麼?

答:這個問題應該詢問Linus。但我很懷疑,他是否有時間回答這個問題。可是,這裏有一些有待開發的東西能夠參考:

    1)支持Pnp

    2)支持SMP

    3)支持64位

    4)支持POSIX

    5)APM

12. 在boot啓動信息裏面爲什麼顯示BogoMips而不是MHz?

答:對於一些處理器,沒法找到時鐘頻率。所以內核沒法經過檢測MHz來獲取精確時間。Bogomips

能夠獲取精確的時間。能夠查看Wim van Dorst關於the BogoMips HOWTO的文章。一樣能夠查看Linux  Benchmarking HOWTO。有時候不一樣內核的BogoMips讀數會相差30%,這是因爲BogoMips 計算循環的不一樣形成。 Richard B. Johnson最近提出了一個解決該問題的新補丁。

13. 我安裝了內核x.y.z,可是卻不能工做,我該怎麼辦?

答:檢查/usr/src/linux/Documentation/Changes,確認你使用了最新的代碼。這很是重要。不少老版本的問題,在新版本已經解決。若是你使用了開發版的內核,那就注意查看Kernel list,也許已經有bug 的報告。

14. 人們討論用戶空間和內核空間,有什麼區別?

答:用戶空間是用戶程序運行的空間,使用的是虛擬的內存。X服務就在用戶空間中,shell也是。內核空間是kernel運行的地方。內核內存是不可交換的,所以應該謹慎使用。一樣,內核空間的操做也是優先級最高的。這意味着,其餘進程須要等待該操做完成纔會運行。內核的任務是提供一個安全簡單的接口控制硬件。大部分的想法都應該在用戶空間完成。惟一的例外是當功能沒法在用戶空間執行或者效率過低。這就是爲何文件系統是放在內核中的,由於內核要快得多。

15. 什麼是線程?

答:簡而言之,線程就是輕量級的進程。

16. 我能夠在linux上使用線程嗎?

答:固然,Linux內核如今能夠clone系統調用,提供了使用線程的庫。Xavier Leroy已經爲咱們提供了linuxThreads。

    若是你有一個 libc 5系統,你須要安裝linuxThreads。

    若是你是一個libc 6系統,你什麼都不用作,Glibc已經包含在裏面。

17. 是否線程在GNU/Linux實在內核空間使用的?爲什麼不混合使用內核/用戶空間?那樣不是更高效?

答:沒法肯定使用混合線程庫會給linux帶來明顯的好處。若是你看了solaris線程,他們用了一個混合的線程庫,而後就確認它是有好處的。好吧,我以solaris爲例,他們有一個很是重的內核,所以進入內核空間很是的慢。linux就相反了,有一個高效的內核。因此在用戶空間和內核空間間切換就快不少。

18. GNU/linux機器能夠作集羣嗎?

答:當不一樣的人談論集羣,他們指的是不同的東西。有人想要的是錯誤切換和負載均衡,其餘人指的是並行計算。錯誤切換和負載均衡沒法再linux中提供。固然你能夠本身實現它。

    Beowulf項目提供了一個並行計算的系統和API。

19. Linux如何支持SMP?

答:2.2內核比2.0兼容性更好,2.2版本有一個全局的內核始終,可是常常釋放,因此兩個處理器不會對全局鎖產生競爭。對於14個處理器的機器來看,linux運行的很好。比NT好。

20.  我可以對一個CPU鎖定一個線程或者進程嗎?

答:使得,做爲2.5.8版本的內核支持綁定一個進程或者線程到指定的CPU。

  1. int sched_setaffinity(pid_t pid, unsinged long len, unsigned long *mask)
  2. int sched_getaffinity(pid_t pid, unsinged long len, unsigned long *mask)

21. 在linux下線程效率如何?

答:難以置信。與基於其餘內核的應用相比,linux顯然是最快的。每一個線程只用8kib內核內存。用少於1ms的時間進行上下文切換。可是,linux時序被設計爲小數量的運行線程。最好有幾個處理器就運行幾個線程。在程序中避免使用大量的線程。大量需求在於修改linux進程調度,來適應大量線程的狀況。但這被開發社區拒絕,由於擁有大量線程是愚蠢的作法。

22. linux網絡棧如何工做?

答:最好的答案就是源碼。

23. 咱們可以將網絡棧凡在用戶空間嗎?

答:不。由於這樣的話,將會下降運行速度。有些人想檢查每一個網絡報文包,因此認爲將其放在用戶空間更簡單。但事實上,內核有一個網絡包過濾API。LSF容許你解惑一些網絡包。另一個緣由是有些人想經過這種方式,實現防火牆。在這個狀況下,有一個更好的解決方案,使用 Netfilter。這是一個內核級的網絡防火牆。你能夠建立既可靠又快速的防火牆配置。這個在2.3的開發版本中已經存在。

第八節 - 編譯相關問題

1. 我下載了最新的內核,可是沒法編譯,出什麼問題了?

答:首先檢查內核最新的補丁在: http://www.atnf.csiro.au/~rgooch/linux/docs/kernel-newsflash.html,這裏有最新的補丁。不要再這裏放編譯錯誤除非你確認過archives知道歷來沒有人提過相同的問題。通常來講,若是linus容許簡單錯誤進入內核而使linux沒法編譯,那麼應該就會在幾小時內將補丁發佈出來,固然後面幾個星期內仍然會有人不停的問爲什麼沒法編譯。請別這麼作,咱們會知道你住哪,咱們會在3點到你家敲門來問你愚蠢的問題。

      確認你用於編譯的gcc版本是最新的,binutils是最新的包,有最新的gas和ld。若是已是這樣了,嘗試不一樣的編譯器。

      Linus沒法測試每一個驅動,他只是一個自私的人。他只編譯在他機器上的版本併發布。事實上,他有時發佈出來的版本並無編譯。他很忙,讓他多休息一下,多等一天到兩天。將會有人將修正的版本發佈上去。若是這沒有發生,那你能夠嘗試本身修復,併發布補丁。請檢查是否已經有人報告過相同的問題。你能夠跟開發者溝通,可是請別浪費你們的時間。

      並不是對特定硬件的全部linux內核都被放到kernel.org。若是你是對一個非i386系統出現編譯錯誤,請檢查相關的網頁和mailing-lists看有無相應的說明。

2. 推薦使用什麼編譯器或者binutils來編譯內核?

答:看內核版本。知道2000.10.26,gcc2.7.2.3是推薦用來編譯所有內核的。以後,linus宣佈,gcc 2.9.1.66用於編譯2.4.x內核到2.4.9.gcc2.95.3推薦用於內核2.4.10以後的。

      binutils是2.9.1.0.25,不能使用的版本是2.8.1.0.25到2.9.1.0.2.這是beta版本,而且知道bug很是多。

3. 推薦使用什麼編譯器?我比較喜歡xyz-編譯器。

答:推薦的編譯器須要通過嚴格的測試並有一個穩定的表現。

4. 我能用gcc2.8.x來編譯內核嗎?最優的是什麼,我如何使用-O99?

答:固然,這是屬於你的內核。若是沒法編譯,你有權修改它。可是,沒有人會使用實驗版的編譯器來編譯一個企業級內核。企業級內核必須被推薦的編譯器編譯。使用gcc2.8編譯2.0內核不被推薦,可能會致使不可預期的內核。

對於2.1內核,常被其餘版本的編譯器編譯,可是若是你沒法使用推薦編譯器請不要抱怨,Linux開發者有不少的工做須要去作,有不少的bug須要處理。請注意,優化選項可能致使更大或者編譯更慢的內核。

5. 使用xyz編譯器編譯了內核,有以下的警告/錯誤,我應該提交bug報告嗎?

答:通常來講,使用推薦編譯器不會獲得警告/錯誤。可是少數例外:

     每一個人都期待乾淨的補丁,修補這些警告或錯誤是件好事。可是請確認你是否修復了一個真正的bug。對於非推薦編譯器這方面的修改會被忽視。

6. 爲什麼個人內核編譯停在了一個隨機的地方,同時報錯:「Internal compiler error: program cc1 caught fatal signal 11」?

答:有些時候,壞的硬件會致使上述問題。閱讀網頁:http://www.BitWizard.nl/sig11/ 

更重要的問題是random。若是它停在一個相同的地方,應該是編譯器或者內核源碼的問題。但若是停在隨機的地方,應該是硬件問題。若是出現硬件問題,你會看到不少奇怪而不一樣的錯誤。

7. 我應該使用什麼編譯標誌?

答:至少 -O2 -DMODULE -D__KERNEL__ -DLINUX -Dlinux

      我不建議若是文件夾在內核源碼樹上,使用手動方式進行編譯。其餘的makefile將不知道這些額外的模塊,而且不會重編譯它們。最好的方法,是將其加入內核的makefile系統。舉例以下:

  1. # Example Makefile for your own modules
  2. #
  3. SUB_DIRS :=
  4. MOD_SUB_DIRS := $(SUB_DIRS)
  5. ALL_SUB_DIRS := $(SUB_DIRS)
  6. M_OBJS := example-module1.o example-module2.o
  7. include $(TOPDIR)/Rules.make

    修改makefile,增長你的子目錄到父目錄的sub_dirs list。

8. 爲什麼我報錯:符號沒法處理,好比foo_ver_foo?

答:若是/proc/ksyms或者depmod -ae的輸出包含符號「foo_er_foo」,那麼你就有可能使用了不完整的makefile。最安全的修復方法就是保持你的配置,刪除全部,而後從新配置,並編譯,好比:

  1. mv .config ..
  2. make mrproper
  3. mv ../.config .
  4. make oldconfig
  5. make dep clean bzImage modules
  6. # install, boot

第九節 - 功能特性相關問題

2.  ext2fs文件最大多大?2GB?
答:在2.0.x內核中,最大的文件系統爲2GB。更大的文件只在64位機器上。

3. GGI/KGI或者圖形接口在內核空間嗎?
答:GGI/KDI信息能夠在這裏查找(here. )。GGi/KGI開發者抵制在這裏的無用爭論。

4. 我如何得到超過16個SCSI磁盤?
答:使用2.2.0或更高版本內核。

5. 什麼是devfs,爲什麼是個好想法?
答:好的,這裏我說下我本身淺薄的想法。Devfs容許驅動直接鏈接到設備文件(就是你在/dev下看到的東西)。查看 devfs FAQ 獲取更多信息。

6. linux內存管理?區域分配?

答:Rik van Riel有一個很好的網頁介紹linux內存管理:nice page

7. 你能夠打開多少文件?

答:在2.0.x內核,你能夠打開256個文件。在2.2.x你能夠打開1024。 

10. 我須要encryption和steganography。爲什麼內核中沒有?
答:注意這部分是2000/2001寫的,不少東西都發生了變化。在法國和俄國,強加密是非法的,而美國對這方面的軟件也作出了限制。

11. 爲什麼不提供刪除恢復功能?

答:這個被提了不少次。內核不須要支持這個。你能夠在用戶控件輕鬆的完成這個。能夠替代rm程序,讓他刪除文件到一個回收站,而不是真的刪除它們。這可使用libtrash, 更多的信息在: http://m-arriaga.net/software/libtrash/

12. Linux tmpfs怎麼樣?

答:2.4系列內核引入tmpfs。老得sysV共享內存代碼被新的shm文件系統替代,後者更簡單輕。若是你有一個嵌入式系統,你會發現tmpfs很是有用。

14. linux 使用了大量交換空間,這是正常的嗎?

答:不必定。linux會將長期不用的程序交換出去。這應該更高效。

第十節 - 」內核2.0.x和2.2.x變化「相關問題

1. 大小(資源和可執行文件)?

答:我使用下列方法快速測量項目的大小:

  1. cat `find . -name \*.c -o -name \*.h -o -name \*.S `| wc -l

    當我在2.0.33內核源碼上運行時,我獲得:811985(行代碼,包含評論)。當我在1.0.106內核上運行時得到1460508。這意味着linux是一個很大的軟件,須要200到500人5-10年的工做。事實上,linux內核大概7歲,有100-1000個程序員在維護它。

3. 支持新的文件系統嗎?

答:

  • NTFS (read-only). Allows read-only access to Windows NT (tm) partitions.
  • Coda. Coda is an advanced experimental distributed file system with features such as server replication and disconnected operation for laptops. Note that Coda is also available for 2.0.x kernels as an add-on package. Check theCoda Web site for more information.

4. 性能?

答:有些只在2.2x內核上纔開始使用的優化:

  • MTRRs. MTRRs are registers in PPro and Pentium II CPUs which define memory regions with distinct properties. The default mode for PCI memory accesses is "uncacheable" which means memory and I/O addresses on a PCI peripheral are not cached. For linear frame buffers, a better mode is "write-combining" which allows the CPU to re-order and slightly delay writes to memory so that they can be done in blocks. If you are writing to the PCI bus, you then use PCI burst mode transfers, which are a few times faster.
  • Finer grained locking. Most instances of the global SMP spinlock have been replaced with finer grained locking. This gives much better concurrency.
  • User buffer checks. Replaced the old, painful way of checking if user buffers passed to syscalls were legal by a kernel exception handler. The kernel now assumes a buffer is OK. If not, an exception handler catches the fault and returns -EFAULT to user space. The advantage is that legal buffers no longer need to be carefully checked, which is much faster. The old scheme was also suffering from race conditions under SMP.
  • New directory entry cache (dcache). This makes file lookups much faster. 
    Example: time find /usr -name gcc -print 
    2.1.104: cold cache: 0.180u 0.460s 0:15.02 4.2% 0+0k 0+0io 85pf+0w 
    2.1.104: warm cache: 0.100u 0.150s 0:00.25 100.0% 0+0k 0+0io 72pf+0w 
    2.0.33: cold cache: 0.100u 0.660s 0:14.87 5.1% 0+0k 0+0io 85pf+0w 
    2.0.33: warm cache: 0.090u 0.600s 0:00.69 100.0% 0+0k 0+0io 72pf+0w 

6.什麼是__initxxx宏?

答: 好比__initfunc()是一個宏用於把第一個參數變成一個ELF。

8. 爲什麼ifconfig顯示不正確的統計?

答:在內核源碼中,linux/Documentation/Changes的一段話:

  1. "For support for new features like IPv6, upgrade to the latest
  2. net-tools. This will also fix other problems. For example,
  3. the format of /proc/net/dev changed; as a result, an older ifconfig
  4. will incorrectly report errors."

9. 個人tty設備不工做,出了什麼狀況?

答:ptys使用了一個4,而linux2.1.115中取消了。若是你使用devfs,那麼問題就自動解決了。

10. 我能使用unix98 ptys嗎?

答:若是你有一個內核和libc支持,那就能夠。這在linux2.2和glibc2.1中獲得支持。

11. Capabilities?

答:有一個FAQ:ftp://ftp.guardian.no/pub/free/linux/capabilities/capfaq.txt

 

第十一節 - 文檔相關問題

1. 什麼是入門文檔,爲什麼我須要先閱讀?

答:一次又一次的看到內核list上有不少的技術爭論。有些是很是重要的,但也有不少是重複的。入門文檔有不少的鏈接到相關的討論上,這樣,在咱們開始爭論以前應該首先看看是否已經存在相同的討論。這不是爲了禁止討論,而是讓你在更專業的地方進行討論。

2. 可否有I/O接口?

答:在已有unix系統上,select和poll用來實現設備的分時處理。這有相關的文檔:primer document

3. 什麼是VFS,它如何工做?

答:VFS(虛擬文件系統或許你文件系統切換)基於linux文件系統層。採用了dentry緩存和標準的操做。這裏有你須要的文檔:VFS primer

4. 什麼是linux內核時間?

答:你能夠在這裏找到相關信息:here.

5. 是否存在/proc/scsi,這樣我能夠用它來重複掃描SCSI總線?

答:如下文字處於drivers/scsi/scsi.c :

  1. /*
  2. * Usage: echo "scsi add-single-device 0 1 2 3" >/proc/scsi/scsi
  3. * with "0 1 2 3" replaced by your "Host Channel Id Lun".
  4. * Consider this feature BETA.
  5. * CAUTION: This is not for hotplugging your peripherals. As
  6. * SCSI was not designed for this you could damage your
  7. * hardware !
  8. * However perhaps it is legal to switch on an
  9. * already connected device. It is perhaps not
  10. * guaranteed this device doesn't corrupt an ongoing data transfer.
  11. */

 

第十二節 - 編程相關問題

1. 何時使用cli()?

答:cli()是內核函數,用於禁止終端,sti用戶使能終端。有些東西必須運行在禁止終端的地方,由於一些操做須要操做順序。你應到永遠不使用cli()在一個用戶空間程序。

cli()再也不推薦使用。在單一處理器上,這用於清除內核cpuflag。在SMP系統上,保持全部處理器禁止中斷會帶來些麻煩。目前,咱們正在嘗試其餘的方法。好比,你應該設置一個鎖來描述該設備實例須要進行原子操做。而不是讓全部的CPU都不處理中斷。

2. 爲什麼有時候cli-sti成對使用,有時候save_flags-cli()-restore_flags?

答:cli-sti確保咱們可以將禁止的操做使能。而是用save_flags-cli-restore_flags用於對於速度要求高的代碼。注意,在系統上,cli和sti和restore_flags操做都很快,可是在smp系統,函數須要等待全局IRQ鎖。除了這個區別這些函數在SMP上都是安全的。調用cli屢次,全局IRQ鎖只會在第一次鎖定。

3. 當禁止中斷時我能夠調用printk嗎?

答:是的,可是你得很是當心。早版本的內核在printk中包含cli-sti對。因此,你須要在調用printk前使能中斷。

4. start_bh_atomic和end_bh_atomic()?

答:爲了保護你的代碼放置被中斷,多數用於系統調用,用戶空間的函數調用最好使用cli/sti對。

5. 獲取全局內核鎖屢次是否安全?

答:是的,全局內核鎖對於每一個進程遞歸。這意味着每一個進程能夠進行鎖定而不會死鎖。當調用unlock_kernel時鎖釋放。

6. 我何時須要初始化變量?

答:在讀取前,全部變量都須要初始化。

第十三節 - 神祕的內核消息

1. 「socket延遲銷燬」是什麼意思?

答:有時候你會在/var/log/messages看到:Jul 25 22:14:02 zero kernel: Socket destroy delayed (r=212 w=0) 這意味着內核沒法釋放已經釋放的socket內部數據結構,由於仍然有socket數據緩衝。所以,釋放和銷燬會晚些再嘗試。在某個時候緩存被釋放,操做就會成功。

2. 不一致的MTRRS我該怎麼處理?

答:有時候你會看到:

  1. mtrr: your CPUs had inconsistent ... MTRR settings
  2. mtrr: probably your BIOS does not setup all CPUs

意味着過去過去存在不一致的問題,可是如今已經處理完了。

3. 爲什麼個人內核報告中有不少「DriveStatusError Bad CRC」?

答:

  1. kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
  2. kernel: hda: dma_intr: error=0x84 { DriveStatusError BadCRC }

    在UDMA模式,每一個傳輸都使用校驗。當傳輸在校驗時失敗,它會從新嘗試並生成報告。這只是一個報告,並不是錯誤。若是這讓你心煩,能夠修改驅動,讓他別報了。

4. 爲什麼個人內核報告有不少「APIC錯誤」?

答:APIC是ia32系統硬件用於CPU之間通信來處理低等級的時間好比中斷和TLB閃存。APIC信息也是校驗的,若是失敗會重複嘗試。這個提示說明傳輸存在失敗現象。APIC校驗是很弱的,因此,若是看到該提示應該引發注意。肯定你沒有強制主板使用非法的系統時鐘頻率。你也可使用「noapic選項」來強制內核不使用APIC。這一樣強制CPU0處理所有中斷。

第十四節 - 奇怪的內核問題

1. 爲何kapmd使用如此多的CPU時間?

答:別擔憂,他不會佔用寶貴的cpu時間,他只是佔用了空閒的週期。通常來講,當你的系統是空閒的,系統idle任務纔開始運行。

2. 當鏈接網頁時,個人2.4內核報告「connection refused」,而以前版本內核工做正常?

答:2.4內核設爲來讓你的網絡生活更多彩。其中之一的方法爲使用顯示通塞通知——一個在RFC3168中定義的方法來提升TCP表現(容許路由提供網絡問題的預期警告)。不幸的是,防火牆產品存在問題,致使拒絕ECN使能的數據包。若是你本身的防火牆在這方面存在問題,你應該檢查是否存在補丁。若是你沒法鏈接的網站不在你的控制下,那麼你應該聯繫網站的維護人員,讓他們知道這個問題。你能夠在2.4內核中禁止ECN,能夠禁止CONFIG_INET_ECN選項並重編內核,也惡意執行下面的命令:

  1. # echo 0 > /proc/sys/net/ipv4/tcp_ecn

3. 爲什麼內核報告0共享內存?

答:是的,處理器仍然在共享內存,可是因爲VM在2.4中的改變,CPU變得很是緊張來計算共享內存總量。爲了繼續使用這個工具,將/proc/meminfo共享內存比變量設置爲0.

4. 爲什麼lsmod報告一些模塊的使用次數爲-1?這是個bug嗎?

答:不,這不是一個bug。一個模塊若是使用can-unload函數,將報告使用量爲-1。

5. 爲什麼內核看不到個人所有內存?

答:現代的內核(2.4)使用現代bios調用能夠檢測你所有的內存,甚至知道哪些內存是bios本身使用的。你最好的作法就是安裝最新的內核。你可使用mem=xxx啓動參數告訴內核你有多少內存,限制你的系統在64M內存下運行。好比你有128M內存,你可使用mem=128M參數,或者在系統文件/etc/lilo.conf文件中寫下該參數。

6. 我已經掛載了文件系統在不一樣的兩個地方,能夠工做嗎?

答:由於你讓內核去這樣作,因此它會正常工做。

第十五節 - 編程信仰

1.  爲什麼linux內核使用c和彙編編寫?

答:有不少緣由,其中一部分緣由:當linus開始寫linux時,他只有一個386,unix和gcc。還有一部分OS代碼使用匯編語言,由於他們對於硬件過於依賴。好比cpu和虛擬內存。

2. 爲什麼咱們用匯編不重寫Mega666處理器代碼?

答:由於咱們沒法從小路上得到太多,而重寫將會失去不少的可維護性和可讀性。gcc實際上已經很是高效。你可能指Andrew Tanenbaum的 "Structured Computer Organization"。

3. 爲什麼咱們不使用C++重寫linux代碼?

答:在咱們尚未據說Linux的時代,內核曾經由g++編譯。這持續了一段時間,知道你們抱怨表現的降低。因而又從g++改爲用C代碼來實現。這沒多大區別,可是已經這麼作了。

4. 爲什麼內核如此龐大?爲什麼咱們不重寫作一個微內核?

答:經驗證實,微內核的表現沒有龐大的內核來的好。微內核有不少設計問題。這裏有項目來把linux內核裁剪爲微內核:

  • MkLinux was funded by Apple, and runs Linux on PowerPC Macs. It is available at: http://www.mklinux.org/. An x86 version is also available. Note that there is now a native Linux kernel for the PowerPC which is much faster, and is actively maintained. MkLinux has become a historical footnote.
  • The Hurd is a microkernel-based Unix, and is supposed to be the promised GNU kernel. It sits on top of Mach3. TheDebian Project provides a full distribution for the Hurd.
  • FIASCO is another project for creating MicroKernel LINUX. See http://os.inf.tu-dresden.de/fiasco/ for details.

5. 咱們爲什麼不把goto語句替換爲C異常?

答:認可,goto很是難看,可是他們常限制在錯誤路徑並用於減小代碼量。若是替換會使得代碼量增長。因爲內核代碼須要可讀,而不是展現理論,工程準則應該優先考慮。

6. 爲什麼內核開發者輕視新技術?

答:這是一個週期性提出的質疑。通常是在某些爭論結束後提出的。一些人注意到內核開發者不喜歡新的想法,而且不會解釋緣由。這看上去確實是一種輕視,而且給出內核開發者不想學習新技術的印象。應該注意到,內核開發者是很忙的人,他們更喜歡寫代碼而不是無休止的爭論。也許這些開發者已經使用過這些技術,並以爲這些技術不適合。若是你以爲你喜歡的技術有價值就應該本身去證實。不該該要求其餘人花時間來證實你的觀點。最後,我的觀點,寫下代碼比你讀書或者聽完一個討論更有好處。

相關文章
相關標籤/搜索