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