linux内核指南
轉(zhuǎn)載:https://www.cnblogs.com/yangv/p/5627316.html
linux 內(nèi)核郵件列表
第一節(jié) - 一般性問題
答:在這個FAQ中,我們嘗試使用“l(fā)inux”或者“l(fā)inux kernel”來表示內(nèi)核,而GNU/Linux用于表示整個GNU/GPL的操作系統(tǒng)軟件。我們需要分清:)
FAQ的目的是提供linux內(nèi)核更多的信息并避免語義上的歧義。更多GNU軟件和linux關(guān)系的討論可以在http://www.gnu.org/gnu/linux-and-gnu.html獲取。看上去很多人都忽視了linux內(nèi)核郵件列表是一個討論內(nèi)核相關(guān)事情的論壇,而不是討論整個GNU/Linux。請不要把這方面的郵件發(fā)布出去。2.什么是實驗內(nèi)核版本?
答:linux內(nèi)核版本被劃分為兩個序列:試驗版(奇數(shù)序列,如1.3.xx或者2.1.x)以及企業(yè)級(如,1.2.xx, 2.0.xx)。這些實驗序列用于測試新的功能,算法,驅(qū)動。因此,試驗內(nèi)核不是非常穩(wěn)定,會造成系統(tǒng)穩(wěn)定或者數(shù)據(jù)丟失。
什么是一個企業(yè)級內(nèi)核?
答:企業(yè)級或者穩(wěn)定內(nèi)核有一個良好定義的功能集,較少的bug和已經(jīng)經(jīng)過測試的驅(qū)動。他們發(fā)布的次數(shù)少于實驗性質(zhì)的內(nèi)核。GNU/Linux正式版一般使用企業(yè)級的內(nèi)核版本,而不是最新的版本。
什么是凍結(jié)特性?
答:凍結(jié)特性就是linux在內(nèi)核列表上宣布不再考慮更多的功能,直到新的穩(wěn)定版本發(fā)布。一般來說,這樣做后,造成的影響就是人們會在linux實際實施特性凍結(jié)前提出一大堆的新功能。
什么是代碼凍結(jié)?
答:代碼凍結(jié)比特性凍結(jié)限制的更多,這意味著,只能修正bug,這是一個很短的狀態(tài),通常預(yù)示著新的穩(wěn)定版本內(nèi)核將要發(fā)布。
什么是f.g.hhprei內(nèi)核?
答:中間發(fā)行版本f.g.hh。(這里解釋比如2.1.105ac4,其中f代表2,g就代表1,hh代表105,而prei就代表ac4)。
從哪里獲得最新的kernel代碼?
答:第一個推薦網(wǎng)站由 Transmeta (Linus Torvalds曾經(jīng)工作過的公司)維護,網(wǎng)址為:http://www.kernel.org/.該網(wǎng)站在全球都有鏡像。你可以通過網(wǎng)址http://www.CODE.kernel.org/ 訪問你國家的鏡像,其中“CODE”是你國家的代碼。比如“au"表示澳大利亞,所以鏡像網(wǎng)站就應(yīng)該是http://www.au.kernel.org/。
你同樣可以選擇ftp,從 ftp://ftp.CODE.kernel.org/pub/linux/kernel/ 來下載kernel。另外,著名內(nèi)核高手在people文件夾下有一些目錄,用于放置他們的內(nèi)核補丁。testing目錄是Linus存放預(yù)發(fā)行補丁的目錄。預(yù)發(fā)行補丁主要用于其他開發(fā)者,這樣他們就可以和Linus的源碼樹保持一致。這通常是測試版本,應(yīng)此經(jīng)常導(dǎo)致系統(tǒng)崩潰。請在你自己的硬盤上使用。
注意,Linus和Marcelo使用GIT來管理他們的內(nèi)核源碼樹。這讓他們很方便的獲取最新代碼,而提供補丁就不一樣了。如果你希望獲取這些源碼樹的快照,下列方法可以獲得:
CVS: :pserver:anonymous@cvs.kernel.org:/home/cvs/linux-2.[45]
Subversion: svn://svn.kernel.org/linux-2.[46]/trunk
Linux不再在BitKeeper源碼管理系統(tǒng)中維護自己的代碼,而是使用GIT。GIT是Linus編寫的,
原因是BitKeeper不在對開發(fā)者提供服務(wù)。你可以瀏覽Linus最新代碼以及其他人的項目。
這里同樣有一個關(guān)于 Overview of GIT and some helper tools 的說明和一個完整的
Tutorial來指導(dǎo)你使用GIT.
我從哪里獲取額外的kernel補丁?
答:這有很多地方提供了內(nèi)核新功能的補丁,其中一個好的源就是http://www.linuxhq.com/.
什么是補丁?
答:補丁文件(這里特指linux內(nèi)核)是一個ASCII文件包含了新代碼和老代碼的區(qū)別,包含文件名和行號。補丁程序(可以使用man patch來查看)就會將補丁中涉及的修改加入當(dāng)前的代碼樹。
我如何創(chuàng)建何時與linux內(nèi)核的補丁?
答:發(fā)布這里有一些基本的守則。查看如何生成補丁,請留意下面的文字:
確認每一行的結(jié)尾沒有ctrl+M字符。為了兼容DOS,一些工具會在補丁每行后面增加一個ctrl+M。所以,請正確配置你的工具,否則,你就必須手動刪除這些字符。
在email中用簡單的文字包含補丁,不要使用基于64位的MIME。許多人可能無法閱讀你的補丁,因此你的補丁會直接被刪除。
對于大的補丁,推薦把它分成若干個部分,每個部分使用下面的描述進行注釋:
“[PATCH] cleanup of foo driver [1/5]”.
不要對每一個部分都開一個線程,應(yīng)該一個一個部分的順序執(zhí)行下去。詳細的可以查看Documentation/SubmittingPatches。
如果你想讓Linus或者主要維護人員中的其中一個來接受你的補丁,你必須明確的Cc:他們,否則你的補丁將被忽略。
當(dāng)給Linus或者主要維護人員中的一個發(fā)送補丁時,你必須使用簡單的文字來包含補丁,不論補丁有多大。
如果你希望征求補丁的修改意見,你同樣可以將它發(fā)送給Linus/主要的維護人員。如果補丁很大,你可能會好奇如何協(xié)調(diào)代碼的沖突部分。解決方法很簡單:先發(fā)送URL,然后發(fā)送補丁。
如果你的郵箱會自動清除空白或者其他問題,請先修好你的郵箱,不要期待有其他的解決方法。
最后,我見過有人質(zhì)疑上述準(zhǔn)則,認為這些規(guī)則過于嚴(yán)格,FAQ過于熱心。幸運的是,King Penguin自己回應(yīng)了這些,所以,我直接將他的話記錄如下:
如果我拿到一個補丁非簡單文本格式,除非有絕對的理由,否則我將忽略它。我甚至不會去閱讀它的內(nèi)容,除非我期待發(fā)件人會給我一些特別的東西。真的,請不要發(fā)送這樣的郵件。
Linus
這有一個給使用Mozilla郵件客戶端的用戶的警告。Andrew Morton注意到當(dāng)補丁被包含在消息體內(nèi)時,Mozilla會損壞0列的空格。幸運的是,Mozilla 郵件以text/plain或者text/x發(fā)送補丁時正常。所以,使用附件發(fā)送補丁是安全的。
生成補丁,你需要使用diff程序(閱讀diff命令說明)。最簡單的方法完成補丁就是在/usr/src/下,建立兩個源碼樹,建立一個鏈接/usr/src/linux執(zhí)行修改過的樹,然后diff這兩個目錄,/usr/src/Documentation/CodingStyle下放了更多的信息。注意:
永遠使用統(tǒng)一的(-u)diff格式。
避免調(diào)整源碼格式而導(dǎo)致diff出現(xiàn)無用的信息。避免使用tab替代空格等行為。
除非你有特殊的原因,否則使用diff和最新的官方源碼進行比較。否則,你的補丁將被忽視。
確認你的補丁中只包含需要的修改,而不是你對源碼樹所作的全部修改。一般來說,補丁限制在個別文件或文件夾中。最好對單個文件進行diff。例如,如果我只對文件driver_xyz.c進行了修改,那么我將使用下面的命令(確認你有源碼樹名稱為“l(fā)inux-2.1.105"),而且修改后的使用鏈接“l(fā)inux”):
cd /usr/src
diff -u linux-2.1.105/drivers/net/driver_xyz.c
linux/drivers/net/driver_xyz.c > my_patch
下面兩個肯定要說:diff的兩個參數(shù)中第一個為源碼,第二個為改過的源碼。并確認你已經(jīng)編譯和測試過。
當(dāng)然,你需要建立兩個獨立的目錄以方便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
這樣可以將每個源文件硬鏈接到一個新的目錄,因為這不復(fù)制文件所以很快。你可以對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格式發(fā)布。安裝補丁,需要獲取比目前版本新的補丁文件,進入解壓后的源碼樹根目錄,并執(zhí)行:
gzip -cd patchXX.gz | patch -p1 or:
bzip2 -dc patchXX.bz2 | patch -p1
(將所有比當(dāng)前版本新的補丁都做一遍),你可以刪除所有備份文件(xxx~或者xxx.orig),請確認沒有失敗的補丁(xxx#或者xxx.rej)。如果存在,請確認是否存在操作錯誤。
此外,腳本patch-kernel 可以自動執(zhí)行上述過程。它會自動判斷當(dāng)前內(nèi)核版本和補丁版本,使用方法為:
scripts/patch-kernel .
第一個參數(shù)為內(nèi)核代碼位置,補丁默認為當(dāng)前目錄,也可以使用第二個參數(shù)指定。
應(yīng)用內(nèi)核補丁請查看文檔(/usr/src/linux/README)“Installing the kernel”部分。同樣也可以參考 good explanation on the Linux HQ Project site.
什么是vger?
答:vger是發(fā)布LKML服務(wù)機器的名字。服務(wù)器同樣存放了大量其他linux相關(guān)郵箱。更多的信息可以在下面的網(wǎng)頁找到:http://vger.kernel.org/
什么是CVS樹?我如何了解關(guān)于CVS的更多信息?
答:“CVS”是版本控制系統(tǒng)的簡稱,是一個源碼管理系統(tǒng)。可以從這里獲取更多信息:CVS Bubbles page.
哪里有CVS的教程?
答:你可以從這里找到在線的教程:An interactive CVS tutorial.
了解CVS大概需要15分鐘。
如何將補丁打入內(nèi)核?
答:根據(jù)你的補丁,有若干種方法來將補丁打入內(nèi)核。關(guān)鍵看你這部分代碼由誰維護(查看MAINTAINERS文件)。如果你的補丁只是一個小的bug修正,并且你非常肯定這是正確的操作,那么用任何方法將其發(fā)送給維護者。如果補丁非常緊急(比如一個主要的安全漏洞),那么你可以直接發(fā)郵件給Linus,但是注意,他可能會忽視一些補丁,除非對他來說是非常正確的。經(jīng)過維護者的同意,或者經(jīng)過完善的測試。假設(shè)你想知道什么是良好的測試,這里還有一點重要的說明:列表的目的是讓補丁通過別人的評審以及良好的測試。好,如果你的補丁非常大,比如重寫了一大段代碼或者一個新的驅(qū)動,為了節(jié)約帶寬和磁盤空間,請通過連接發(fā)布補丁。最后,如果你對于自己的補丁不是非常確定,需要維護者的反饋,你可以使用私人郵件。
如果你想提供補丁的部分內(nèi)核代碼沒有特定的維護者,你有3個選擇:發(fā)送郵件去linux-kernel@vger.kernel.org 并且期待有人看到并反饋給Linus,或者linus自己看到它。
發(fā)送郵件給linux內(nèi)核和cc:Linus Torvalds torvalds@osdl.org期待linus接受它。注意Linus的操作就像一個黑盒。不要期待從他那里獲得任何回信。你需要自己檢查它發(fā)布的補丁來確認他是否采用了你的補丁。如果他沒有采用你的補丁,那么你需要反復(fù)的發(fā)送郵件(多次)。如果一個星期或者一個月后當(dāng)他發(fā)布了很多補丁,卻仍然沒有采用你的內(nèi)核,那么也許你應(yīng)該放棄。看來他不喜歡這個補丁。
發(fā)送郵件到linux內(nèi)核和Cc:Alan Cox alan@redhat.com。Alan在回應(yīng)郵件方面表現(xiàn)的更好,會認真的對待你的補丁,并會定期將補丁發(fā)送給Linus。他同樣是一個好的測試人員。如果Alan接受了你的補丁,基本上Linus也會接受。如果他不喜歡你的補丁,你也會獲得一個郵件說明情況。
16. 為什么內(nèi)核tar包包含的目錄叫做linux而不是linux-x.y.z/?
答:因為Linus希望這樣。這樣使得更新補丁更方便,因為目錄不用反復(fù)的重命名,這對于Linus來說更方便。
答:Alan的內(nèi)核是Linus內(nèi)核的測試溫床。當(dāng)Linus只接受穩(wěn)定的并經(jīng)過嚴(yán)格測試的補丁到2.4內(nèi)核時,Alan維護了一個內(nèi)核補丁包含了很多新概念,新驅(qū)動,和相對多bug的補丁。如果這個補丁證明自己的穩(wěn)定,Alan將他們貢獻給Linus并包含到官方的內(nèi)核中去。
答:一些廠商發(fā)布的二進制模塊(比如,沒有基于free軟件許可的可用源碼的模塊)。由于源碼不是免費可用的,發(fā)生在這些模塊上的任何bug都不能被我們檢查。關(guān)于這個模塊發(fā)現(xiàn)的所有問題都只能返回給對應(yīng)廠家,而不是內(nèi)核專家,或者是linux-kernel郵件列表。污染的方案過去用來描述二進制模塊內(nèi)核bug報告:這些內(nèi)核被標(biāo)識為污染的。如果一個被加載模塊沒有經(jīng)過公認許可的認證,內(nèi)核就被標(biāo)識為被污染的。公認許可認證相關(guān)文字在 linux/include/linux/module.h中。
"oops"報告被表示成污染的對于內(nèi)核開發(fā)者來說可以忽略。當(dāng)這樣一個模塊被加載時,就會產(chǎn)生一個警告。注意,你可以查看一個存在兼容性許可的卻沒有MODULE_LICENSE TAG的模塊。如果你在modprobe或者insmod操作一個符合兼容性許可的模塊時發(fā)現(xiàn)警告,請報告這個bug到這個模塊的維護者。這樣他們就會增加需要的TAG。
答:絕對不是,一些內(nèi)核開發(fā)人員包括Linus和Marcelo使用了GIT來管理內(nèi)核樹,但是這絕對不意味著你必須使用GIT來維護你自己的代碼或提交補丁。許多高手仍然使用其他工具或技術(shù)來維護自己的代碼。
答:原來,Linus Torvalds維護內(nèi)核。隨著內(nèi)核的發(fā)展,他將老的穩(wěn)定版本維護工作分?jǐn)偨o其他人,自己繼續(xù)開發(fā)最新的“bleeding edge”版本。在2002年5月27日,下列內(nèi)核版本交給其他人維護:
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. 內(nèi)核編譯不了,我該怎么做?
答:首先確認你獲得了最新的代碼。也許一些分支代碼確實存在問題。不如不是,查詢是否存在補丁。不要詢問已經(jīng)有人問過的問題。如果問題沒有得到修復(fù),嘗試,自己查看代碼和給郵件列表發(fā)送補丁。你將成名。注意,clean代碼不算修復(fù)。
第二節(jié) - 驅(qū)動相關(guān)問題
答:需要更詳細的說。請?zhí)峁┠闾囟ǖ膕etup的信息(查看Qs How do I make a bug report?)同樣可以查看Q:“kernel x.y.z broken!”。
最差的方法就是重寫驅(qū)動,盡量聯(lián)系驅(qū)動的作者并報告錯誤。建設(shè)性的批評也是歡迎的。答:干的好,請嘗試找到同樣使用該設(shè)備的人讓他們測試程序。不會在沒有人使用之前將驅(qū)動放進內(nèi)核。當(dāng)進行測試時,訥河的開發(fā)也在繼續(xù),你可能需要重新寫你的補丁來適應(yīng)當(dāng)前版本。由于整個驅(qū)動很大,我們建議將實際驅(qū)動上傳到ftp上,然后將連接發(fā)送到郵件列表,并描述你的驅(qū)動適用于什么硬件。
答:首先檢查硬件是否在啟動時識別。一般來說是這樣。然后看你是否需要進行配置比如modules.conf。第三看內(nèi)核源碼中是否有文件包含卡的名字(比如你有一個邏輯總線卡,有一個buslogic.c,那么你就非常幸運)。接著,在內(nèi)核代碼中尋找供應(yīng)商的名字,或者卡的model號,或者最大的芯片的芯片號。例如,53C80芯片的驅(qū)動可能在源碼中叫做5380。然后檢查DejaNews,使用你在內(nèi)核源碼中查找的關(guān)鍵字,有99.99%的機會找到特定的設(shè)備驅(qū)動。好了。這樣你不用打攪其他人就可以找到你需要的。如果都沒有奏效,你應(yīng)該問問一些新組織,比如comp.os.linux.hardware。
答:看看/usr/src/linux/MAINTAINERS文件,這里是最權(quán)威的來源。同樣可以查看驅(qū)動源碼本身。一些驅(qū)動有自己的網(wǎng)頁和特定的郵件列表。如果你無法聯(lián)系上維護者,那么你就可以給郵件列表發(fā)郵件。不論如何,記住維護者一般是很忙的人,他們一般都是利用業(yè)余時間為linux工作,所以不要期待立刻的回應(yīng)。一些維護者可能在短時間內(nèi)得到太多的郵件以至于不可能回復(fù)全部的郵件。請諒解。
答:相當(dāng)?shù)闹鲃?#xff01;首先有一個建立:你準(zhǔn)備好作這些了嗎?很多項目剛開始就結(jié)束了。確認你沒有做重復(fù)的工作。確認驅(qū)動不存在:請閱讀Q/A:2.3。
首先準(zhǔn)備好你自己。下載文檔,閱讀它們。接著,獲取linux內(nèi)核源碼,查找類似驅(qū)動,讀取THAT。(我一般使用最小的那個:wc -l *.c |sort -n |head -4)。好了,你可以思考一下。現(xiàn)在的問題是,你有硬件設(shè)備的說明嗎?你可以通過逆向工程,但有設(shè)備文檔會更簡單。在最黑暗的時候(70年代到80年代),你可以拿到所有設(shè)備的完整資料。這已經(jīng)不可能了。聯(lián)系你的賣主,禮貌的詢問設(shè)備信息或廠家。嘗試聯(lián)系廠家。如果你無法拿到技術(shù)文檔,考慮放棄或者嘗試硬件的競爭對手。如果沒有放棄,好的,下一步就是找到Dos驅(qū)動。嘗試在微軟模擬器(dosemu或WINE)上運行。這允許你對工具變成來記錄I/O信息。這將給你很多IO相關(guān)的信息。祝你好運,你會用到的。答:一些人遇到了真正的麻煩。一些公司只是想知道哪些人擁有文檔,而不關(guān)心你是否編寫GPL驅(qū)動。這樣,存在一個問題:告訴他你將做的并讓他們寫下他們確實明白了你的意思。這樣,你仍然可以將驅(qū)動編寫進內(nèi)核。但你不能將文檔發(fā)送給其他人。他們只能讀取源碼中的注釋。另外一些公司(比如Netscape)自己簽寫了NDA來限制他們不公開信息。這樣就不允許你來編寫驅(qū)動,并將源碼放在網(wǎng)上。請注意。如果有人遇到NDA,我建議不要接受。
7.我想有一個TW-234的驅(qū)動,有人愿意幫我寫一個嗎?
答:有些linux開發(fā)者愿意為了一杯啤酒來開發(fā)驅(qū)動。另外一些可能愿意免費幫你。如果你需要,你可以考慮付錢來購買或維護驅(qū)動。
答:驅(qū)動好是傳統(tǒng)的unix方法,用來在文件系統(tǒng)和設(shè)備驅(qū)動間尋址。一個驅(qū)動號是一個主號和鏡像號的組合。當(dāng)前l(fā)inux有8bit的主和鏡像驅(qū)動號。當(dāng)你打開一個設(shè)備文件(字符或設(shè)備)內(nèi)核從模塊讀取主號到一個驅(qū)動結(jié)構(gòu)表中。有兩個表:一個用于字符設(shè)備,一個用于block設(shè)備,每個都有256個最大值。內(nèi)核源碼中Documentation/devices.tex文件列出了所有的官方和鏡像號。H.Peter Anvin(HPA)維護了這個列表。如果你寫了一個驅(qū)動,你需要由HPA獲得主號。詳情參看:Q/A on devfs
答:問題是缺乏這個硬件的相關(guān)信息。大部分公司生產(chǎn)WinModems拒絕提供信息,而讓微軟操作系統(tǒng)來使用。最根本的問題是,他們和一般的貓不一樣;他們沒有DSP,而是讓CPU做所有事情。因此你無法像傳統(tǒng)貓一樣和他通訊,你需要運行貓的驅(qū)動,或者你會出現(xiàn)數(shù)據(jù)丟失。他們設(shè)計的并不好。
注意,一些人努力去反逆向winModems,所以如果你很幸運,就可以找到支持你設(shè)備的驅(qū)動。否則,你就應(yīng)該買一個傳統(tǒng)的貓。注意,貓必須經(jīng)過機構(gòu)的認證。而WinModems,驅(qū)動軟件和硬件都需要經(jīng)過認證。而這對于開源軟件驅(qū)動來說更難,因為需要花費更多的錢。所以,理論上說,修改開源驅(qū)動比較容易。實際上99.999%的用戶不知道存在驅(qū)動的源碼。如果認證是唯一的問題,那么生產(chǎn)廠家將會發(fā)布二進制驅(qū)動。好消息是,大部分的WinModem硬件是被支持的。壞消息是這只是冰山一角。景觀winModems可以使用,他們功能與聲卡相似。所有的功能都需要使用本地CPU。可以在這里查看更多的信息:see http://www.linmodems.org/。答:這問題不等同于是否存在足夠的CPU來浪費。而更像是,當(dāng)前的Linux結(jié)構(gòu)不允許這樣做。用戶程序通過中斷方式運行,任何終端都必須激發(fā)特定的中斷處理代碼來執(zhí)行。因此,小的設(shè)備驅(qū)動必須存在于內(nèi)核模式中。
答:這里有詳細描述不同內(nèi)核版本區(qū)別的記錄。為SMP編譯的驅(qū)動不可能在一個非SMP內(nèi)核中運行。同樣,不同的供應(yīng)商期待加入不同的東西到他們的內(nèi)核序列中,可能也會改變數(shù)據(jù)結(jié)構(gòu)。因此,內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)是不變的。任何修改二進制驅(qū)動的做法可能都會產(chǎn)生問題。內(nèi)存變化可能會出現(xiàn)在i386-PAE模式。應(yīng)為這些區(qū)別,一個驅(qū)動為一個內(nèi)核版本編譯的結(jié)果,是不能和其他內(nèi)核上工作的。如果你發(fā)布了一個二進制的驅(qū)動,你將需要針對不同的內(nèi)核版本提供支持。如果你發(fā)布的驅(qū)動是源碼形式,那么提供寫好的驅(qū)動,這些驅(qū)動將跨內(nèi)核版本和結(jié)構(gòu)。當(dāng)然,它將需要最終用戶進行編譯。版本維護人員ui提供預(yù)先編譯的驅(qū)動,大部分的用戶將不需要自己編譯驅(qū)動。
第三節(jié) - 郵件相關(guān)問題
linux內(nèi)核郵件列表用于討論linux內(nèi)核本身。關(guān)于linux系統(tǒng)員、linux編程、linux發(fā)布的討論不受歡迎。
測試消息不受歡迎。如果你想知道是否訂閱成功,請等待若干小時,你將會受到郵件列表系統(tǒng)告知的郵件。你毫無疑問的會受到一連串的消息。如果你希望自己發(fā)送郵件,那么必須確保自己有重要的事情要說。當(dāng)你閱讀了下面的段落,寫成一個實際的郵件,然后發(fā)送到lkml。請記住,這里有很多的訂閱者,這將需要你等待很久來獲取反饋郵件。一個小時并不長。
當(dāng)給linux-內(nèi)核郵件列表發(fā)送郵件時,會有很多忙的人閱讀這些消息。不管你認為自己有多重要,這里有很多比你更重要的人。重要并不是看你有多少錢,而是看你對linux內(nèi)核做了多大的貢獻。
記得這些,你必須確保沒有浪費其他人的時間。
答:訂閱前請仔細考慮。你是否希望郵箱里面出現(xiàn)很多的郵件?你是否那么關(guān)心linux內(nèi)核開發(fā)期待每周更新一次內(nèi)核,忍受bug,錯誤和系統(tǒng)崩潰的時間和精力的浪費?你是否準(zhǔn)備好加入偉大的企鵝,并被人稱為怪胎?也許你應(yīng)該閱讀“Kernel coverage at LWN.net”在網(wǎng)址:http://lwn.net/Kernel/.
好了,如果你仍然期待加入,發(fā)送 “subscribe linux-kernel your_email@your_ISP” 到majordomo@vger.kernel.org (注意,不要包含雙引號字符,當(dāng)然替換你自己的郵箱地址)。你將會完成訂閱。我經(jīng)常看到如下的報告:
…
<<- RCPT To:edmond@cedar-republic.com
->> 550 edmond@cedar-republic.com… we do not relay
反饋這個問題到網(wǎng)址: http://vger.kernel.org/mxverify.html。
確認你沒有上述問題!詳見: http://vger.kernel.org/majordomo-info.html。
答:由郵件列表服務(wù)器發(fā)出的每一封郵件底部都有下面的說明:
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。你應(yīng)當(dāng)在你的消息中說明你的評論和回答都代表了你個人。
但是,總的來說,訂閱郵件是有好處的。我們可以知道什么是公認正確的,什么不是。別將這里作為個人的helpdesk。這是一個社區(qū)。答:
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. 我如何在文件中查詢特定問題?
答:使用簡單關(guān)鍵詞特指一個東西,比如,如果你在使用網(wǎng)卡NIC-007時出現(xiàn)問題,使用“NIC-007”或者“oops NIC-007”。記住,仔細查找文件,你將找到更多的信息而不是簡單發(fā)布一個問題。
答:負擔(dān)非常重;平均每天的消息量為~400【07/2007~02/2008】.一個月就超過12000個消息。你真的不會愿意去閱讀每條消息。如果你關(guān)心郵件列表中的負擔(dān),我建議你嘗試 digest lists,這個負擔(dān)會輕很多。這里還有一個每周的總結(jié)叫做"Kernel coverage at LWN.net" 在: http://lwn.net/Kernel/。
答:基本規(guī)則就是避免問已經(jīng)問過的問題。記住,這里有個郵件列表用于內(nèi)核開發(fā)的討論。如果你有什么想法或者bug需要報告,就去這里吧。如果你找到一個Clib庫或者應(yīng)用的問題,這不屬于linux-kernel。
答:當(dāng)使用郵件列表跟貼,在你引用前請仔細考慮。因為列表上的每個人都有原來發(fā)送的郵件,所以不要全部引用。高亮你需要表明你觀點的部分就行。確認引用的部分使用>(或者>>)。不要引用簽名,補丁,配置文件,和整個郵件。內(nèi)核list已經(jīng)很擁擠了。請大家注意。
注意如果你有太多的引用,你的郵件可能會在沒有閱讀的情況下被刪除。請在引用的文字后面回復(fù),而不是在前面回復(fù)。在引用之前看到回復(fù)著實讓人看不懂。我知道有些人喜歡引用整個消息,所以他們回復(fù)在最開頭。不要這樣做。別引用全部的東西。沒人愿意看到這樣的郵件。請不要使用tab或者空格來表示引用。使用>來表示。使用空格沒有辦法區(qū)分引用和回復(fù)。浪費大家的時間。參看如何提高閱讀效率:Write for maximum efficiency of reading.不要使用太長的簽名,前們不支持超過4行80個字符。不要使用太大的附件。很多人把.config文件作為附件,這可能會超過1000行,而且還會持續(xù)增加。如果你.config的內(nèi)容有需要加入郵件,那么可以將下面的結(jié)果附在郵件附件里: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. 郵件是否有人管理?
答:內(nèi)核郵件列表無人管理。
答:技術(shù)上可行,但是我從沒有聽說有人拒絕linux內(nèi)核郵件。如果你堅持這么做,那么你需要做的就是使用程序“fetchmail”,這可以反復(fù)的發(fā)送郵件到特定地址,比如linux-kernel@vger.kernel.org。如果你讓這個發(fā)生,你可以確保你的訂閱將會被刪除。
答:這里還有些規(guī)則需要注意:
注意,這是linux內(nèi)核的郵件,主要為開發(fā)者服務(wù)。
只是用英語。
不要傳輸HTML格式。如果你在使用IE或者Netscape, 請關(guān)閉HTML郵件格式。
如果你使用其他OS, 確認你的郵箱不使用Charset=“Windows*”,因為這些郵件將被阻止。
如果在你上傳郵件前你被組織, 在文檔中查找答案。記住99%的問題,以前都問過。一般來說第一個問題是最完整的。
準(zhǔn)確的詢問問題,或者聲明bug。 避免歧義。
態(tài)度誠懇些。 避免攻擊其他用戶。
不要糾纏于爭議。
一行代碼比千萬句話都管用。
批評別人的代碼很容易, 但自己寫就不那么輕松了。 如果你發(fā)現(xiàn)一個問題或錯誤,不要馬上寫下評論,比如"這段代碼真垃圾?"。聯(lián)系代碼的作者, 解釋問題。 以后,當(dāng)你寫代碼的時候,大家都會認可你。
不要責(zé)備新人問的簡單問題。 給他們發(fā)送私人郵件說明你的觀點。
13. 我如何發(fā)送郵件?
答:你可以發(fā)送郵件到:linux-kernel@vger.kernel.org
答:郵件列表非垃圾郵件。
答:Majordomo 是一個智能郵件列表服務(wù)器。如果出了什么問題,郵件無法發(fā)送,多次嘗試后,你會自動退出訂閱。從另外一個方面說,郵件服務(wù)器出現(xiàn)故障也是存在的情況。如果被取消訂閱,那么請重新訂閱。也有可能因為MTA延時,導(dǎo)致退出訂閱。如果你的郵件路由數(shù)據(jù)是合法的就證明發(fā)生了這種情況。可以將你的地址反饋給http://vger.kernel.org/mxverify.html。
答:是的,這有一個新組織叫做:fa.linux.kernel。
答:你可以這樣做:
首先確認你的想法對于內(nèi)核開發(fā)非常重要。在發(fā)送郵件前,請確認這是一個內(nèi)核問題。
那么你有一個關(guān)于內(nèi)核的想法。 你是否確認以前沒有人想過? 閱讀所有相關(guān)的主題。 同樣查詢 the mailing list archives 看以前是否有提出過類似的想法。
這里,你已經(jīng)確認過你是第一個提出這樣想法的人。 為了更好的得到回應(yīng), 給出一個補丁 發(fā)送郵件。如果你提供代碼, 就會有人進行嘗試并給出評論。 如果你不清楚內(nèi)核hacking,那么你最好現(xiàn)在開始學(xué)習(xí):-) 當(dāng)你提出了你的想法, 你就可以把自己稱為內(nèi)核專家。
如果你沒有使用代碼實現(xiàn), 只是一個想法, 并發(fā)送郵件。 盡量寫清楚, 這樣人們才能更好的了解你的想法。 如果你幸運, 有人喜歡你的想法并實現(xiàn)它。 如果沒有人去實現(xiàn),請注意, 我們都是志愿者,每個人都有太多事情去做。
如果你的想法沒有得到好的回應(yīng), 別泄氣, 沒有一個嚴(yán)格的定義來說明什么是好的想法或壞的想法。如果有人對你說了不敬的話, 請控制你的情緒。如果有人很客氣的表達不同意你的想法,請仔細考慮你的想法。 如果別人還是沒有清楚你的想法, 請使用其他方法解釋一遍。
如果你認為你是對的,不用在乎別人的說法,你可以自己實現(xiàn)它! 如果你是對的,你可以笑到最后。
18. 如果郵件列表發(fā)送了不相干的郵件,我應(yīng)該怎么做?
答:不理會他。
答:有些郵件列表自動增加 “回復(fù):”幫助查看郵件。但這不是個好想法,有幾個原因,這里不想列出。可以查看如下鏈接:Reply-To: Munging Considered Harmful 。
答:當(dāng)然不行,如果你想找工作,還是去這個網(wǎng)站吧:http://www.hotlinuxjobs.com/
答:有很多原因,比如,郵件遞送出現(xiàn)問題。郵件被阻塞。
第四節(jié) - “我如何”相關(guān)問題
答:我假設(shè)你已經(jīng)按照前面的要求做了補丁。現(xiàn)在寫一個簡短的說明來描述你的補丁,包含針對的內(nèi)核版本,你的測試用例,你想要的反饋等。最好10行以內(nèi)。給你的補丁和一行的ReadMe文件(描述你的名字和郵件)放在一起。在你的郵件中,寫明[PATH]<驅(qū)動名或代碼段>,kernel<內(nèi)核版本>。然后發(fā)送。小的README文件保證你的補丁在網(wǎng)絡(luò)上傳送而不會泄漏你的名字。如果你不關(guān)心版權(quán),那么你可以略過這些文件,直接gzip補丁文件將其放在附件中上傳。
注意,linus不閱讀linux-內(nèi)核list。如果你希望他看見補丁,你就必須直接發(fā)送給他。注意,Linus喜歡在ASCII下閱讀補丁。如果你的補丁太大,你只能發(fā)送一個URL給Linus。同時注意,Linus不會回復(fù)你的郵件。答:如果異常發(fā)生,系統(tǒng)會將內(nèi)存數(shù)據(jù)寫入/proc/kmsg文件。你可以使用dmesg命令打印其內(nèi)容。但是klogd和syslogd會自動的捕捉異常并寫入日志文件。
有些時候,異常導(dǎo)致內(nèi)核崩潰。出現(xiàn)這種情況時,所有功能都死掉了,此時,異常無法寫入日志文件。在全面的崩潰情況下,你有三種對策:手動抄寫異常文字。
你可以預(yù)先安裝終端鏈接(read linux/Documentation/serial-console.txt)那么你也可以遠程記錄問題。
從2.3.10開始,你就可以使用串口打印機作為終端。可以打印屏幕信息。
還有補丁可以使用硬件記錄linux內(nèi)核日志。
3. 我如何發(fā)送一個異常?
答:假設(shè)已經(jīng)發(fā)現(xiàn)了一個異常,你應(yīng)該將相關(guān)的系統(tǒng)日志、內(nèi)核配置文件、內(nèi)核符號map以及你的硬件和環(huán)境描述。該異常是特殊的函數(shù)造成的?他是否發(fā)生在你硬件配置修改?不要在你查看linux/Documentation/oops-tracing.txt文件、linux/scripts/ksymoops的README前,發(fā)送異常報告。這些文檔描述了內(nèi)核異常的基本原理。好的跟蹤信息使得解決問題更方便。如果沒有運行ksymoops將內(nèi)核緩存形成文件,請不要發(fā)送異常報告。報告將被忽略因為沒有提供任何有價值的信息。確認,你拷貝了正確的system.map文件到/boot文件夾,否則你無法獲取正確的結(jié)果。
下列情況會使得內(nèi)核異常無法處理。最典型的兩個就是如果你的CPUoverclock,或者在VMWARE下運行。原因是overclock可能造成隨機bit錯誤,而VMWARE下運行可能改變內(nèi)核數(shù)據(jù)。在這兩種情況下,內(nèi)核數(shù)據(jù)報告是沒有用的。
我認為自己找到了一個bug,如何進行報告?
答:一個bug和異常有明顯的不同。異常是當(dāng)內(nèi)核檢測到有東西出現(xiàn)異常。bug是事物沒有按照應(yīng)該的方式運行。如果你發(fā)現(xiàn)了不正確的功能,你可能也有可能不遇到異常。
什么樣的信息我應(yīng)該發(fā)送在bug報告?
答:他是否影響了系統(tǒng)安全?是否跟驅(qū)動和硬件配置有關(guān)?你是否能夠識別出相關(guān)的代碼?這都依賴于你找到的bug。
請遵守bug報告準(zhǔn)則:記住,開發(fā)者沒有權(quán)利進入你的系統(tǒng),他們也不是思想閱讀者。告訴我們內(nèi)核的版本,你的硬件情況(如果你不清楚,更多的細節(jié)總是需要的)。至少,告訴我們你使用的處理器和主板,多少錢,多大的硬盤,使用什么磁盤控制器以及其他的擴展版。如果有下面這些的話會更有幫助:gcc編譯器的版本和binutils版本。嘗試找個可復(fù)制的方法來觸發(fā)問題。告訴開發(fā)者搭建一個復(fù)雜的應(yīng)用環(huán)境會導(dǎo)致很多開發(fā)者直接刪除郵件。
總的來說,提供數(shù)據(jù)比直接給出結(jié)論更有效。如果你想在你的bug報告中給出你的猜測,我們歡迎,但是這不是具體數(shù)據(jù)的替代品。有些問題并不是看上去的那樣。硬件問題可能可能會偽裝為一個VM問題。一個設(shè)備驅(qū)動或者VM問題可能會導(dǎo)致文件系統(tǒng)差異。
如果你獲得一個異常消息,你必須把系統(tǒng)信息高速我們,否則將會沒有用處。使用最新的syslogd/klogd,這將更加簡單。如果系統(tǒng)異常并死機導(dǎo)致klogd無法記錄信息到syslog文件。拷貝異常信息,稍后使用ksymoops來獲取符號信息。
如果你可以,嘗試鎖定問題到特定的內(nèi)核版本。這將非常有用。
我在老版本的內(nèi)核中找到一個bug,我應(yīng)該報告它嗎?
答:最好在新版本的內(nèi)核上進行測試。
答:查看 Kernel HOWTO 以獲得更多信息。同樣,在 http://www.kernelnewbies.org/有很多人可以幫助你。
Buildkernel 可以指導(dǎo)你進行編譯,包括下載需要的文件,補丁,編譯內(nèi)核和模塊,安裝lot進入lilo,有選擇的構(gòu)建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. 我如何檢查是否內(nèi)核被污染?
答:
cat /proc/sys/kernel/tainted
如果結(jié)果為“0”表示沒有污染,否則表示被污染。
第五節(jié) - “誰負責(zé)”相關(guān)問題
答:你是否指“誰維護郵件列表”或者“誰負責(zé)Linux內(nèi)核”?如果是前者,是Majordomo(服務(wù)器的名字)。
答:原因恐怕是因為Linux沒有組。同樣的,因為所有人都對linux內(nèi)核做了貢獻。最后,linux內(nèi)核貢獻者都非常的低調(diào)。
答:因為他們太忙了。如果你每天獲得1000個郵件,你會怎么做?這不意味著粗魯。
第六節(jié) - CPU相關(guān)問題
答:這里沒有最好的CPU。選擇什么CPU一般取決于你的價格/性能/技術(shù)需求。在x86上,我們有Intel,AMD,Cyrix和IDT/Centaur.很多選擇。這些都可以,除了x86處理器,linux內(nèi)核也可以在68k處理器,MIPS R3000和R4000,PowerPc, ARM, Alpha和sparc處理器上運行。
linux內(nèi)核是有四個廣泛傳播的版本:x86,Alpha,Sparc和Power-PC。而Alpha和Sparc版本的發(fā)展有很大的局限性。如果你不想花費大量時間安裝和配置Linux,你最好使用x86機器。第七節(jié) - OS相關(guān)問題
答:對不起,這只能說明xxx操作系統(tǒng)被設(shè)計為擁有xxx功能,而Linux被設(shè)計為另外一種。不存在誰比誰更好。
答:因為它不需要。如果你想,你可以增加這個功能。
答:當(dāng)然,你可以對free軟件做任何事。但是CTE-variant好像不是一個free軟件吧。
答:最新的bug比起老的內(nèi)核版本來說沒有更多的已知bug。但是linux內(nèi)核代碼在持續(xù)的增加。作為一個規(guī)律,更多的代碼意味著更多的未知bug。
答:有四個原因:
1)增加新的功能單元。2)增加新的驅(qū)動。3)老代碼持續(xù)的增加評論和注釋。4)老代碼上增加新功能。答:內(nèi)核(從2.1.110)有150萬行代碼。大約25萬行(17%)分在不同的目錄下,大約81萬行(54%)是針對不同平臺的驅(qū)動。如果你只對i386感興趣,你可以保留23萬行代碼而刪除其他部分。可以節(jié)約15%的空間。核心內(nèi)核代碼大約43萬行,約29%。
如果你想去掉驅(qū)動,那么麻煩就來了。這樣設(shè)計不是因為你下載的時間有多長,而是會給Linus以及其他發(fā)布內(nèi)核版本的人帶來多大的工作量。對整個內(nèi)核構(gòu)建tar包是一個可預(yù)知工作量的工作,而將其分解為不同的結(jié)構(gòu)獨立的tar包就需要增加很多的工作量,而且也會帶來很多的維護問題。如果你真的需要一個小內(nèi)核,你就應(yīng)該建立一個程序來實現(xiàn)實現(xiàn)上述功能。一旦你這樣做并將其公開,就會有更多的人來欣賞你的努力。如果僅僅想內(nèi)核論壇抱怨,我想linus和其他內(nèi)核開發(fā)人員會直接忽視這樣的信息。答:在linux內(nèi)核根目錄,你將找到一個COPYING。這個文件就是linux內(nèi)核基于的GNU基本條款。如果你還有疑問,可以到論壇上提問。但是請別在這里問。
答:這用于描述兩種不同的開源軟件開發(fā)冒失,首先有Eric S Raymond提出。你可以查看他的原文:his original article.
答:希臘式的幽默?請別當(dāng)真,這只是想說有越來越多的人開始使用GNU/Linux。注意,開源軟件的“free”指的是自由,剛好是World Domination的相反一邊。
答:這個問題應(yīng)該詢問Linus。但我很懷疑,他是否有時間回答這個問題。但是,這里有一些有待開發(fā)的東西可以參考:
1)支持Pnp2)支持SMP3)支持64位4)支持POSIX5)APM答:對于一些處理器,無法找到時鐘頻率。因此內(nèi)核無法通過檢測MHz來獲取精確時間。Bogomips
可以獲取精確的時間。可以查看Wim van Dorst關(guān)于the BogoMips HOWTO的文章。同樣可以查看Linux Benchmarking HOWTO。有時候不同內(nèi)核的BogoMips讀數(shù)會相差30%,這是由于BogoMips 計算循環(huán)的不同造成。 Richard B. Johnson最近提出了一個解決該問題的新補丁。
答:檢查/usr/src/linux/Documentation/Changes,確認你使用了最新的代碼。這非常重要。很多老版本的問題,在新版本已經(jīng)解決。如果你使用了開發(fā)版的內(nèi)核,那就注意查看Kernel list,也許已經(jīng)有bug 的報告。
答:用戶空間是用戶程序運行的空間,使用的是虛擬的內(nèi)存。X服務(wù)就在用戶空間中,shell也是。內(nèi)核空間是kernel運行的地方。內(nèi)核內(nèi)存是不可交換的,因此應(yīng)該謹(jǐn)慎使用。同樣,內(nèi)核空間的操作也是優(yōu)先級最高的。這意味著,其他進程需要等待該操作完成才會運行。內(nèi)核的任務(wù)是提供一個安全簡單的接口控制硬件。大部分的想法都應(yīng)該在用戶空間完成。唯一的例外是當(dāng)功能無法在用戶空間執(zhí)行或者效率太低。這就是為什么文件系統(tǒng)是放在內(nèi)核中的,因為內(nèi)核要快得多。
答:簡而言之,線程就是輕量級的進程。
答:當(dāng)然,Linux內(nèi)核現(xiàn)在可以clone系統(tǒng)調(diào)用,提供了使用線程的庫。Xavier Leroy已經(jīng)為我們提供了linuxThreads。
如果你有一個 libc 5系統(tǒng),你需要安裝linuxThreads。如果你是一個libc 6系統(tǒng),你什么都不用做,Glibc已經(jīng)包含在里面。答:無法確定使用混合線程庫會給linux帶來明顯的好處。如果你看了solaris線程,他們用了一個混合的線程庫,然后就確認它是有好處的。好吧,我以solaris為例,他們有一個非常重的內(nèi)核,因此進入內(nèi)核空間非常的慢。linux就相反了,有一個高效的內(nèi)核。所以在用戶空間和內(nèi)核空間間切換就快很多。
答:當(dāng)不同的人談?wù)摷?#xff0c;他們指的是不一樣的東西。有人想要的是錯誤切換和負載均衡,其他人指的是并行計算。錯誤切換和負載均衡無法再linux中提供。當(dāng)然你可以自己實現(xiàn)它。
Beowulf項目提供了一個并行計算的系統(tǒng)和API。答:2.2內(nèi)核比2.0兼容性更好,2.2版本有一個全局的內(nèi)核始終,但是經(jīng)常釋放,所以兩個處理器不會對全局鎖產(chǎn)生競爭。對于14個處理器的機器來看,linux運行的很好。比NT好。
答:使得,作為2.5.8版本的內(nèi)核支持綁定一個進程或者線程到指定的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下線程效率如何?
答:難以置信。與基于其他內(nèi)核的應(yīng)用相比,linux顯然是最快的。每個線程只用8kib內(nèi)核內(nèi)存。用少于1ms的時間進行上下文切換。但是,linux時序被設(shè)計為小數(shù)量的運行線程。最好有幾個處理器就運行幾個線程。在程序中避免使用大量的線程。大量需求在于修改linux進程調(diào)度,來適應(yīng)大量線程的情況。但這被開發(fā)社區(qū)拒絕,因為擁有大量線程是愚蠢的做法。
答:最好的答案就是源碼。
答:不。因為這樣的話,將會降低運行速度。有些人想檢查每個網(wǎng)絡(luò)報文包,所以認為將其放在用戶空間更簡單。但事實上,內(nèi)核有一個網(wǎng)絡(luò)包過濾API。LSF允許你解惑一些網(wǎng)絡(luò)包。另外一個原因是有些人想通過這種方式,實現(xiàn)防火墻。在這個情況下,有一個更好的解決方案,使用 Netfilter。這是一個內(nèi)核級的網(wǎng)絡(luò)防火墻。你可以創(chuàng)建既可靠又快速的防火墻配置。這個在2.3的開發(fā)版本中已經(jīng)存在。
第八節(jié) - 編譯相關(guān)問題
答:首先檢查內(nèi)核最新的補丁在: http://www.atnf.csiro.au/~rgooch/linux/docs/kernel-newsflash.html,這里有最新的補丁。不要再這里放編譯錯誤除非你確認過archives知道從來沒有人提過相同的問題。一般來說,如果linus允許簡單錯誤進入內(nèi)核而使linux無法編譯,那么應(yīng)該就會在幾小時內(nèi)將補丁發(fā)布出來,當(dāng)然后面幾個星期內(nèi)仍然會有人不停的問為何無法編譯。請別這么做,我們會知道你住哪,我們會在3點到你家敲門來問你愚蠢的問題。
確認你用于編譯的gcc版本是最新的,binutils是最新的包,有最新的gas和ld。如果已經(jīng)是這樣了,嘗試不同的編譯器。Linus無法測試每個驅(qū)動,他只是一個自私的人。他只編譯在他機器上的版本并發(fā)布。事實上,他有時發(fā)布出來的版本并沒有編譯。他很忙,讓他多休息一下,多等一天到兩天。將會有人將修正的版本發(fā)布上去。如果這沒有發(fā)生,那你可以嘗試自己修復(fù),并發(fā)布補丁。請檢查是否已經(jīng)有人報告過相同的問題。你可以跟開發(fā)者溝通,但是請別浪費大家的時間。并非對特定硬件的所有l(wèi)inux內(nèi)核都被放到kernel.org。如果你是對一個非i386系統(tǒng)出現(xiàn)編譯錯誤,請檢查相關(guān)的網(wǎng)頁和mailing-lists看有無相應(yīng)的說明。答:看內(nèi)核版本。知道2000.10.26,gcc2.7.2.3是推薦用來編譯全部內(nèi)核的。之后,linus宣布,gcc 2.9.1.66用于編譯2.4.x內(nèi)核到2.4.9.gcc2.95.3推薦用于內(nèi)核2.4.10之后的。
binutils是2.9.1.0.25,不能使用的版本是2.8.1.0.25到2.9.1.0.2.這是beta版本,并且知道bug非常多。答:推薦的編譯器需要經(jīng)過嚴(yán)格的測試并有一個穩(wěn)定的表現(xiàn)。
答:當(dāng)然,這是屬于你的內(nèi)核。如果無法編譯,你有權(quán)修改它。但是,沒有人會使用實驗版的編譯器來編譯一個企業(yè)級內(nèi)核。企業(yè)級內(nèi)核必須被推薦的編譯器編譯。使用gcc2.8編譯2.0內(nèi)核不被推薦,可能會導(dǎo)致不可預(yù)期的內(nèi)核。
對于2.1內(nèi)核,常被其他版本的編譯器編譯,但是如果你無法使用推薦編譯器請不要抱怨,Linux開發(fā)者有很多的工作需要去做,有很多的bug需要處理。請注意,優(yōu)化選項可能導(dǎo)致更大或者編譯更慢的內(nèi)核。
答:一般來說,使用推薦編譯器不會得到警告/錯誤。但是少數(shù)例外:
每個人都期待干凈的補丁,修補這些警告或錯誤是件好事。但是請確認你是否修復(fù)了一個真正的bug。對于非推薦編譯器這方面的修改會被忽視。答:有些時候,壞的硬件會導(dǎo)致上述問題。閱讀網(wǎng)頁:http://www.BitWizard.nl/sig11/
更重要的問題是random。如果它停在一個相同的地方,應(yīng)該是編譯器或者內(nèi)核源碼的問題。但如果停在隨機的地方,應(yīng)該是硬件問題。如果出現(xiàn)硬件問題,你會看到很多奇怪而不同的錯誤。
答:至少 -O2 -DMODULE -D__KERNEL__ -DLINUX -Dlinux
我不建議如果文件夾在內(nèi)核源碼樹上,使用手動方式進行編譯。其他的makefile將不知道這些額外的模塊,并且不會重編譯它們。最好的方法,是將其加入內(nèi)核的makefile系統(tǒng)。舉例如下: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。最安全的修復(fù)方法就是保持你的配置,刪除所有,然后重新配置,并編譯,比如:
mv .config …
make mrproper
mv …/.config .
make oldconfig
make dep clean bzImage modules
install, boot
第九節(jié) - 功能特性相關(guān)問題
ext2fs文件最大多大?2GB?
答:在2.0.x內(nèi)核中,最大的文件系統(tǒng)為2GB。更大的文件只在64位機器上。
GGI/KGI或者圖形接口在內(nèi)核空間嗎?
答:GGI/KDI信息可以在這里查找(here. )。GGi/KGI開發(fā)者抵制在這里的無用爭論。
我如何獲得超過16個SCSI磁盤?
答:使用2.2.0或更高版本內(nèi)核。
什么是devfs,為何是個好想法?
答:好的,這里我說下我自己淺薄的想法。Devfs允許驅(qū)動直接連接到設(shè)備文件(就是你在/dev下看到的東西)。查看 devfs FAQ 獲取更多信息。
linux內(nèi)存管理?區(qū)域分配?
答:Rik van Riel有一個很好的網(wǎng)頁介紹linux內(nèi)存管理:nice page
答:在2.0.x內(nèi)核,你可以打開256個文件。在2.2.x你可以打開1024。
我需要encryption和steganography。為何內(nèi)核中沒有?
答:注意這部分是2000/2001寫的,很多東西都發(fā)生了變化。在法國和俄國,強加密是非法的,而美國對這方面的軟件也做出了限制。
為何不提供刪除恢復(fù)功能?
答:這個被提了很多次。內(nèi)核不需要支持這個。你可以在用戶控件輕松的完成這個。可以替代rm程序,讓他刪除文件到一個回收站,而不是真的刪除它們。這可以使用libtrash, 更多的信息在: http://m-arriaga.net/software/libtrash/
答:2.4系列內(nèi)核引入tmpfs。老得sysV共享內(nèi)存代碼被新的shm文件系統(tǒng)替代,后者更簡單輕。如果你有一個嵌入式系統(tǒng),你會發(fā)現(xiàn)tmpfs非常有用。
答:不一定。linux會將長期不用的程序交換出去。這應(yīng)該更高效。
第十節(jié) - ”內(nèi)核2.0.x和2.2.x變化“相關(guān)問題
答:我使用下列方法快速測量項目的大小:
cat find . -name \*.c -o -name \*.h -o -name \*.S| wc -l
當(dāng)我在2.0.33內(nèi)核源碼上運行時,我得到:811985(行代碼,包含評論)。當(dāng)我在1.0.106內(nèi)核上運行時獲得1460508。這意味著linux是一個很大的軟件,需要200到500人5-10年的工作。事實上,linux內(nèi)核大概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內(nèi)核上才開始使用的優(yōu)化:
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()是一個宏用于把第一個參數(shù)變成一個ELF。
答:在內(nèi)核源碼中,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設(shè)備不工作,出了什么情況?
答:ptys使用了一個4,而linux2.1.115中取消了。如果你使用devfs,那么問題就自動解決了。
答:如果你有一個內(nèi)核和libc支持,那就可以。這在linux2.2和glibc2.1中得到支持。
答:有一個FAQ:ftp://ftp.guardian.no/pub/free/linux/capabilities/capfaq.txt.
第十一節(jié) - 文檔相關(guān)問題
答:一次又一次的看到內(nèi)核list上有很多的技術(shù)爭論。有些是非常重要的,但也有很多是重復(fù)的。入門文檔有很多的連接到相關(guān)的討論上,這樣,在我們開始爭論之前應(yīng)該首先看看是否已經(jīng)存在相同的討論。這不是為了禁止討論,而是讓你在更專業(yè)的地方進行討論。
答:在已有unix系統(tǒng)上,select和poll用來實現(xiàn)設(shè)備的分時處理。這有相關(guān)的文檔:primer document
答:VFS(虛擬文件系統(tǒng)或許你文件系統(tǒng)切換)基于linux文件系統(tǒng)層。采用了dentry緩存和標(biāo)準(zhǔn)的操作。這里有你需要的文檔:VFS primer
答:你可以在這里找到相關(guān)信息: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.
*/
第十二節(jié) - 編程相關(guān)問題
答:cli()是內(nèi)核函數(shù),用于禁止終端,sti用戶使能終端。有些東西必須運行在禁止終端的地方,因為一些操作需要操作順序。你應(yīng)到永遠不使用cli()在一個用戶空間程序。
cli()不再推薦使用。在單一處理器上,這用于清除內(nèi)核cpuflag。在SMP系統(tǒng)上,保持所有處理器禁止中斷會帶來些麻煩。目前,我們正在嘗試其他的方法。比如,你應(yīng)該設(shè)置一個鎖來描述該設(shè)備實例需要進行原子操作。而不是讓所有的CPU都不處理中斷。
答:cli-sti確保我們能夠?qū)⒔沟牟僮魇鼓堋6怯胹ave_flags-cli-restore_flags用于對于速度要求高的代碼。注意,在系統(tǒng)上,cli和sti和restore_flags操作都很快,但是在smp系統(tǒng),函數(shù)需要等待全局IRQ鎖。除了這個區(qū)別這些函數(shù)在SMP上都是安全的。調(diào)用cli多次,全局IRQ鎖只會在第一次鎖定。
答:是的,但是你得非常小心。早版本的內(nèi)核在printk中包含cli-sti對。所以,你需要在調(diào)用printk前使能中斷。
答:為了保護你的代碼放置被中斷,多數(shù)用于系統(tǒng)調(diào)用,用戶空間的函數(shù)調(diào)用最好使用cli/sti對。
答:是的,全局內(nèi)核鎖對于每個進程遞歸。這意味著每個進程可以進行鎖定而不會死鎖。當(dāng)調(diào)用unlock_kernel時鎖釋放。
答:在讀取前,所有變量都需要初始化。
第十三節(jié) - 神秘的內(nèi)核消息
答:有時候你會在/var/log/messages看到:Jul 25 22:14:02 zero kernel: Socket destroy delayed (r=212 w=0) 這意味著內(nèi)核無法釋放已經(jīng)釋放的socket內(nèi)部數(shù)據(jù)結(jié)構(gòu),因為仍然有socket數(shù)據(jù)緩沖。因此,釋放和銷毀會晚些再嘗試。在某個時候緩存被釋放,操作就會成功。
答:有時候你會看到:
mtrr: your CPUs had inconsistent … MTRR settings
mtrr: probably your BIOS does not setup all CPUs
這意味著過去過去存在不一致的問題,但是現(xiàn)在已經(jīng)處理完了。
答:
kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
kernel: hda: dma_intr: error=0x84 { DriveStatusError BadCRC }
在UDMA模式,每個傳輸都使用校驗。當(dāng)傳輸在校驗時失敗,它會重新嘗試并生成報告。這只是一個報告,并非錯誤。如果這讓你心煩,可以修改驅(qū)動,讓他別報了。
答:APIC是ia32系統(tǒng)硬件用于CPU之間通訊來處理低等級的時間比如中斷和TLB閃存。APIC信息也是校驗的,如果失敗會重復(fù)嘗試。這個提示說明傳輸存在失敗現(xiàn)象。APIC校驗是很弱的,所以,如果看到該提示應(yīng)該引起注意。確定你沒有強制主板使用非法的系統(tǒng)時鐘頻率。你也可以使用“noapic選項”來強制內(nèi)核不使用APIC。這同樣強制CPU0處理全部中斷。
第十四節(jié) - 奇怪的內(nèi)核問題
答:別擔(dān)心,他不會占用寶貴的cpu時間,他只是占用了空閑的周期。一般來說,當(dāng)你的系統(tǒng)是空閑的,系統(tǒng)idle任務(wù)才開始運行。
答:2.4內(nèi)核設(shè)為來讓你的網(wǎng)絡(luò)生活更多彩。其中之一的方法為使用顯示通塞通知——一個在RFC3168中定義的方法來提高TCP表現(xiàn)(允許路由提供網(wǎng)絡(luò)問題的預(yù)期警告)。不幸的是,防火墻產(chǎn)品存在問題,導(dǎo)致拒絕ECN使能的數(shù)據(jù)包。如果你自己的防火墻在這方面存在問題,你應(yīng)該檢查是否存在補丁。如果你無法連接的網(wǎng)站不在你的控制下,那么你應(yīng)該聯(lián)系網(wǎng)站的維護人員,讓他們知道這個問題。你可以在2.4內(nèi)核中禁止ECN,可以禁止CONFIG_INET_ECN選項并重編內(nèi)核,也惡意執(zhí)行下面的命令:
echo 0 > /proc/sys/net/ipv4/tcp_ecn
答:是的,處理器仍然在共享內(nèi)存,但是由于VM在2.4中的改變,CPU變得非常緊張來計算共享內(nèi)存總量。為了繼續(xù)使用這個工具,將/proc/meminfo共享內(nèi)存比變量設(shè)置為0.
答:不,這不是一個bug。一個模塊如果使用can-unload函數(shù),將報告使用量為-1。
答:現(xiàn)代的內(nèi)核(2.4)使用現(xiàn)代bios調(diào)用可以檢測你全部的內(nèi)存,甚至知道哪些內(nèi)存是bios自己使用的。你最好的做法就是安裝最新的內(nèi)核。你可以使用mem=xxx啟動參數(shù)告訴內(nèi)核你有多少內(nèi)存,限制你的系統(tǒng)在64M內(nèi)存下運行。比如你有128M內(nèi)存,你可以使用mem=128M參數(shù),或者在系統(tǒng)文件/etc/lilo.conf文件中寫下該參數(shù)。
答:因為你讓內(nèi)核去這樣做,所以它會正常工作。
第十五節(jié) - 編程信仰
答:有很多原因,其中一部分原因:當(dāng)linus開始寫linux時,他只有一個386,unix和gcc。還有一部分OS代碼使用匯編語言,因為他們對于硬件過于依賴。比如cpu和虛擬內(nèi)存。
答:因為我們無法從小路上獲得太多,而重寫將會失去很多的可維護性和可讀性。gcc實際上已經(jīng)非常高效。你可能指Andrew Tanenbaum的 “Structured Computer Organization”。
答:在我們還沒有聽說Linux的時代,內(nèi)核曾經(jīng)由g++編譯。這持續(xù)了一段時間,知道大家抱怨表現(xiàn)的下降。于是又從g++改成用C代碼來實現(xiàn)。這沒多大區(qū)別,但是已經(jīng)這么做了。
答:經(jīng)驗證明,微內(nèi)核的表現(xiàn)沒有龐大的內(nèi)核來的好。微內(nèi)核有很多設(shè)計問題。這里有項目來把linux內(nèi)核裁剪為微內(nèi)核:
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. 我們?yōu)楹尾话裧oto語句替換為C異常?
答:承認,goto非常難看,但是他們常限制在錯誤路徑并用于減少代碼量。如果替換會使得代碼量增加。由于內(nèi)核代碼需要可讀,而不是展示理論,工程準(zhǔn)則應(yīng)該優(yōu)先考慮。
答:這是一個周期性提出的質(zhì)疑。一般是在某些爭論結(jié)束后提出的。一些人注意到內(nèi)核開發(fā)者不喜歡新的想法,并且不會解釋原因。這看上去確實是一種輕視,并且給出內(nèi)核開發(fā)者不想學(xué)習(xí)新技術(shù)的印象。應(yīng)該注意到,內(nèi)核開發(fā)者是很忙的人,他們更喜歡寫代碼而不是無休止的爭論。也許這些開發(fā)者已經(jīng)使用過這些技術(shù),并覺得這些技術(shù)不適合。如果你覺得你喜歡的技術(shù)有價值就應(yīng)該自己去證明。不應(yīng)該要求其他人花時間來證明你的觀點。最后,個人觀點,寫下代碼比你讀書或者聽完一個討論更有好處。
總結(jié)
- 上一篇: [html] 你有了解HTML5的地理
- 下一篇: Linux桌面系统远程访问全解析