linux内核指南
轉載:https://www.cnblogs.com/yangv/p/5627316.html
linux 內核郵件列表
第一節 - 一般性問題
答:在這個FAQ中,我們嘗試使用“linux”或者“linux kernel”來表示內核,而GNU/Linux用于表示整個GNU/GPL的操作系統軟件。我們需要分清:)
FAQ的目的是提供linux內核更多的信息并避免語義上的歧義。更多GNU軟件和linux關系的討論可以在http://www.gnu.org/gnu/linux-and-gnu.html獲取。看上去很多人都忽視了linux內核郵件列表是一個討論內核相關事情的論壇,而不是討論整個GNU/Linux。請不要把這方面的郵件發布出去。2.什么是實驗內核版本?
答:linux內核版本被劃分為兩個序列:試驗版(奇數序列,如1.3.xx或者2.1.x)以及企業級(如,1.2.xx, 2.0.xx)。這些實驗序列用于測試新的功能,算法,驅動。因此,試驗內核不是非常穩定,會造成系統穩定或者數據丟失。
什么是一個企業級內核?
答:企業級或者穩定內核有一個良好定義的功能集,較少的bug和已經經過測試的驅動。他們發布的次數少于實驗性質的內核。GNU/Linux正式版一般使用企業級的內核版本,而不是最新的版本。
什么是凍結特性?
答:凍結特性就是linux在內核列表上宣布不再考慮更多的功能,直到新的穩定版本發布。一般來說,這樣做后,造成的影響就是人們會在linux實際實施特性凍結前提出一大堆的新功能。
什么是代碼凍結?
答:代碼凍結比特性凍結限制的更多,這意味著,只能修正bug,這是一個很短的狀態,通常預示著新的穩定版本內核將要發布。
什么是f.g.hhprei內核?
答:中間發行版本f.g.hh。(這里解釋比如2.1.105ac4,其中f代表2,g就代表1,hh代表105,而prei就代表ac4)。
從哪里獲得最新的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來管理他們的內核源碼樹。這讓他們很方便的獲取最新代碼,而提供補丁就不一樣了。如果你希望獲取這些源碼樹的快照,下列方法可以獲得:
CVS: :pserver:anonymous@cvs.kernel.org:/home/cvs/linux-2.[45]
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.
我從哪里獲取額外的kernel補丁?
答:這有很多地方提供了內核新功能的補丁,其中一個好的源就是http://www.linuxhq.com/.
什么是補丁?
答:補丁文件(這里特指linux內核)是一個ASCII文件包含了新代碼和老代碼的區別,包含文件名和行號。補丁程序(可以使用man patch來查看)就會將補丁中涉及的修改加入當前的代碼樹。
我如何創建何時與linux內核的補丁?
答:發布這里有一些基本的守則。查看如何生成補丁,請留意下面的文字:
確認每一行的結尾沒有ctrl+M字符。為了兼容DOS,一些工具會在補丁每行后面增加一個ctrl+M。所以,請正確配置你的工具,否則,你就必須手動刪除這些字符。
在email中用簡單的文字包含補丁,不要使用基于64位的MIME。許多人可能無法閱讀你的補丁,因此你的補丁會直接被刪除。
對于大的補丁,推薦把它分成若干個部分,每個部分使用下面的描述進行注釋:
“[PATCH] cleanup of foo driver [1/5]”.
不要對每一個部分都開一個線程,應該一個一個部分的順序執行下去。詳細的可以查看Documentation/SubmittingPatches。
如果你想讓Linus或者主要維護人員中的其中一個來接受你的補丁,你必須明確的Cc:他們,否則你的補丁將被忽略。
當給Linus或者主要維護人員中的一個發送補丁時,你必須使用簡單的文字來包含補丁,不論補丁有多大。
如果你希望征求補丁的修改意見,你同樣可以將它發送給Linus/主要的維護人員。如果補丁很大,你可能會好奇如何協調代碼的沖突部分。解決方法很簡單:先發送URL,然后發送補丁。
如果你的郵箱會自動清除空白或者其他問題,請先修好你的郵箱,不要期待有其他的解決方法。
最后,我見過有人質疑上述準則,認為這些規則過于嚴格,FAQ過于熱心。幸運的是,King Penguin自己回應了這些,所以,我直接將他的話記錄如下:
如果我拿到一個補丁非簡單文本格式,除非有絕對的理由,否則我將忽略它。我甚至不會去閱讀它的內容,除非我期待發件人會給我一些特別的東西。真的,請不要發送這樣的郵件。
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”):
cd /usr/src
diff -u linux-2.1.105/drivers/net/driver_xyz.c
linux/drivers/net/driver_xyz.c > my_patch
下面兩個肯定要說:diff的兩個參數中第一個為源碼,第二個為改過的源碼。并確認你已經編譯和測試過。
當然,你需要建立兩個獨立的目錄以方便diff。這里提供一個好的技巧:
tar xzvf linux-2.1.anything.tar.gz
mv linux linux-2.1.anything.orig
cp -al linux-2.1.anything.orig linux-2.1.anything
這樣可以將每個源文件硬鏈接到一個新的目錄,因為這不復制文件所以很快。你可以對linux-2.1.anything源碼樹使用補丁,由于補丁不修改源文件只是移動他們到filename.org,所以鏈接的源文件將不會修改。
確認你的編輯器也是相同的(在修改之前,自動備份源文件)。你可以隨意的編輯硬鏈接的源碼樹。如果你的編輯器不能這樣做,你需要在修改文件前做如下備份:
cp driver_xyz.c temporary; mv temporary driver_xyz.c
你可以使用文件的屬性來提醒你這些,在工作前將可寫屬性去除。
chmod -w *.c
diff操作會很快,因為大部分的文件都不沒有修改。感謝 Janos Farkas chexum@shadow.banki.hu 。
最后,在提交前審查補丁文件,特別要說明:為什么需要這個補丁,以及到底修正了什么。
答:(來源于/usr/src/linux/README)你可以使用補丁升級版本。補丁以gzip和bzip2格式發布。安裝補丁,需要獲取比目前版本新的補丁文件,進入解壓后的源碼樹根目錄,并執行:
gzip -cd patchXX.gz | patch -p1 or:
bzip2 -dc patchXX.bz2 | patch -p1
(將所有比當前版本新的補丁都做一遍),你可以刪除所有備份文件(xxx~或者xxx.orig),請確認沒有失敗的補丁(xxx#或者xxx.rej)。如果存在,請確認是否存在操作錯誤。
此外,腳本patch-kernel 可以自動執行上述過程。它會自動判斷當前內核版本和補丁版本,使用方法為:
scripts/patch-kernel .
第一個參數為內核代碼位置,補丁默認為當前目錄,也可以使用第二個參數指定。
應用內核補丁請查看文檔(/usr/src/linux/README)“Installing the kernel”部分。同樣也可以參考 good explanation on the Linux HQ Project site.
什么是vger?
答:vger是發布LKML服務機器的名字。服務器同樣存放了大量其他linux相關郵箱。更多的信息可以在下面的網頁找到:http://vger.kernel.org/
什么是CVS樹?我如何了解關于CVS的更多信息?
答:“CVS”是版本控制系統的簡稱,是一個源碼管理系統。可以從這里獲取更多信息:CVS Bubbles page.
哪里有CVS的教程?
答:你可以從這里找到在線的教程:An interactive CVS tutorial.
了解CVS大概需要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來說更方便。
答:Alan的內核是Linus內核的測試溫床。當Linus只接受穩定的并經過嚴格測試的補丁到2.4內核時,Alan維護了一個內核補丁包含了很多新概念,新驅動,和相對多bug的補丁。如果這個補丁證明自己的穩定,Alan將他們貢獻給Linus并包含到官方的內核中去。
答:一些廠商發布的二進制模塊(比如,沒有基于free軟件許可的可用源碼的模塊)。由于源碼不是免費可用的,發生在這些模塊上的任何bug都不能被我們檢查。關于這個模塊發現的所有問題都只能返回給對應廠家,而不是內核專家,或者是linux-kernel郵件列表。污染的方案過去用來描述二進制模塊內核bug報告:這些內核被標識為污染的。如果一個被加載模塊沒有經過公認許可的認證,內核就被標識為被污染的。公認許可認證相關文字在 linux/include/linux/module.h中。
"oops"報告被表示成污染的對于內核開發者來說可以忽略。當這樣一個模塊被加載時,就會產生一個警告。注意,你可以查看一個存在兼容性許可的卻沒有MODULE_LICENSE TAG的模塊。如果你在modprobe或者insmod操作一個符合兼容性許可的模塊時發現警告,請報告這個bug到這個模塊的維護者。這樣他們就會增加需要的TAG。
答:絕對不是,一些內核開發人員包括Linus和Marcelo使用了GIT來管理內核樹,但是這絕對不意味著你必須使用GIT來維護你自己的代碼或提交補丁。許多高手仍然使用其他工具或技術來維護自己的代碼。
答:原來,Linus Torvalds維護內核。隨著內核的發展,他將老的穩定版本維護工作分攤給其他人,自己繼續開發最新的“bleeding edge”版本。在2002年5月27日,下列內核版本交給其他人維護:
2.0 David Weinehalltao@acc.umu.se
2.2 Alan Coxalan@lxorguk.ukuu.org.uk
2.4 Marcelo Tosattimtosatti@redhat.com
2.6 Linus Torvaldstorvalds@osdl.org
22. 內核編譯不了,我該怎么做?
答:首先確認你獲得了最新的代碼。也許一些分支代碼確實存在問題。不如不是,查詢是否存在補丁。不要詢問已經有人問過的問題。如果問題沒有得到修復,嘗試,自己查看代碼和給郵件列表發送補丁。你將成名。注意,clean代碼不算修復。
第二節 - 驅動相關問題
答:需要更詳細的說。請提供你特定的setup的信息(查看Qs How do I make a bug report?)同樣可以查看Q:“kernel x.y.z broken!”。
最差的方法就是重寫驅動,盡量聯系驅動的作者并報告錯誤。建設性的批評也是歡迎的。答:干的好,請嘗試找到同樣使用該設備的人讓他們測試程序。不會在沒有人使用之前將驅動放進內核。當進行測試時,訥河的開發也在繼續,你可能需要重新寫你的補丁來適應當前版本。由于整個驅動很大,我們建議將實際驅動上傳到ftp上,然后將連接發送到郵件列表,并描述你的驅動適用于什么硬件。
答:首先檢查硬件是否在啟動時識別。一般來說是這樣。然后看你是否需要進行配置比如modules.conf。第三看內核源碼中是否有文件包含卡的名字(比如你有一個邏輯總線卡,有一個buslogic.c,那么你就非常幸運)。接著,在內核代碼中尋找供應商的名字,或者卡的model號,或者最大的芯片的芯片號。例如,53C80芯片的驅動可能在源碼中叫做5380。然后檢查DejaNews,使用你在內核源碼中查找的關鍵字,有99.99%的機會找到特定的設備驅動。好了。這樣你不用打攪其他人就可以找到你需要的。如果都沒有奏效,你應該問問一些新組織,比如comp.os.linux.hardware。
答:看看/usr/src/linux/MAINTAINERS文件,這里是最權威的來源。同樣可以查看驅動源碼本身。一些驅動有自己的網頁和特定的郵件列表。如果你無法聯系上維護者,那么你就可以給郵件列表發郵件。不論如何,記住維護者一般是很忙的人,他們一般都是利用業余時間為linux工作,所以不要期待立刻的回應。一些維護者可能在短時間內得到太多的郵件以至于不可能回復全部的郵件。請諒解。
答:相當的主動!首先有一個建立:你準備好作這些了嗎?很多項目剛開始就結束了。確認你沒有做重復的工作。確認驅動不存在:請閱讀Q/A:2.3。
首先準備好你自己。下載文檔,閱讀它們。接著,獲取linux內核源碼,查找類似驅動,讀取THAT。(我一般使用最小的那個:wc -l *.c |sort -n |head -4)。好了,你可以思考一下。現在的問題是,你有硬件設備的說明嗎?你可以通過逆向工程,但有設備文檔會更簡單。在最黑暗的時候(70年代到80年代),你可以拿到所有設備的完整資料。這已經不可能了。聯系你的賣主,禮貌的詢問設備信息或廠家。嘗試聯系廠家。如果你無法拿到技術文檔,考慮放棄或者嘗試硬件的競爭對手。如果沒有放棄,好的,下一步就是找到Dos驅動。嘗試在微軟模擬器(dosemu或WINE)上運行。這允許你對工具變成來記錄I/O信息。這將給你很多IO相關的信息。祝你好運,你會用到的。答:一些人遇到了真正的麻煩。一些公司只是想知道哪些人擁有文檔,而不關心你是否編寫GPL驅動。這樣,存在一個問題:告訴他你將做的并讓他們寫下他們確實明白了你的意思。這樣,你仍然可以將驅動編寫進內核。但你不能將文檔發送給其他人。他們只能讀取源碼中的注釋。另外一些公司(比如Netscape)自己簽寫了NDA來限制他們不公開信息。這樣就不允許你來編寫驅動,并將源碼放在網上。請注意。如果有人遇到NDA,我建議不要接受。
7.我想有一個TW-234的驅動,有人愿意幫我寫一個嗎?
答:有些linux開發者愿意為了一杯啤酒來開發驅動。另外一些可能愿意免費幫你。如果你需要,你可以考慮付錢來購買或維護驅動。
答:驅動好是傳統的unix方法,用來在文件系統和設備驅動間尋址。一個驅動號是一個主號和鏡像號的組合。當前linux有8bit的主和鏡像驅動號。當你打開一個設備文件(字符或設備)內核從模塊讀取主號到一個驅動結構表中。有兩個表:一個用于字符設備,一個用于block設備,每個都有256個最大值。內核源碼中Documentation/devices.tex文件列出了所有的官方和鏡像號。H.Peter Anvin(HPA)維護了這個列表。如果你寫了一個驅動,你需要由HPA獲得主號。詳情參看:Q/A on devfs
答:問題是缺乏這個硬件的相關信息。大部分公司生產WinModems拒絕提供信息,而讓微軟操作系統來使用。最根本的問題是,他們和一般的貓不一樣;他們沒有DSP,而是讓CPU做所有事情。因此你無法像傳統貓一樣和他通訊,你需要運行貓的驅動,或者你會出現數據丟失。他們設計的并不好。
注意,一些人努力去反逆向winModems,所以如果你很幸運,就可以找到支持你設備的驅動。否則,你就應該買一個傳統的貓。注意,貓必須經過機構的認證。而WinModems,驅動軟件和硬件都需要經過認證。而這對于開源軟件驅動來說更難,因為需要花費更多的錢。所以,理論上說,修改開源驅動比較容易。實際上99.999%的用戶不知道存在驅動的源碼。如果認證是唯一的問題,那么生產廠家將會發布二進制驅動。好消息是,大部分的WinModem硬件是被支持的。壞消息是這只是冰山一角。景觀winModems可以使用,他們功能與聲卡相似。所有的功能都需要使用本地CPU。可以在這里查看更多的信息:see http://www.linmodems.org/。答:這問題不等同于是否存在足夠的CPU來浪費。而更像是,當前的Linux結構不允許這樣做。用戶程序通過中斷方式運行,任何終端都必須激發特定的中斷處理代碼來執行。因此,小的設備驅動必須存在于內核模式中。
答:這里有詳細描述不同內核版本區別的記錄。為SMP編譯的驅動不可能在一個非SMP內核中運行。同樣,不同的供應商期待加入不同的東西到他們的內核序列中,可能也會改變數據結構。因此,內核中的數據結構是不變的。任何修改二進制驅動的做法可能都會產生問題。內存變化可能會出現在i386-PAE模式。應為這些區別,一個驅動為一個內核版本編譯的結果,是不能和其他內核上工作的。如果你發布了一個二進制的驅動,你將需要針對不同的內核版本提供支持。如果你發布的驅動是源碼形式,那么提供寫好的驅動,這些驅動將跨內核版本和結構。當然,它將需要最終用戶進行編譯。版本維護人員ui提供預先編譯的驅動,大部分的用戶將不需要自己編譯驅動。
第三節 - 郵件相關問題
linux內核郵件列表用于討論linux內核本身。關于linux系統員、linux編程、linux發布的討論不受歡迎。
測試消息不受歡迎。如果你想知道是否訂閱成功,請等待若干小時,你將會受到郵件列表系統告知的郵件。你毫無疑問的會受到一連串的消息。如果你希望自己發送郵件,那么必須確保自己有重要的事情要說。當你閱讀了下面的段落,寫成一個實際的郵件,然后發送到lkml。請記住,這里有很多的訂閱者,這將需要你等待很久來獲取反饋郵件。一個小時并不長。
當給linux-內核郵件列表發送郵件時,會有很多忙的人閱讀這些消息。不管你認為自己有多重要,這里有很多比你更重要的人。重要并不是看你有多少錢,而是看你對linux內核做了多大的貢獻。
記得這些,你必須確保沒有浪費其他人的時間。
答:訂閱前請仔細考慮。你是否希望郵箱里面出現很多的郵件?你是否那么關心linux內核開發期待每周更新一次內核,忍受bug,錯誤和系統崩潰的時間和精力的浪費?你是否準備好加入偉大的企鵝,并被人稱為怪胎?也許你應該閱讀“Kernel coverage at LWN.net”在網址:http://lwn.net/Kernel/.
好了,如果你仍然期待加入,發送 “subscribe linux-kernel your_email@your_ISP” 到majordomo@vger.kernel.org (注意,不要包含雙引號字符,當然替換你自己的郵箱地址)。你將會完成訂閱。我經常看到如下的報告:
…
<<- RCPT To:edmond@cedar-republic.com
->> 550 edmond@cedar-republic.com… we do not relay
反饋這個問題到網址: http://vger.kernel.org/mxverify.html。
確認你沒有上述問題!詳見: http://vger.kernel.org/majordomo-info.html。
答:由郵件列表服務器發出的每一封郵件底部都有下面的說明:
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
答:你不是一定需要訂閱郵件。郵件地址為:linux-kernel@vger.kernel.org。你應當在你的消息中說明你的評論和回答都代表了你個人。
但是,總的來說,訂閱郵件是有好處的。我們可以知道什么是公認正確的,什么不是。別將這里作為個人的helpdesk。這是一個社區。答:
http://www.uwsg.indiana.edu/hypermail/linux/kernel/ has a search by word/subject capability.
http://marc.theaimsgroup.com/?l=linux-kernel keeps a collection of Linux related list archives.
http://lkml.org/ is another archive with latest kernels, latest messages and hottest messages tables.
http://groups.google.com/groups?hl=en&q=fa.linux.kernel&meta= is a Google interface to the fa.linux.kernel newsgroup, which is in turn fed from the mailing list.
http://gossamer-threads.com/lists/linux/kernel/ has an easy interface and an appealing format (click on a thread, shows all posts in a thread with posts clearly delimited).
5. 我如何在文件中查詢特定問題?
答:使用簡單關鍵詞特指一個東西,比如,如果你在使用網卡NIC-007時出現問題,使用“NIC-007”或者“oops NIC-007”。記住,仔細查找文件,你將找到更多的信息而不是簡單發布一個問題。
答:負擔非常重;平均每天的消息量為~400【07/2007~02/2008】.一個月就超過12000個消息。你真的不會愿意去閱讀每條消息。如果你關心郵件列表中的負擔,我建議你嘗試 digest lists,這個負擔會輕很多。這里還有一個每周的總結叫做"Kernel coverage at LWN.net" 在: http://lwn.net/Kernel/。
答:基本規則就是避免問已經問過的問題。記住,這里有個郵件列表用于內核開發的討論。如果你有什么想法或者bug需要報告,就去這里吧。如果你找到一個Clib庫或者應用的問題,這不屬于linux-kernel。
答:當使用郵件列表跟貼,在你引用前請仔細考慮。因為列表上的每個人都有原來發送的郵件,所以不要全部引用。高亮你需要表明你觀點的部分就行。確認引用的部分使用>(或者>>)。不要引用簽名,補丁,配置文件,和整個郵件。內核list已經很擁擠了。請大家注意。
注意如果你有太多的引用,你的郵件可能會在沒有閱讀的情況下被刪除。請在引用的文字后面回復,而不是在前面回復。在引用之前看到回復著實讓人看不懂。我知道有些人喜歡引用整個消息,所以他們回復在最開頭。不要這樣做。別引用全部的東西。沒人愿意看到這樣的郵件。請不要使用tab或者空格來表示引用。使用>來表示。使用空格沒有辦法區分引用和回復。浪費大家的時間。參看如何提高閱讀效率:Write for maximum efficiency of reading.不要使用太長的簽名,前們不支持超過4行80個字符。不要使用太大的附件。很多人把.config文件作為附件,這可能會超過1000行,而且還會持續增加。如果你.config的內容有需要加入郵件,那么可以將下面的結果附在郵件附件里:grep ^C .config
or
grep “=[y|m]” .config
如果你使用微軟Outlook,那么你需要使用下面的補丁:
http://home.in.tum.de/~jain/software/oe-quotefix/ for Outlook Express
http://home.in.tum.de/~jain/software/outlook-quotefix/ for Outlook
10. 郵件是否有人管理?
答:內核郵件列表無人管理。
答:技術上可行,但是我從沒有聽說有人拒絕linux內核郵件。如果你堅持這么做,那么你需要做的就是使用程序“fetchmail”,這可以反復的發送郵件到特定地址,比如linux-kernel@vger.kernel.org。如果你讓這個發生,你可以確保你的訂閱將會被刪除。
答:這里還有些規則需要注意:
注意,這是linux內核的郵件,主要為開發者服務。
只是用英語。
不要傳輸HTML格式。如果你在使用IE或者Netscape, 請關閉HTML郵件格式。
如果你使用其他OS, 確認你的郵箱不使用Charset=“Windows*”,因為這些郵件將被阻止。
如果在你上傳郵件前你被組織, 在文檔中查找答案。記住99%的問題,以前都問過。一般來說第一個問題是最完整的。
準確的詢問問題,或者聲明bug。 避免歧義。
態度誠懇些。 避免攻擊其他用戶。
不要糾纏于爭議。
一行代碼比千萬句話都管用。
批評別人的代碼很容易, 但自己寫就不那么輕松了。 如果你發現一個問題或錯誤,不要馬上寫下評論,比如"這段代碼真垃圾?"。聯系代碼的作者, 解釋問題。 以后,當你寫代碼的時候,大家都會認可你。
不要責備新人問的簡單問題。 給他們發送私人郵件說明你的觀點。
13. 我如何發送郵件?
答:你可以發送郵件到:linux-kernel@vger.kernel.org
答:郵件列表非垃圾郵件。
答:Majordomo 是一個智能郵件列表服務器。如果出了什么問題,郵件無法發送,多次嘗試后,你會自動退出訂閱。從另外一個方面說,郵件服務器出現故障也是存在的情況。如果被取消訂閱,那么請重新訂閱。也有可能因為MTA延時,導致退出訂閱。如果你的郵件路由數據是合法的就證明發生了這種情況。可以將你的地址反饋給http://vger.kernel.org/mxverify.html。
答:是的,這有一個新組織叫做:fa.linux.kernel。
答:你可以這樣做:
首先確認你的想法對于內核開發非常重要。在發送郵件前,請確認這是一個內核問題。
那么你有一個關于內核的想法。 你是否確認以前沒有人想過? 閱讀所有相關的主題。 同樣查詢 the mailing list archives 看以前是否有提出過類似的想法。
這里,你已經確認過你是第一個提出這樣想法的人。 為了更好的得到回應, 給出一個補丁 發送郵件。如果你提供代碼, 就會有人進行嘗試并給出評論。 如果你不清楚內核hacking,那么你最好現在開始學習:-) 當你提出了你的想法, 你就可以把自己稱為內核專家。
如果你沒有使用代碼實現, 只是一個想法, 并發送郵件。 盡量寫清楚, 這樣人們才能更好的了解你的想法。 如果你幸運, 有人喜歡你的想法并實現它。 如果沒有人去實現,請注意, 我們都是志愿者,每個人都有太多事情去做。
如果你的想法沒有得到好的回應, 別泄氣, 沒有一個嚴格的定義來說明什么是好的想法或壞的想法。如果有人對你說了不敬的話, 請控制你的情緒。如果有人很客氣的表達不同意你的想法,請仔細考慮你的想法。 如果別人還是沒有清楚你的想法, 請使用其他方法解釋一遍。
如果你認為你是對的,不用在乎別人的說法,你可以自己實現它! 如果你是對的,你可以笑到最后。
18. 如果郵件列表發送了不相干的郵件,我應該怎么做?
答:不理會他。
答:有些郵件列表自動增加 “回復:”幫助查看郵件。但這不是個好想法,有幾個原因,這里不想列出。可以查看如下鏈接:Reply-To: Munging Considered Harmful 。
答:當然不行,如果你想找工作,還是去這個網站吧:http://www.hotlinuxjobs.com/
答:有很多原因,比如,郵件遞送出現問題。郵件被阻塞。
第四節 - “我如何”相關問題
答:我假設你已經按照前面的要求做了補丁。現在寫一個簡短的說明來描述你的補丁,包含針對的內核版本,你的測試用例,你想要的反饋等。最好10行以內。給你的補丁和一行的ReadMe文件(描述你的名字和郵件)放在一起。在你的郵件中,寫明[PATH]<驅動名或代碼段>,kernel<內核版本>。然后發送。小的README文件保證你的補丁在網絡上傳送而不會泄漏你的名字。如果你不關心版權,那么你可以略過這些文件,直接gzip補丁文件將其放在附件中上傳。
注意,linus不閱讀linux-內核list。如果你希望他看見補丁,你就必須直接發送給他。注意,Linus喜歡在ASCII下閱讀補丁。如果你的補丁太大,你只能發送一個URL給Linus。同時注意,Linus不會回復你的郵件。答:如果異常發生,系統會將內存數據寫入/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下運行可能改變內核數據。在這兩種情況下,內核數據報告是沒有用的。
我認為自己找到了一個bug,如何進行報告?
答:一個bug和異常有明顯的不同。異常是當內核檢測到有東西出現異常。bug是事物沒有按照應該的方式運行。如果你發現了不正確的功能,你可能也有可能不遇到異常。
什么樣的信息我應該發送在bug報告?
答:他是否影響了系統安全?是否跟驅動和硬件配置有關?你是否能夠識別出相關的代碼?這都依賴于你找到的bug。
請遵守bug報告準則:記住,開發者沒有權利進入你的系統,他們也不是思想閱讀者。告訴我們內核的版本,你的硬件情況(如果你不清楚,更多的細節總是需要的)。至少,告訴我們你使用的處理器和主板,多少錢,多大的硬盤,使用什么磁盤控制器以及其他的擴展版。如果有下面這些的話會更有幫助:gcc編譯器的版本和binutils版本。嘗試找個可復制的方法來觸發問題。告訴開發者搭建一個復雜的應用環境會導致很多開發者直接刪除郵件。
總的來說,提供數據比直接給出結論更有效。如果你想在你的bug報告中給出你的猜測,我們歡迎,但是這不是具體數據的替代品。有些問題并不是看上去的那樣。硬件問題可能可能會偽裝為一個VM問題。一個設備驅動或者VM問題可能會導致文件系統差異。
如果你獲得一個異常消息,你必須把系統信息高速我們,否則將會沒有用處。使用最新的syslogd/klogd,這將更加簡單。如果系統異常并死機導致klogd無法記錄信息到syslog文件。拷貝異常信息,稍后使用ksymoops來獲取符號信息。
如果你可以,嘗試鎖定問題到特定的內核版本。這將非常有用。
我在老版本的內核中找到一個bug,我應該報告它嗎?
答:最好在新版本的內核上進行測試。
答:查看 Kernel HOWTO 以獲得更多信息。同樣,在 http://www.kernelnewbies.org/有很多人可以幫助你。
Buildkernel 可以指導你進行編譯,包括下載需要的文件,補丁,編譯內核和模塊,安裝lot進入lilo,有選擇的構建pcmcia-cs,cipe和freeswan。下載和安裝整個tar或者rpm版本,運行下面的命令:buildkernel NEWESTSTABLE #To build the most recent stable kernel.
buildkernel NEWESTBETA #To build the most recent beta kernel.
buildkernel 2.4.7 #If you know the version you wish to build.
8. 我如何檢查是否內核被污染?
答:
cat /proc/sys/kernel/tainted
如果結果為“0”表示沒有污染,否則表示被污染。
第五節 - “誰負責”相關問題
答:你是否指“誰維護郵件列表”或者“誰負責Linux內核”?如果是前者,是Majordomo(服務器的名字)。
答:原因恐怕是因為Linux沒有組。同樣的,因為所有人都對linux內核做了貢獻。最后,linux內核貢獻者都非常的低調。
答:因為他們太忙了。如果你每天獲得1000個郵件,你會怎么做?這不意味著粗魯。
第六節 - CPU相關問題
答:這里沒有最好的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相關問題
答:對不起,這只能說明xxx操作系統被設計為擁有xxx功能,而Linux被設計為另外一種。不存在誰比誰更好。
答:因為它不需要。如果你想,你可以增加這個功能。
答:當然,你可以對free軟件做任何事。但是CTE-variant好像不是一個free軟件吧。
答:最新的bug比起老的內核版本來說沒有更多的已知bug。但是linux內核代碼在持續的增加。作為一個規律,更多的代碼意味著更多的未知bug。
答:有四個原因:
1)增加新的功能單元。2)增加新的驅動。3)老代碼持續的增加評論和注釋。4)老代碼上增加新功能。答:內核(從2.1.110)有150萬行代碼。大約25萬行(17%)分在不同的目錄下,大約81萬行(54%)是針對不同平臺的驅動。如果你只對i386感興趣,你可以保留23萬行代碼而刪除其他部分。可以節約15%的空間。核心內核代碼大約43萬行,約29%。
如果你想去掉驅動,那么麻煩就來了。這樣設計不是因為你下載的時間有多長,而是會給Linus以及其他發布內核版本的人帶來多大的工作量。對整個內核構建tar包是一個可預知工作量的工作,而將其分解為不同的結構獨立的tar包就需要增加很多的工作量,而且也會帶來很多的維護問題。如果你真的需要一個小內核,你就應該建立一個程序來實現實現上述功能。一旦你這樣做并將其公開,就會有更多的人來欣賞你的努力。如果僅僅想內核論壇抱怨,我想linus和其他內核開發人員會直接忽視這樣的信息。答:在linux內核根目錄,你將找到一個COPYING。這個文件就是linux內核基于的GNU基本條款。如果你還有疑問,可以到論壇上提問。但是請別在這里問。
答:這用于描述兩種不同的開源軟件開發冒失,首先有Eric S Raymond提出。你可以查看他的原文:his original article.
答:希臘式的幽默?請別當真,這只是想說有越來越多的人開始使用GNU/Linux。注意,開源軟件的“free”指的是自由,剛好是World Domination的相反一邊。
答:這個問題應該詢問Linus。但我很懷疑,他是否有時間回答這個問題。但是,這里有一些有待開發的東西可以參考:
1)支持Pnp2)支持SMP3)支持64位4)支持POSIX5)APM答:對于一些處理器,無法找到時鐘頻率。因此內核無法通過檢測MHz來獲取精確時間。Bogomips
可以獲取精確的時間。可以查看Wim van Dorst關于the BogoMips HOWTO的文章。同樣可以查看Linux Benchmarking HOWTO。有時候不同內核的BogoMips讀數會相差30%,這是由于BogoMips 計算循環的不同造成。 Richard B. Johnson最近提出了一個解決該問題的新補丁。
答:檢查/usr/src/linux/Documentation/Changes,確認你使用了最新的代碼。這非常重要。很多老版本的問題,在新版本已經解決。如果你使用了開發版的內核,那就注意查看Kernel list,也許已經有bug 的報告。
答:用戶空間是用戶程序運行的空間,使用的是虛擬的內存。X服務就在用戶空間中,shell也是。內核空間是kernel運行的地方。內核內存是不可交換的,因此應該謹慎使用。同樣,內核空間的操作也是優先級最高的。這意味著,其他進程需要等待該操作完成才會運行。內核的任務是提供一個安全簡單的接口控制硬件。大部分的想法都應該在用戶空間完成。唯一的例外是當功能無法在用戶空間執行或者效率太低。這就是為什么文件系統是放在內核中的,因為內核要快得多。
答:簡而言之,線程就是輕量級的進程。
答:當然,Linux內核現在可以clone系統調用,提供了使用線程的庫。Xavier Leroy已經為我們提供了linuxThreads。
如果你有一個 libc 5系統,你需要安裝linuxThreads。如果你是一個libc 6系統,你什么都不用做,Glibc已經包含在里面。答:無法確定使用混合線程庫會給linux帶來明顯的好處。如果你看了solaris線程,他們用了一個混合的線程庫,然后就確認它是有好處的。好吧,我以solaris為例,他們有一個非常重的內核,因此進入內核空間非常的慢。linux就相反了,有一個高效的內核。所以在用戶空間和內核空間間切換就快很多。
答:當不同的人談論集群,他們指的是不一樣的東西。有人想要的是錯誤切換和負載均衡,其他人指的是并行計算。錯誤切換和負載均衡無法再linux中提供。當然你可以自己實現它。
Beowulf項目提供了一個并行計算的系統和API。答:2.2內核比2.0兼容性更好,2.2版本有一個全局的內核始終,但是經常釋放,所以兩個處理器不會對全局鎖產生競爭。對于14個處理器的機器來看,linux運行的很好。比NT好。
答:使得,作為2.5.8版本的內核支持綁定一個進程或者線程到指定的CPU。
int sched_setaffinity(pid_t pid, unsinged long len, unsigned long *mask)
int sched_getaffinity(pid_t pid, unsinged long len, unsigned long *mask)
21. 在linux下線程效率如何?
答:難以置信。與基于其他內核的應用相比,linux顯然是最快的。每個線程只用8kib內核內存。用少于1ms的時間進行上下文切換。但是,linux時序被設計為小數量的運行線程。最好有幾個處理器就運行幾個線程。在程序中避免使用大量的線程。大量需求在于修改linux進程調度,來適應大量線程的情況。但這被開發社區拒絕,因為擁有大量線程是愚蠢的做法。
答:最好的答案就是源碼。
答:不。因為這樣的話,將會降低運行速度。有些人想檢查每個網絡報文包,所以認為將其放在用戶空間更簡單。但事實上,內核有一個網絡包過濾API。LSF允許你解惑一些網絡包。另外一個原因是有些人想通過這種方式,實現防火墻。在這個情況下,有一個更好的解決方案,使用 Netfilter。這是一個內核級的網絡防火墻。你可以創建既可靠又快速的防火墻配置。這個在2.3的開發版本中已經存在。
第八節 - 編譯相關問題
答:首先檢查內核最新的補丁在: 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看有無相應的說明。答:看內核版本。知道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非常多。答:推薦的編譯器需要經過嚴格的測試并有一個穩定的表現。
答:當然,這是屬于你的內核。如果無法編譯,你有權修改它。但是,沒有人會使用實驗版的編譯器來編譯一個企業級內核。企業級內核必須被推薦的編譯器編譯。使用gcc2.8編譯2.0內核不被推薦,可能會導致不可預期的內核。
對于2.1內核,常被其他版本的編譯器編譯,但是如果你無法使用推薦編譯器請不要抱怨,Linux開發者有很多的工作需要去做,有很多的bug需要處理。請注意,優化選項可能導致更大或者編譯更慢的內核。
答:一般來說,使用推薦編譯器不會得到警告/錯誤。但是少數例外:
每個人都期待干凈的補丁,修補這些警告或錯誤是件好事。但是請確認你是否修復了一個真正的bug。對于非推薦編譯器這方面的修改會被忽視。答:有些時候,壞的硬件會導致上述問題。閱讀網頁:http://www.BitWizard.nl/sig11/
更重要的問題是random。如果它停在一個相同的地方,應該是編譯器或者內核源碼的問題。但如果停在隨機的地方,應該是硬件問題。如果出現硬件問題,你會看到很多奇怪而不同的錯誤。
答:至少 -O2 -DMODULE -D__KERNEL__ -DLINUX -Dlinux
我不建議如果文件夾在內核源碼樹上,使用手動方式進行編譯。其他的makefile將不知道這些額外的模塊,并且不會重編譯它們。最好的方法,是將其加入內核的makefile系統。舉例如下:Example Makefile for your own modules
SUB_DIRS :=
MOD_SUB_DIRS := $(SUB_DIRS)
ALL_SUB_DIRS := $(SUB_DIRS)
M_OBJS := example-module1.o example-module2.o
include $(TOPDIR)/Rules.make
修改makefile,增加你的子目錄到父目錄的sub_dirs list。
答:如果/proc/ksyms或者depmod -ae的輸出包含符號“foo_er_foo”,那么你就有可能使用了不完整的makefile。最安全的修復方法就是保持你的配置,刪除所有,然后重新配置,并編譯,比如:
mv .config …
make mrproper
mv …/.config .
make oldconfig
make dep clean bzImage modules
install, boot
第九節 - 功能特性相關問題
ext2fs文件最大多大?2GB?
答:在2.0.x內核中,最大的文件系統為2GB。更大的文件只在64位機器上。
GGI/KGI或者圖形接口在內核空間嗎?
答:GGI/KDI信息可以在這里查找(here. )。GGi/KGI開發者抵制在這里的無用爭論。
我如何獲得超過16個SCSI磁盤?
答:使用2.2.0或更高版本內核。
什么是devfs,為何是個好想法?
答:好的,這里我說下我自己淺薄的想法。Devfs允許驅動直接連接到設備文件(就是你在/dev下看到的東西)。查看 devfs FAQ 獲取更多信息。
linux內存管理?區域分配?
答:Rik van Riel有一個很好的網頁介紹linux內存管理:nice page
答:在2.0.x內核,你可以打開256個文件。在2.2.x你可以打開1024。
我需要encryption和steganography。為何內核中沒有?
答:注意這部分是2000/2001寫的,很多東西都發生了變化。在法國和俄國,強加密是非法的,而美國對這方面的軟件也做出了限制。
為何不提供刪除恢復功能?
答:這個被提了很多次。內核不需要支持這個。你可以在用戶控件輕松的完成這個。可以替代rm程序,讓他刪除文件到一個回收站,而不是真的刪除它們。這可以使用libtrash, 更多的信息在: http://m-arriaga.net/software/libtrash/
答:2.4系列內核引入tmpfs。老得sysV共享內存代碼被新的shm文件系統替代,后者更簡單輕。如果你有一個嵌入式系統,你會發現tmpfs非常有用。
答:不一定。linux會將長期不用的程序交換出去。這應該更高效。
第十節 - ”內核2.0.x和2.2.x變化“相關問題
答:我使用下列方法快速測量項目的大小:
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個程序員在維護它。
答:
NTFS (read-only). Allows read-only access to Windows NT ? 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。
答:在內核源碼中,linux/Documentation/Changes的一段話:
“For support for new features like IPv6, upgrade to the latest
net-tools. This will also fix other problems. For example,
the format of /proc/net/dev changed; as a result, an older ifconfig
will incorrectly report errors.”
9. 我的tty設備不工作,出了什么情況?
答:ptys使用了一個4,而linux2.1.115中取消了。如果你使用devfs,那么問題就自動解決了。
答:如果你有一個內核和libc支持,那就可以。這在linux2.2和glibc2.1中得到支持。
答:有一個FAQ:ftp://ftp.guardian.no/pub/free/linux/capabilities/capfaq.txt.
第十一節 - 文檔相關問題
答:一次又一次的看到內核list上有很多的技術爭論。有些是非常重要的,但也有很多是重復的。入門文檔有很多的連接到相關的討論上,這樣,在我們開始爭論之前應該首先看看是否已經存在相同的討論。這不是為了禁止討論,而是讓你在更專業的地方進行討論。
答:在已有unix系統上,select和poll用來實現設備的分時處理。這有相關的文檔:primer document
答:VFS(虛擬文件系統或許你文件系統切換)基于linux文件系統層。采用了dentry緩存和標準的操作。這里有你需要的文檔:VFS primer
答:你可以在這里找到相關信息:here.
答:以下文字處于drivers/scsi/scsi.c :
/*
- Usage: echo “scsi add-single-device 0 1 2 3” >/proc/scsi/scsi
- with “0 1 2 3” replaced by your “Host Channel Id Lun”.
- Consider this feature BETA.
- CAUTION: This is not for hotplugging your peripherals. As
- SCSI was not designed for this you could damage your
- hardware !
- However perhaps it is legal to switch on an
- already connected device. It is perhaps not
- guaranteed this device doesn’t corrupt an ongoing data transfer.
*/
第十二節 - 編程相關問題
答:cli()是內核函數,用于禁止終端,sti用戶使能終端。有些東西必須運行在禁止終端的地方,因為一些操作需要操作順序。你應到永遠不使用cli()在一個用戶空間程序。
cli()不再推薦使用。在單一處理器上,這用于清除內核cpuflag。在SMP系統上,保持所有處理器禁止中斷會帶來些麻煩。目前,我們正在嘗試其他的方法。比如,你應該設置一個鎖來描述該設備實例需要進行原子操作。而不是讓所有的CPU都不處理中斷。
答:cli-sti確保我們能夠將禁止的操作使能。而是用save_flags-cli-restore_flags用于對于速度要求高的代碼。注意,在系統上,cli和sti和restore_flags操作都很快,但是在smp系統,函數需要等待全局IRQ鎖。除了這個區別這些函數在SMP上都是安全的。調用cli多次,全局IRQ鎖只會在第一次鎖定。
答:是的,但是你得非常小心。早版本的內核在printk中包含cli-sti對。所以,你需要在調用printk前使能中斷。
答:為了保護你的代碼放置被中斷,多數用于系統調用,用戶空間的函數調用最好使用cli/sti對。
答:是的,全局內核鎖對于每個進程遞歸。這意味著每個進程可以進行鎖定而不會死鎖。當調用unlock_kernel時鎖釋放。
答:在讀取前,所有變量都需要初始化。
第十三節 - 神秘的內核消息
答:有時候你會在/var/log/messages看到:Jul 25 22:14:02 zero kernel: Socket destroy delayed (r=212 w=0) 這意味著內核無法釋放已經釋放的socket內部數據結構,因為仍然有socket數據緩沖。因此,釋放和銷毀會晚些再嘗試。在某個時候緩存被釋放,操作就會成功。
答:有時候你會看到:
mtrr: your CPUs had inconsistent … MTRR settings
mtrr: probably your BIOS does not setup all CPUs
這意味著過去過去存在不一致的問題,但是現在已經處理完了。
答:
kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
kernel: hda: dma_intr: error=0x84 { DriveStatusError BadCRC }
在UDMA模式,每個傳輸都使用校驗。當傳輸在校驗時失敗,它會重新嘗試并生成報告。這只是一個報告,并非錯誤。如果這讓你心煩,可以修改驅動,讓他別報了。
答:APIC是ia32系統硬件用于CPU之間通訊來處理低等級的時間比如中斷和TLB閃存。APIC信息也是校驗的,如果失敗會重復嘗試。這個提示說明傳輸存在失敗現象。APIC校驗是很弱的,所以,如果看到該提示應該引起注意。確定你沒有強制主板使用非法的系統時鐘頻率。你也可以使用“noapic選項”來強制內核不使用APIC。這同樣強制CPU0處理全部中斷。
第十四節 - 奇怪的內核問題
答:別擔心,他不會占用寶貴的cpu時間,他只是占用了空閑的周期。一般來說,當你的系統是空閑的,系統idle任務才開始運行。
答:2.4內核設為來讓你的網絡生活更多彩。其中之一的方法為使用顯示通塞通知——一個在RFC3168中定義的方法來提高TCP表現(允許路由提供網絡問題的預期警告)。不幸的是,防火墻產品存在問題,導致拒絕ECN使能的數據包。如果你自己的防火墻在這方面存在問題,你應該檢查是否存在補丁。如果你無法連接的網站不在你的控制下,那么你應該聯系網站的維護人員,讓他們知道這個問題。你可以在2.4內核中禁止ECN,可以禁止CONFIG_INET_ECN選項并重編內核,也惡意執行下面的命令:
echo 0 > /proc/sys/net/ipv4/tcp_ecn
答:是的,處理器仍然在共享內存,但是由于VM在2.4中的改變,CPU變得非常緊張來計算共享內存總量。為了繼續使用這個工具,將/proc/meminfo共享內存比變量設置為0.
答:不,這不是一個bug。一個模塊如果使用can-unload函數,將報告使用量為-1。
答:現代的內核(2.4)使用現代bios調用可以檢測你全部的內存,甚至知道哪些內存是bios自己使用的。你最好的做法就是安裝最新的內核。你可以使用mem=xxx啟動參數告訴內核你有多少內存,限制你的系統在64M內存下運行。比如你有128M內存,你可以使用mem=128M參數,或者在系統文件/etc/lilo.conf文件中寫下該參數。
答:因為你讓內核去這樣做,所以它會正常工作。
第十五節 - 編程信仰
答:有很多原因,其中一部分原因:當linus開始寫linux時,他只有一個386,unix和gcc。還有一部分OS代碼使用匯編語言,因為他們對于硬件過于依賴。比如cpu和虛擬內存。
答:因為我們無法從小路上獲得太多,而重寫將會失去很多的可維護性和可讀性。gcc實際上已經非常高效。你可能指Andrew Tanenbaum的 “Structured Computer Organization”。
答:在我們還沒有聽說Linux的時代,內核曾經由g++編譯。這持續了一段時間,知道大家抱怨表現的下降。于是又從g++改成用C代碼來實現。這沒多大區別,但是已經這么做了。
答:經驗證明,微內核的表現沒有龐大的內核來的好。微內核有很多設計問題。這里有項目來把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非常難看,但是他們常限制在錯誤路徑并用于減少代碼量。如果替換會使得代碼量增加。由于內核代碼需要可讀,而不是展示理論,工程準則應該優先考慮。
答:這是一個周期性提出的質疑。一般是在某些爭論結束后提出的。一些人注意到內核開發者不喜歡新的想法,并且不會解釋原因。這看上去確實是一種輕視,并且給出內核開發者不想學習新技術的印象。應該注意到,內核開發者是很忙的人,他們更喜歡寫代碼而不是無休止的爭論。也許這些開發者已經使用過這些技術,并覺得這些技術不適合。如果你覺得你喜歡的技術有價值就應該自己去證明。不應該要求其他人花時間來證明你的觀點。最后,個人觀點,寫下代碼比你讀書或者聽完一個討論更有好處。
總結
- 上一篇: [html] 你有了解HTML5的地理
- 下一篇: Linux桌面系统远程访问全解析