linux 内核邮件列表

第一节 - 一般性问题

1. 为什么有些时候使用“GNU/Linux"而另一些时候使用“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)。这些实验序列用于测试新的功能,算法,驱动。因此,试验内核不是非常稳定,会造成系统稳定或者数据丢失。

3. 什么是一个企业级内核?
答:企业级或者稳定内核有一个良好定义的功能集,较少的bug和已经经过测试的驱动。他们发布的次数少于实验性质的内核。GNU/Linux正式版一般使用企业级的内核版本,而不是最新的版本。

4. 什么是冻结特性?
答:冻结特性就是linux在内核列表上宣布不再考虑更多的功能,直到新的稳定版本发布。一般来说,这样做后,造成的影响就是人们会在linux实际实施特性冻结前提出一大堆的新功能。

5. 什么是代码冻结?
答:代码冻结比特性冻结限制的更多,这意味着,只能修正bug,这是一个很短的状态,通常预示着新的稳定版本内核将要发布。

6. 什么是f.g.hhprei内核?
答:中间发行版本f.g.hh。(这里解释比如2.1.105ac4,其中f代表2,g就代表1,hh代表105,而prei就代表ac4)。

7. 从哪里获得最新的kernel代码?
答:第一个推荐网站由 Transmeta (Linus Torvalds曾经工作过的公司)维护,网址为:http://www.kernel.org/.该网站在全球都有镜像。你可以通过网址http://www.CODE.kernel.org/ 访问你国家的镜像,其中“CODE”是你国家的代码。比如“au"表示澳大利亚,所以镜像网站就应该是http://www.au.kernel.org/。
    你同样可以选择ftp,从 
ftp://ftp.CODE.kernel.org/pub/linux/kernel/ 来下载kernel。另外,著名内核高手在people文件夹下有一些目录,用于放置他们的内核补丁。testing目录是Linus存放预发行补丁的目录。预发行补丁主要用于其他开发者,这样他们就可以和Linus的源码树保持一致。这通常是测试版本,应此经常导致系统崩溃。请在你自己的硬盘上使用。
    注意,Linus和Marcelo使用GIT来管理他们的内核源码树。这让他们很方便的获取最新代码,而提供补丁就不一样了。如果你希望获取这些源码树的快照,下列方法可以获得:

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

    Linux不再在BitKeeper源码管理系统中维护自己的代码,而是使用GIT。GIT是Linus编写的,
原因是BitKeeper不在对开发者提供服务。你可以浏览Linus最新代码以及其他人的项目
这里同样有一个关于 Overview of GIT and some helper tools 的说明和一个完整的
Tutorial来指导你使用GIT.

8. 我从哪里获取额外的kernel补丁?
答:这有很多地方提供了内核新功能的补丁,其中一个好的源就是http://www.linuxhq.com/

9. 什么是补丁?
答:补丁文件(这里特指linux内核)是一个ASCII文件包含了新代码和老代码的区别,包含文件名和行号。补丁程序(可以使用man patch来查看)就会将补丁中涉及的修改加入当前的代码树。

10. 我如何创建何时与linux内核的补丁?
答:发布这里有一些基本的守则。查看如何生成补丁,请留意下面的文字:

  • 确认每一行的结尾没有ctrl+M字符。为了兼容DOS,一些工具会在补丁每行后面增加一个ctrl+M。所以,请正确配置你的工具,否则,你就必须手动删除这些字符。
  • 在email中用简单的文字包含补丁,不要使用基于64位的MIME。许多人可能无法阅读你的补丁,因此你的补丁会直接被删除。
  • 对于大的补丁,推荐把它分成若干个部分,每个部分使用下面的描述进行注释:
  1. "[PATCH] cleanup of foo driver [1/5]".

          不要对每一个部分都开一个线程,应该一个一个部分的顺序执行下去。详细的可以查看Documentation/SubmittingPatches。

  • 如果你想让Linus或者主要维护人员中的其中一个来接受你的补丁,你必须明确的Cc:他们,否则你的补丁将被忽略。
  • 当给Linus或者主要维护人员中的一个发送补丁时,你必须使用简单的文字来包含补丁,不论补丁有多大。
  • 如果你希望征求补丁的修改意见,你同样可以将它发送给Linus/主要的维护人员。如果补丁很大,你可能会好奇如何协调代码的冲突部分。解决方法很简单:先发送URL,然后发送补丁。
  • 如果你的邮箱会自动清除空白或者其他问题,请先修好你的邮箱,不要期待有其他的解决方法。

      最后,我见过有人质疑上述准则,认为这些规则过于严格,FAQ过于热心。幸运的是,King Penguin自己回应了这些,所以,我直接将他的话记录如下:
   

  1.    如果我拿到一个补丁非简单文本格式,除非有绝对的理由,否则我将忽略它。我甚至不会去阅读它的内容,除非我期待发件人会给我一些特别的东西。真的,请不要发送这样的邮件。
  2.                                                                           Linus

       这有一个给使用Mozilla邮件客户端的用户的警告。Andrew Morton注意到当补丁被包含在消息体内时,Mozilla会损坏0列的空格。幸运的是,Mozilla 邮件以text/plain或者text/x发送补丁时正常。所以,使用附件发送补丁是安全的。
       生成补丁,你需要使用diff程序(阅读diff命令说明)。最简单的方法完成补丁就是在/usr/src/下,建立两个源码树,建立一个链接/usr/src/linux执行修改过的树,然后diff这两个目录,/usr/src/Documentation/CodingStyle下放了更多的信息。注意:

  • 永远使用统一的(-u)diff格式。
  • 避免调整源码格式而导致diff出现无用的信息。避免使用tab替代空格等行为。
  • 除非你有特殊的原因,否则使用diff和最新的官方源码进行比较。否则,你的补丁将被忽视。
  • 确认你的补丁中只包含需要的修改,而不是你对源码树所作的全部修改。一般来说,补丁限制在个别文件或文件夹中。最好对单个文件进行diff。例如,如果我只对文件driver_xyz.c进行了修改,那么我将使用下面的命令(确认你有源码树名称为“linux-2.1.105"),而且修改后的使用链接“linux”):
  1. cd /usr/src
  2. diff -u linux-2.1.105/drivers/net/driver_xyz.c
  3. linux/drivers/net/driver_xyz.c > my_patch
  • 下面两个肯定要说:diff的两个参数中第一个为源码,第二个为改过的源码。并确认你已经编译和测试过。
  • 当然,你需要建立两个独立的目录以方便diff。这里提供一个好的技巧:
  1. tar xzvf linux-2.1.anything.tar.gz
  2. mv linux linux-2.1.anything.orig
  3. cp -al linux-2.1.anything.orig linux-2.1.anything

       这样可以将每个源文件硬链接到一个新的目录,因为这不复制文件所以很快。你可以对linux-2.1.anything源码树使用补丁,由于补丁不修改源文件只是移动他们到filename.org,所以链接的源文件将不会修改。
        确认你的编辑器也是相同的(在修改之前,自动备份源文件)。你可以随意的编辑硬链接的源码树。如果你的编辑器不能这样做,你需要在修改文件前做如下备份:

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

       你可以使用文件的属性来提醒你这些,在工作前将可写属性去除。

  1. chmod -w *.c

      diff操作会很快,因为大部分的文件都不没有修改。感谢 Janos Farkas <chexum@shadow.banki.hu> 。

最后,在提交前审查补丁文件,特别要说明:为什么需要这个补丁,以及到底修正了什么。

11. 如何应用一个补丁?
答:(来源于/usr/src/linux/README)你可以使用补丁升级版本。补丁以gzip和bzip2格式发布。安装补丁,需要获取比目前版本新的补丁文件,进入解压后的源码树根目录,并执行:

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

    (将所有比当前版本新的补丁都做一遍),你可以删除所有备份文件(xxx~或者xxx.orig),请确认没有失败的补丁(xxx#或者xxx.rej)。如果存在,请确认是否存在操作错误。
    此外,脚本patch-kernel 可以自动执行上述过程。它会自动判断当前内核版本和补丁版本,使用方法为:

  1. scripts/patch-kernel .

    第一个参数为内核代码位置,补丁默认为当前目录,也可以使用第二个参数指定。
    应用内核补丁请查看文档(/usr/src/linux/README)“Installing the kernel”部分。同样也可以参考 good explanation on the Linux HQ Project site. 

12. 什么是vger?
答:vger是发布LKML服务机器的名字。服务器同样存放了大量其他linux相关邮箱。更多的信息可以在下面的网页找到:http://vger.kernel.org/

13. 什么是CVS树?我如何了解关于CVS的更多信息?
答:“CVS”是版本控制系统的简称,是一个源码管理系统。可以从这里获取更多信息:CVS Bubbles page

14. 哪里有CVS的教程?
答:你可以从这里找到在线的教程:An interactive CVS tutorial.
       了解CVS大概需要15分钟。

15. 如何将补丁打入内核?

答:根据你的补丁,有若干种方法来将补丁打入内核。关键看你这部分代码由谁维护(查看MAINTAINERS文件)。如果你的补丁只是一个小的bug修正,并且你非常肯定这是正确的操作,那么用任何方法将其发送给维护者。如果补丁非常紧急(比如一个主要的安全漏洞),那么你可以直接发邮件给Linus,但是注意,他可能会忽视一些补丁,除非对他来说是非常正确的。经过维护者的同意,或者经过完善的测试。假设你想知道什么是良好的测试,这里还有一点重要的说明:列表的目的是让补丁通过别人的评审以及良好的测试。好,如果你的补丁非常大,比如重写了一大段代码或者一个新的驱动,为了节约带宽和磁盘空间,请通过连接发布补丁。最后,如果你对于自己的补丁不是非常确定,需要维护者的反馈,你可以使用私人邮件。

    如果你想提供补丁的部分内核代码没有特定的维护者,你有3个选择:

  • 发送邮件去linux-kernel@vger.kernel.org 并且期待有人看到并反馈给Linus,或者linus自己看到它。
  • 发送邮件给linux内核和cc:Linus Torvalds <torvalds@osdl.org>期待linus接受它。注意Linus的操作就像一个黑盒。不要期待从他那里获得任何回信。你需要自己检查它发布的补丁来确认他是否采用了你的补丁。如果他没有采用你的补丁,那么你需要反复的发送邮件(多次)。如果一个星期或者一个月后当他发布了很多补丁,却仍然没有采用你的内核,那么也许你应该放弃。看来他不喜欢这个补丁。
  • 发送邮件到linux内核和Cc:Alan Cox <alan@redhat.com>。Alan在回应邮件方面表现的更好,会认真的对待你的补丁,并会定期将补丁发送给Linus。他同样是一个好的测试人员。如果Alan接受了你的补丁,基本上Linus也会接受。如果他不喜欢你的补丁,你也会获得一个邮件说明情况。

16. 为什么内核tar包包含的目录叫做linux而不是linux-x.y.z/?

答:因为Linus希望这样。这样使得更新补丁更方便,因为目录不用反复的重命名,这对于Linus来说更方便。

17. 官方内核和Alan Cox的 -ac系列补丁有什么不同?

答:Alan的内核是Linus内核的测试温床。当Linus只接受稳定的并经过严格测试的补丁到2.4内核时,Alan维护了一个内核补丁包含了很多新概念,新驱动,和相对多bug的补丁。如果这个补丁证明自己的稳定,Alan将他们贡献给Linus并包含到官方的内核中去。

18. 被污染的内核指什么?

答:一些厂商发布的二进制模块(比如,没有基于free软件许可的可用源码的模块)。由于源码不是免费可用的,发生在这些模块上的任何bug都不能被我们检查。关于这个模块发现的所有问题都只能返回给对应厂家,而不是内核专家,或者是linux-kernel邮件列表。污染的方案过去用来描述二进制模块内核bug报告:这些内核被标识为污染的。如果一个被加载模块没有经过公认许可的认证,内核就被标识为被污染的。公认许可认证相关文字在 linux/include/linux/module.h中。
    "oops"报告被表示成污染的对于内核开发者来说可以忽略。当这样一个模块被加载时,就会产生一个警告。注意,你可以查看一个存在兼容性许可的却没有MODULE_LICENSE TAG的模块。如果你在modprobe或者insmod操作一个符合兼容性许可的模块时发现警告,请报告这个bug到这个模块的维护者。这样他们就会增加需要的TAG。

    如果一个符号使用EXPORT_SYMBOL_GPL被导出,那么如果模块没有GPL兼容性MODULE_LICENSE字符,那么将无法被处理,并显示警告。如果强制加载,模块也会污染内核。

    对于Alan Cox “BSD  without advertisement clause”不是一个合适的自由软件许可。这个许可类型允许只有二进制文件而没有源码的模块。任何满足这个许可的内核tar包中的模块都应该是“Dual BSD/GPL”。

20. 我是否必须使用GIT来发送补丁?

答:绝对不是,一些内核开发人员包括Linus和Marcelo使用了GIT来管理内核树,但是这绝对不意味着你必须使用GIT来维护你自己的代码或提交补丁。许多高手仍然使用其他工具或技术来维护自己的代码。

21. 谁维护内核?

答:原来,Linus Torvalds维护内核。随着内核的发展,他将老的稳定版本维护工作分摊给其他人,自己继续开发最新的“bleeding edge”版本。在2002年5月27日,下列内核版本交给其他人维护:

22. 内核编译不了,我该怎么做?
答:首先确认你获得了最新的代码。也许一些分支代码确实存在问题。不如不是,查询是否存在补丁。不要询问已经有人问过的问题。如果问题没有得到修复,尝试,自己查看代码和给邮件列表发送补丁。你将成名。注意,clean代码不算修复。

第二节 - 驱动相关问题

1. 驱动存在问题?

答:需要更详细的说。请提供你特定的setup的信息(查看Qs How do I make a bug report?)同样可以查看Q:“kernel x.y.z broken!”。

    最差的方法就是重写驱动,尽量联系驱动的作者并报告错误。建设性的批评也是欢迎的。

2. 这有一个新的驱动用于硬件XYZ

答:干的好,请尝试找到同样使用该设备的人让他们测试程序。不会在没有人使用之前将驱动放进内核。当进行测试时,讷河的开发也在继续,你可能需要重新写你的补丁来适应当前版本。由于整个驱动很大,我们建议将实际驱动上传到ftp上,然后将连接发送到邮件列表,并描述你的驱动适用于什么硬件。

3. 是否支持我的TW-345卡在f.g.hh版本内核中?

答:首先检查硬件是否在启动时识别。一般来说是这样。然后看你是否需要进行配置比如modules.conf。第三看内核源码中是否有文件包含卡的名字(比如你有一个逻辑总线卡,有一个buslogic.c,那么你就非常幸运)。接着,在内核代码中寻找供应商的名字,或者卡的model号,或者最大的芯片的芯片号。例如,53C80芯片的驱动可能在源码中叫做5380。然后检查DejaNews,使用你在内核源码中查找的关键字,有99.99%的机会找到特定的设备驱动。好了。这样你不用打搅其他人就可以找到你需要的。如果都没有奏效,你应该问问一些新组织,比如comp.os.linux.hardware。

4. 谁维护驱动?

答:看看/usr/src/linux/MAINTAINERS文件,这里是最权威的来源。同样可以查看驱动源码本身。一些驱动有自己的网页和特定的邮件列表。如果你无法联系上维护者,那么你就可以给邮件列表发邮件。不论如何,记住维护者一般是很忙的人,他们一般都是利用业余时间为linux工作,所以不要期待立刻的回应。一些维护者可能在短时间内得到太多的邮件以至于不可能回复全部的邮件。请谅解。

5. 我想为TW-345写一个驱动,我应该如何开始?

答:相当的主动!首先有一个建立:你准备好作这些了吗?很多项目刚开始就结束了。确认你没有做重复的工作。确认驱动不存在:请阅读Q/A:2.3。

    首先准备好你自己。下载文档,阅读它们。接着,获取linux内核源码,查找类似驱动,读取THAT。(我一般使用最小的那个:wc -l *.c |sort -n |head -4)。好了,你可以思考一下。现在的问题是,你有硬件设备的说明吗?你可以通过逆向工程,但有设备文档会更简单。在最黑暗的时候(70年代到80年代),你可以拿到所有设备的完整资料。这已经不可能了。联系你的卖主,礼貌的询问设备信息或厂家。尝试联系厂家。如果你无法拿到技术文档,考虑放弃或者尝试硬件的竞争对手。如果没有放弃,好的,下一步就是找到Dos驱动。尝试在微软模拟器(dosemu或WINE)上运行。这允许你对工具变成来记录I/O信息。这将给你很多IO相关的信息。祝你好运,你会用到的。

6. 我想获取文档,但是他们让我签NDA(不公开承诺)?

答:一些人遇到了真正的麻烦。一些公司只是想知道哪些人拥有文档,而不关心你是否编写GPL驱动。这样,存在一个问题:告诉他你将做的并让他们写下他们确实明白了你的意思。这样,你仍然可以将驱动编写进内核。但你不能将文档发送给其他人。他们只能读取源码中的注释。另外一些公司(比如Netscape)自己签写了NDA来限制他们不公开信息。这样就不允许你来编写驱动,并将源码放在网上。请注意。如果有人遇到NDA,我建议不要接受。

7.我想有一个TW-234的驱动,有人愿意帮我写一个吗?

答:有些linux开发者愿意为了一杯啤酒来开发驱动。另外一些可能愿意免费帮你。如果你需要,你可以考虑付钱来购买或维护驱动。

8. 什么是主驱动号?

答:驱动好是传统的unix方法,用来在文件系统和设备驱动间寻址。一个驱动号是一个主号和镜像号的组合。当前linux有8bit的主和镜像驱动号。当你打开一个设备文件(字符或设备)内核从模块读取主号到一个驱动结构表中。有两个表:一个用于字符设备,一个用于block设备,每个都有256个最大值。内核源码中Documentation/devices.tex文件列出了所有的官方和镜像号。H.Peter Anvin(HPA)维护了这个列表。如果你写了一个驱动,你需要由HPA获得主号。详情参看:Q/A on devfs

 9. 为什么不支持WinModems?

答:问题是缺乏这个硬件的相关信息。大部分公司生产WinModems拒绝提供信息,而让微软操作系统来使用。最根本的问题是,他们和一般的猫不一样;他们没有DSP,而是让CPU做所有事情。因此你无法像传统猫一样和他通讯,你需要运行猫的驱动,或者你会出现数据丢失。他们设计的并不好。

    注意,一些人努力去反逆向winModems,所以如果你很幸运,就可以找到支持你设备的驱动。否则,你就应该买一个传统的猫。注意,猫必须经过机构的认证。而WinModems,驱动软件和硬件都需要经过认证。而这对于开源软件驱动来说更难,因为需要花费更多的钱。所以,理论上说,修改开源驱动比较容易。实际上99.999%的用户不知道存在驱动的源码。如果认证是唯一的问题,那么生产厂家将会发布二进制驱动。好消息是,大部分的WinModem硬件是被支持的。坏消息是这只是冰山一角。景观winModems可以使用,他们功能与声卡相似。所有的功能都需要使用本地CPU。可以在这里查看更多的信息:see http://www.linmodems.org/。

10. 现代CPU非常快,为什么我自己不能写用户模式中断处理?

答:这问题不等同于是否存在足够的CPU来浪费。而更像是,当前的Linux结构不允许这样做。用户程序通过中断方式运行,任何终端都必须激发特定的中断处理代码来执行。因此,小的设备驱动必须存在于内核模式中。

11. 是否需要针对所有版本发布驱动?

答:这里有详细描述不同内核版本区别的记录。为SMP编译的驱动不可能在一个非SMP内核中运行。同样,不同的供应商期待加入不同的东西到他们的内核序列中,可能也会改变数据结构。因此,内核中的数据结构是不变的。任何修改二进制驱动的做法可能都会产生问题。内存变化可能会出现在i386-PAE模式。应为这些区别,一个驱动为一个内核版本编译的结果,是不能和其他内核上工作的。如果你发布了一个二进制的驱动,你将需要针对不同的内核版本提供支持。如果你发布的驱动是源码形式,那么提供写好的驱动,这些驱动将跨内核版本和结构。当然,它将需要最终用户进行编译。版本维护人员ui提供预先编译的驱动,大部分的用户将不需要自己编译驱动。

第三节 - 邮件相关问题

linux内核邮件列表用于讨论linux内核本身。关于linux系统员、linux编程、linux发布的讨论不受欢迎。

测试消息不受欢迎。如果你想知道是否订阅成功,请等待若干小时,你将会受到邮件列表系统告知的邮件。你毫无疑问的会受到一连串的消息。如果你希望自己发送邮件,那么必须确保自己有重要的事情要说。当你阅读了下面的段落,写成一个实际的邮件,然后发送到lkml。请记住,这里有很多的订阅者,这将需要你等待很久来获取反馈邮件。一个小时并不长。

当给linux-内核邮件列表发送邮件时,会有很多忙的人阅读这些消息。不管你认为自己有多重要,这里有很多比你更重要的人。重要并不是看你有多少钱,而是看你对linux内核做了多大的贡献。

记得这些,你必须确保没有浪费其他人的时间。

1. 如何向linux-内核邮件列表注册?

答:订阅前请仔细考虑。你是否希望邮箱里面出现很多的邮件?你是否那么关心linux内核开发期待每周更新一次内核,忍受bug,错误和系统崩溃的时间和精力的浪费?你是否准备好加入伟大的企鹅,并被人称为怪胎?也许你应该阅读“Kernel coverage at LWN.net”在网址:http://lwn.net/Kernel/
    好了,如果你仍然期待加入,发送 "subscribe linux-kernel your_email@your_ISP" 到majordomo@vger.kernel.org (注意,不要包含双引号字符,当然替换你自己的邮箱地址)。你将会完成订阅。我经常看到如下的报告:

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

    反馈这个问题到网址: http://vger.kernel.org/mxverify.html

    确认你没有上述问题!详见: http://vger.kernel.org/majordomo-info.html

2. 如何取消linux内核邮件列表订阅?

答:由邮件列表服务器发出的每一封邮件底部都有下面的说明:

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

   详见: http://vger.kernel.org/majordomo-info.html

3. 我是否必须订阅邮件?

答:你不是一定需要订阅邮件。邮件地址为:linux-kernel@vger.kernel.org。你应当在你的消息中说明你的评论和回答都代表了你个人。

    但是,总的来说,订阅邮件是有好处的。我们可以知道什么是公认正确的,什么不是。别将这里作为个人的helpdesk。这是一个社区。

4. 存在文件列表吗?

答:

5. 我如何在文件中查询特定问题?

答:使用简单关键词特指一个东西,比如,如果你在使用网卡NIC-007时出现问题,使用“NIC-007”或者“oops NIC-007”。记住,仔细查找文件,你将找到更多的信息而不是简单发布一个问题。

6. 邮件列表是否负担很重?

答:负担非常重;平均每天的消息量为~400【07/2007~02/2008】.一个月就超过12000个消息。你真的不会愿意去阅读每条消息。如果你关心邮件列表中的负担,我建议你尝试 digest lists,这个负担会轻很多。这里还有一个每周的总结叫做"Kernel coverage at LWN.net" 在: http://lwn.net/Kernel/

8. 在列表中,我可以问什么问题?

答:基本规则就是避免问已经问过的问题。记住,这里有个邮件列表用于内核开发的讨论。如果你有什么想法或者bug需要报告,就去这里吧。如果你找到一个Clib库或者应用的问题,这不属于linux-kernel。

9. 邮件风格有什么要求?

答:当使用邮件列表跟贴,在你引用前请仔细考虑。因为列表上的每个人都有原来发送的邮件,所以不要全部引用。高亮你需要表明你观点的部分就行。确认引用的部分使用>(或者>>)。不要引用签名,补丁,配置文件,和整个邮件。内核list已经很拥挤了。请大家注意。

    注意如果你有太多的引用,你的邮件可能会在没有阅读的情况下被删除。请在引用的文字后面回复,而不是在前面回复。在引用之前看到回复着实让人看不懂。我知道有些人喜欢引用整个消息,所以他们回复在最开头。不要这样做。别引用全部的东西。没人愿意看到这样的邮件。

    请不要使用tab或者空格来表示引用。使用>来表示。使用空格没有办法区分引用和回复。浪费大家的时间。参看如何提高阅读效率:Write for maximum efficiency of reading.

    不要使用太长的签名,前们不支持超过4行80个字符。

    不要使用太大的附件。很多人把.config文件作为附件,这可能会超过1000行,而且还会持续增加。如果你.config的内容有需要加入邮件,那么可以将下面的结果附在邮件附件里:

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

    如果你使用微软Outlook,那么你需要使用下面的补丁:

10. 邮件是否有人管理?

答:内核邮件列表无人管理。

11. 我如何拒绝列表的邮件?

答:技术上可行,但是我从没有听说有人拒绝linux内核邮件。如果你坚持这么做,那么你需要做的就是使用程序“fetchmail”,这可以反复的发送邮件到特定地址,比如linux-kernel@vger.kernel.org。如果你让这个发生,你可以确保你的订阅将会被删除。

12. 我需要注意其他哪些规则?

答:这里还有些规则需要注意:

  • 注意,这是linux内核的邮件,主要为开发者服务。
  • 只是用英语。
  • 不要传输HTML格式。如果你在使用IE或者Netscape, 请关闭HTML邮件格式。
  • 如果你使用其他OS, 确认你的邮箱不使用Charset="Windows*",因为这些邮件将被阻止。
  • 如果在你上传邮件前你被组织,  在文档中查找答案。记住99%的问题,以前都问过。一般来说第一个问题是最完整的。
  • 准确的询问问题,或者声明bug。 避免歧义。
  • 态度诚恳些。 避免攻击其他用户。
  • 不要纠缠于争议。
  • 一行代码比千万句话都管用。
  • 批评别人的代码很容易, 但自己写就不那么轻松了。 如果你发现一个问题或错误,不要马上写下评论,比如"这段代码真垃圾?"。联系代码的作者, 解释问题。 以后,当你写代码的时候,大家都会认可你。
  • 不要责备新人问的简单问题。 给他们发送私人邮件说明你的观点。

13. 我如何发送邮件?

答:你可以发送邮件到:linux-kernel@vger.kernel.org

14.  邮件列表被列为垃圾邮件?

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

15. 我不再从邮件列表获得邮件,出什么问题呢?

答:Majordomo 是一个智能邮件列表服务器。如果出了什么问题,邮件无法发送,多次尝试后,你会自动退出订阅。从另外一个方面说,邮件服务器出现故障也是存在的情况。如果被取消订阅,那么请重新订阅。也有可能因为MTA延时,导致退出订阅。如果你的邮件路由数据是合法的就证明发生了这种情况。可以将你的地址反馈给http://vger.kernel.org/mxverify.html

16. 是否存在NNTP网关?

答:是的,这有一个新组织叫做:fa.linux.kernel。

17. 我想发送一个好想法到邮件列表去,我应该怎么做?

答:你可以这样做:

  • 首先确认你的想法对于内核开发非常重要。在发送邮件前,请确认这是一个内核问题。
  • 那么你有一个关于内核的想法。 你是否确认以前没有人想过? 阅读所有相关的主题。 同样查询 the mailing list archives 看以前是否有提出过类似的想法。
  • 这里,你已经确认过你是第一个提出这样想法的人。 为了更好的得到回应, 给出一个补丁 发送邮件。如果你提供代码, 就会有人进行尝试并给出评论。 如果你不清楚内核hacking,那么你最好现在开始学习:-) 当你提出了你的想法, 你就可以把自己称为内核专家。
  • 如果你没有使用代码实现, 只是一个想法, 并发送邮件。 尽量写清楚, 这样人们才能更好的了解你的想法。 如果你幸运, 有人喜欢你的想法并实现它。 如果没有人去实现,请注意, 我们都是志愿者,每个人都有太多事情去做。
  • 如果你的想法没有得到好的回应, 别泄气, 没有一个严格的定义来说明什么是好的想法或坏的想法。如果有人对你说了不敬的话, 请控制你的情绪。如果有人很客气的表达不同意你的想法,请仔细考虑你的想法。 如果别人还是没有清楚你的想法, 请使用其他方法解释一遍。
  • 如果你认为你是对的,不用在乎别人的说法,你可以自己实现它! 如果你是对的,你可以笑到最后。

18. 如果邮件列表发送了不相干的邮件,我应该怎么做?

答:不理会他。

20. 可以自动将“回复:”加在列表中吗?

答:有些邮件列表自动增加 “回复:”帮助查看邮件。但这不是个好想法,有几个原因,这里不想列出。可以查看如下链接:Reply-To: Munging Considered Harmful 。

21. 我可以在邮件列表中招聘工作吗?

答:当然不行,如果你想找工作,还是去这个网站吧:http://www.hotlinuxjobs.com/

22. 为何我发送私人邮件会出错?

答:有很多原因,比如,邮件递送出现问题。邮件被阻塞。

第四节 - “我如何”相关问题

1. 我如何提交补丁?

答:我假设你已经按照前面的要求做了补丁。现在写一个简短的说明来描述你的补丁,包含针对的内核版本,你的测试用例,你想要的反馈等。最好10行以内。给你的补丁和一行的ReadMe文件(描述你的名字和邮件)放在一起。在你的邮件中,写明[PATH]<驱动名或代码段>,kernel<内核版本>。然后发送。小的README文件保证你的补丁在网络上传送而不会泄漏你的名字。如果你不关心版权,那么你可以略过这些文件,直接gzip补丁文件将其放在附件中上传。

    注意,linus不阅读linux-内核list。如果你希望他看见补丁,你就必须直接发送给他。注意,Linus喜欢在ASCII下阅读补丁。如果你的补丁太大,你只能发送一个URL给Linus。同时注意,Linus不会回复你的邮件。

2. 我如何捕捉异常?

答:如果异常发生,系统会将内存数据写入/proc/kmsg文件。你可以使用dmesg命令打印其内容。但是klogd和syslogd会自动的捕捉异常并写入日志文件。

    有些时候,异常导致内核崩溃。出现这种情况时,所有功能都死掉了,此时,异常无法写入日志文件。在全面的崩溃情况下,你有三种对策:

  • 手动抄写异常文字。
  • 你可以预先安装终端链接(read linux/Documentation/serial-console.txt)那么你也可以远程记录问题。
  • 从2.3.10开始,你就可以使用串口打印机作为终端。可以打印屏幕信息。
  • 还有补丁可以使用硬件记录linux内核日志。

3. 我如何发送一个异常?
答:假设已经发现了一个异常,你应该将相关的系统日志、内核配置文件、内核符号map以及你的硬件和环境描述。该异常是特殊的函数造成的?他是否发生在你硬件配置修改?不要在你查看linux/Documentation/oops-tracing.txt文件、linux/scripts/ksymoops的README前,发送异常报告。这些文档描述了内核异常的基本原理。好的跟踪信息使得解决问题更方便。如果没有运行ksymoops将内核缓存形成文件,请不要发送异常报告。报告将被忽略因为没有提供任何有价值的信息。确认,你拷贝了正确的system.map文件到/boot文件夹,否则你无法获取正确的结果。
    下列情况会使得内核异常无法处理。最典型的两个就是如果你的CPUoverclock,或者在VMWARE下运行。原因是overclock可能造成随机bit错误,而VMWARE下运行可能改变内核数据。在这两种情况下,内核数据报告是没有用的。

4. 我认为自己找到了一个bug,如何进行报告?
答:一个bug和异常有明显的不同。异常是当内核检测到有东西出现异常。bug是事物没有按照应该的方式运行。如果你发现了不正确的功能,你可能也有可能不遇到异常。

5. 什么样的信息我应该发送在bug报告?
答:他是否影响了系统安全?是否跟驱动和硬件配置有关?你是否能够识别出相关的代码?这都依赖于你找到的bug。

   请遵守bug报告准则:记住,开发者没有权利进入你的系统,他们也不是思想阅读者。告诉我们内核的版本,你的硬件情况(如果你不清楚,更多的细节总是需要的)。至少,告诉我们你使用的处理器和主板,多少钱,多大的硬盘,使用什么磁盘控制器以及其他的扩展版。如果有下面这些的话会更有帮助:gcc编译器的版本和binutils版本。尝试找个可复制的方法来触发问题。告诉开发者搭建一个复杂的应用环境会导致很多开发者直接删除邮件。

    总的来说,提供数据比直接给出结论更有效。如果你想在你的bug报告中给出你的猜测,我们欢迎,但是这不是具体数据的替代品。有些问题并不是看上去的那样。硬件问题可能可能会伪装为一个VM问题。一个设备驱动或者VM问题可能会导致文件系统差异。

    如果你获得一个异常消息,你必须把系统信息高速我们,否则将会没有用处。使用最新的syslogd/klogd,这将更加简单。如果系统异常并死机导致klogd无法记录信息到syslog文件。拷贝异常信息,稍后使用ksymoops来获取符号信息。

    如果你可以,尝试锁定问题到特定的内核版本。这将非常有用。

6. 我在老版本的内核中找到一个bug,我应该报告它吗?

答:最好在新版本的内核上进行测试。

7. 我如何编译内核?

答:查看 Kernel HOWTO 以获得更多信息。同样,在 http://www.kernelnewbies.org/有很多人可以帮助你。

    Buildkernel 可以指导你进行编译,包括下载需要的文件,补丁,编译内核和模块,安装lot进入lilo,有选择的构建pcmcia-cs,cipe和freeswan。下载和安装整个tar或者rpm版本,运行下面的命令:

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

8. 我如何检查是否内核被污染?

答:

  1. cat /proc/sys/kernel/tainted

    如果结果为“0”表示没有污染,否则表示被污染。

第五节 - “谁负责”相关问题

1. 谁负责?

答:你是否指“谁维护邮件列表”或者“谁负责Linux内核”?如果是前者,是Majordomo(服务器的名字)。

2. 为什么不做一个Linux内核Team网页,就像其他项目一样?

答:原因恐怕是因为Linux没有组。同样的,因为所有人都对linux内核做了贡献。最后,linux内核贡献者都非常的低调。

3. 为什么下面不回答我的邮件?

答:因为他们太忙了。如果你每天获得1000个邮件,你会怎么做?这不意味着粗鲁。

第六节 - CPU相关问题

1. 最好的linuxCPU是什么?

答:这里没有最好的CPU。选择什么CPU一般取决于你的价格/性能/技术需求。在x86上,我们有Intel,AMD,Cyrix和IDT/Centaur.很多选择。这些都可以,除了x86处理器,linux内核也可以在68k处理器,MIPS R3000和R4000,PowerPc, ARM, Alpha和sparc处理器上运行。

    linux内核是有四个广泛传播的版本:x86,Alpha,Sparc和Power-PC。而Alpha和Sparc版本的发展有很大的局限性。如果你不想花费大量时间安装和配置Linux,你最好使用x86机器。

第七节 - OS相关问题

1. xxx操作系统有一个很Nice的功能,所以它比GNU/linux强大。

答:对不起,这只能说明xxx操作系统被设计为拥有xxx功能,而Linux被设计为另外一种。不存在谁比谁更好。

2. 为什么linux内核没有一个图形化的boot界面就像xxx操作系统一样?

答:因为它不需要。如果你想,你可以增加这个功能。

3. CTE-variant操作系统的内核有一个很好的功能,我能把它放进linux内核吗?

答:当然,你可以对free软件做任何事。但是CTE-variant好像不是一个free软件吧。

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

答:最新的bug比起老的内核版本来说没有更多的已知bug。但是linux内核代码在持续的增加。作为一个规律,更多的代码意味着更多的未知bug。

6. 为什么linux内核代码持续增多?

答:有四个原因:

    1)增加新的功能单元。

    2)增加新的驱动。

    3)老代码持续的增加评论和注释。

    4)老代码上增加新功能。

7. 内核源码太大,需要太长时间来下载。能否将其分解为小的tar包?

答:内核(从2.1.110)有150万行代码。大约25万行(17%)分在不同的目录下,大约81万行(54%)是针对不同平台的驱动。如果你只对i386感兴趣,你可以保留23万行代码而删除其他部分。可以节约15%的空间。核心内核代码大约43万行,约29%。

     如果你想去掉驱动,那么麻烦就来了。这样设计不是因为你下载的时间有多长,而是会给Linus以及其他发布内核版本的人带来多大的工作量。对整个内核构建tar包是一个可预知工作量的工作,而将其分解为不同的结构独立的tar包就需要增加很多的工作量,而且也会带来很多的维护问题。

     如果你真的需要一个小内核,你就应该建立一个程序来实现实现上述功能。一旦你这样做并将其公开,就会有更多的人来欣赏你的努力。如果仅仅想内核论坛抱怨,我想linus和其他内核开发人员会直接忽视这样的信息。

8. linux内核基于什么条款?

答:在linux内核根目录,你将找到一个COPYING。这个文件就是linux内核基于的GNU基本条款。如果你还有疑问,可以到论坛上提问。但是请别在这里问。

9. 什么是“bazaar”和“cathedral”?

答:这用于描述两种不同的开源软件开发冒失,首先有Eric S Raymond提出。你可以查看他的原文:his original article

10. 为什么说linux是“World Domination”?

答:希腊式的幽默?请别当真,这只是想说有越来越多的人开始使用GNU/Linux。注意,开源软件的“free”指的是自由,刚好是World Domination的相反一边。

11. Linux内核将来的计划是什么?

答:这个问题应该询问Linus。但我很怀疑,他是否有时间回答这个问题。但是,这里有一些有待开发的东西可以参考:

    1)支持Pnp

    2)支持SMP

    3)支持64位

    4)支持POSIX

    5)APM

12. 在boot启动信息里面为何显示BogoMips而不是MHz?

答:对于一些处理器,无法找到时钟频率。因此内核无法通过检测MHz来获取精确时间。Bogomips

可以获取精确的时间。可以查看Wim van Dorst关于the BogoMips HOWTO的文章。同样可以查看Linux  Benchmarking HOWTO。有时候不同内核的BogoMips读数会相差30%,这是由于BogoMips 计算循环的不同造成。 Richard B. Johnson最近提出了一个解决该问题的新补丁。

13. 我安装了内核x.y.z,但是却不能工作,我该怎么办?

答:检查/usr/src/linux/Documentation/Changes,确认你使用了最新的代码。这非常重要。很多老版本的问题,在新版本已经解决。如果你使用了开发版的内核,那就注意查看Kernel list,也许已经有bug 的报告。

14. 人们讨论用户空间和内核空间,有什么区别?

答:用户空间是用户程序运行的空间,使用的是虚拟的内存。X服务就在用户空间中,shell也是。内核空间是kernel运行的地方。内核内存是不可交换的,因此应该谨慎使用。同样,内核空间的操作也是优先级最高的。这意味着,其他进程需要等待该操作完成才会运行。内核的任务是提供一个安全简单的接口控制硬件。大部分的想法都应该在用户空间完成。唯一的例外是当功能无法在用户空间执行或者效率太低。这就是为什么文件系统是放在内核中的,因为内核要快得多。

15. 什么是线程?

答:简而言之,线程就是轻量级的进程。

16. 我可以在linux上使用线程吗?

答:当然,Linux内核现在可以clone系统调用,提供了使用线程的库。Xavier Leroy已经为我们提供了linuxThreads。

    如果你有一个 libc 5系统,你需要安装linuxThreads。

    如果你是一个libc 6系统,你什么都不用做,Glibc已经包含在里面。

17. 是否线程在GNU/Linux实在内核空间使用的?为何不混合使用内核/用户空间?那样不是更高效?

答:无法确定使用混合线程库会给linux带来明显的好处。如果你看了solaris线程,他们用了一个混合的线程库,然后就确认它是有好处的。好吧,我以solaris为例,他们有一个非常重的内核,因此进入内核空间非常的慢。linux就相反了,有一个高效的内核。所以在用户空间和内核空间间切换就快很多。

18. GNU/linux机器可以做集群吗?

答:当不同的人谈论集群,他们指的是不一样的东西。有人想要的是错误切换和负载均衡,其他人指的是并行计算。错误切换和负载均衡无法再linux中提供。当然你可以自己实现它。

    Beowulf项目提供了一个并行计算的系统和API。

19. Linux如何支持SMP?

答:2.2内核比2.0兼容性更好,2.2版本有一个全局的内核始终,但是经常释放,所以两个处理器不会对全局锁产生竞争。对于14个处理器的机器来看,linux运行的很好。比NT好。

20.  我能够对一个CPU锁定一个线程或者进程吗?

答:使得,作为2.5.8版本的内核支持绑定一个进程或者线程到指定的CPU。

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

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

答:难以置信。与基于其他内核的应用相比,linux显然是最快的。每个线程只用8kib内核内存。用少于1ms的时间进行上下文切换。但是,linux时序被设计为小数量的运行线程。最好有几个处理器就运行几个线程。在程序中避免使用大量的线程。大量需求在于修改linux进程调度,来适应大量线程的情况。但这被开发社区拒绝,因为拥有大量线程是愚蠢的做法。

22. linux网络栈如何工作?

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

23. 我们能够将网络栈凡在用户空间吗?

答:不。因为这样的话,将会降低运行速度。有些人想检查每个网络报文包,所以认为将其放在用户空间更简单。但事实上,内核有一个网络包过滤API。LSF允许你解惑一些网络包。另外一个原因是有些人想通过这种方式,实现防火墙。在这个情况下,有一个更好的解决方案,使用 Netfilter。这是一个内核级的网络防火墙。你可以创建既可靠又快速的防火墙配置。这个在2.3的开发版本中已经存在。

第八节 - 编译相关问题

1. 我下载了最新的内核,但是无法编译,出什么问题了?

答:首先检查内核最新的补丁在: http://www.atnf.csiro.au/~rgooch/linux/docs/kernel-newsflash.html,这里有最新的补丁。不要再这里放编译错误除非你确认过archives知道从来没有人提过相同的问题。一般来说,如果linus允许简单错误进入内核而使linux无法编译,那么应该就会在几小时内将补丁发布出来,当然后面几个星期内仍然会有人不停的问为何无法编译。请别这么做,我们会知道你住哪,我们会在3点到你家敲门来问你愚蠢的问题。

      确认你用于编译的gcc版本是最新的,binutils是最新的包,有最新的gas和ld。如果已经是这样了,尝试不同的编译器。

      Linus无法测试每个驱动,他只是一个自私的人。他只编译在他机器上的版本并发布。事实上,他有时发布出来的版本并没有编译。他很忙,让他多休息一下,多等一天到两天。将会有人将修正的版本发布上去。如果这没有发生,那你可以尝试自己修复,并发布补丁。请检查是否已经有人报告过相同的问题。你可以跟开发者沟通,但是请别浪费大家的时间。

      并非对特定硬件的所有linux内核都被放到kernel.org。如果你是对一个非i386系统出现编译错误,请检查相关的网页和mailing-lists看有无相应的说明。

2. 推荐使用什么编译器或者binutils来编译内核?

答:看内核版本。知道2000.10.26,gcc2.7.2.3是推荐用来编译全部内核的。之后,linus宣布,gcc 2.9.1.66用于编译2.4.x内核到2.4.9.gcc2.95.3推荐用于内核2.4.10之后的。

      binutils是2.9.1.0.25,不能使用的版本是2.8.1.0.25到2.9.1.0.2.这是beta版本,并且知道bug非常多。

3. 推荐使用什么编译器?我比较喜欢xyz-编译器。

答:推荐的编译器需要经过严格的测试并有一个稳定的表现。

4. 我能用gcc2.8.x来编译内核吗?最优的是什么,我如何使用-O99?

答:当然,这是属于你的内核。如果无法编译,你有权修改它。但是,没有人会使用实验版的编译器来编译一个企业级内核。企业级内核必须被推荐的编译器编译。使用gcc2.8编译2.0内核不被推荐,可能会导致不可预期的内核。

对于2.1内核,常被其他版本的编译器编译,但是如果你无法使用推荐编译器请不要抱怨,Linux开发者有很多的工作需要去做,有很多的bug需要处理。请注意,优化选项可能导致更大或者编译更慢的内核。

5. 使用xyz编译器编译了内核,有如下的警告/错误,我应该提交bug报告吗?

答:一般来说,使用推荐编译器不会得到警告/错误。但是少数例外:

     每个人都期待干净的补丁,修补这些警告或错误是件好事。但是请确认你是否修复了一个真正的bug。对于非推荐编译器这方面的修改会被忽视。

6. 为何我的内核编译停在了一个随机的地方,同时报错:“Internal compiler error: program cc1 caught fatal signal 11”?

答:有些时候,坏的硬件会导致上述问题。阅读网页:http://www.BitWizard.nl/sig11/ 

更重要的问题是random。如果它停在一个相同的地方,应该是编译器或者内核源码的问题。但如果停在随机的地方,应该是硬件问题。如果出现硬件问题,你会看到很多奇怪而不同的错误。

7. 我应该使用什么编译标志?

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

      我不建议如果文件夹在内核源码树上,使用手动方式进行编译。其他的makefile将不知道这些额外的模块,并且不会重编译它们。最好的方法,是将其加入内核的makefile系统。举例如下:

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

    修改makefile,增加你的子目录到父目录的sub_dirs list。

8. 为何我报错:符号无法处理,比如foo_ver_foo?

答:如果/proc/ksyms或者depmod -ae的输出包含符号“foo_er_foo”,那么你就有可能使用了不完整的makefile。最安全的修复方法就是保持你的配置,删除所有,然后重新配置,并编译,比如:

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

第九节 - 功能特性相关问题

2.  ext2fs文件最大多大?2GB?
答:在2.0.x内核中,最大的文件系统为2GB。更大的文件只在64位机器上。

3. GGI/KGI或者图形接口在内核空间吗?
答:GGI/KDI信息可以在这里查找(here. )。GGi/KGI开发者抵制在这里的无用争论。

4. 我如何获得超过16个SCSI磁盘?
答:使用2.2.0或更高版本内核。

5. 什么是devfs,为何是个好想法?
答:好的,这里我说下我自己浅薄的想法。Devfs允许驱动直接连接到设备文件(就是你在/dev下看到的东西)。查看 devfs FAQ 获取更多信息。

6. linux内存管理?区域分配?

答:Rik van Riel有一个很好的网页介绍linux内存管理:nice page

7. 你可以打开多少文件?

答:在2.0.x内核,你可以打开256个文件。在2.2.x你可以打开1024。 

10. 我需要encryption和steganography。为何内核中没有?
答:注意这部分是2000/2001写的,很多东西都发生了变化。在法国和俄国,强加密是非法的,而美国对这方面的软件也做出了限制。

11. 为何不提供删除恢复功能?

答:这个被提了很多次。内核不需要支持这个。你可以在用户控件轻松的完成这个。可以替代rm程序,让他删除文件到一个回收站,而不是真的删除它们。这可以使用libtrash, 更多的信息在: http://m-arriaga.net/software/libtrash/

12. Linux tmpfs怎么样?

答:2.4系列内核引入tmpfs。老得sysV共享内存代码被新的shm文件系统替代,后者更简单轻。如果你有一个嵌入式系统,你会发现tmpfs非常有用。

14. linux 使用了大量交换空间,这是正常的吗?

答:不一定。linux会将长期不用的程序交换出去。这应该更高效。

第十节 - ”内核2.0.x和2.2.x变化“相关问题

1. 大小(资源和可执行文件)?

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

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

    当我在2.0.33内核源码上运行时,我得到:811985(行代码,包含评论)。当我在1.0.106内核上运行时获得1460508。这意味着linux是一个很大的软件,需要200到500人5-10年的工作。事实上,linux内核大概7岁,有100-1000个程序员在维护它。

3. 支持新的文件系统吗?

答:

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

4. 性能?

答:有些只在2.2x内核上才开始使用的优化:

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

6.什么是__initxxx宏?

答: 比如__initfunc()是一个宏用于把第一个参数变成一个ELF。

8. 为何ifconfig显示不正确的统计?

答:在内核源码中,linux/Documentation/Changes的一段话:

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

9. 我的tty设备不工作,出了什么情况?

答:ptys使用了一个4,而linux2.1.115中取消了。如果你使用devfs,那么问题就自动解决了。

10. 我能使用unix98 ptys吗?

答:如果你有一个内核和libc支持,那就可以。这在linux2.2和glibc2.1中得到支持。

11. Capabilities?

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

第十一节 - 文档相关问题

1. 什么是入门文档,为何我需要先阅读?

答:一次又一次的看到内核list上有很多的技术争论。有些是非常重要的,但也有很多是重复的。入门文档有很多的连接到相关的讨论上,这样,在我们开始争论之前应该首先看看是否已经存在相同的讨论。这不是为了禁止讨论,而是让你在更专业的地方进行讨论。

2. 能否有I/O接口?

答:在已有unix系统上,select和poll用来实现设备的分时处理。这有相关的文档:primer document

3. 什么是VFS,它如何工作?

答:VFS(虚拟文件系统或许你文件系统切换)基于linux文件系统层。采用了dentry缓存和标准的操作。这里有你需要的文档:VFS primer

4. 什么是linux内核时间?

答:你可以在这里找到相关信息:here.

5. 是否存在/proc/scsi,这样我可以用它来重复扫描SCSI总线?

答:以下文字处于drivers/scsi/scsi.c :

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

第十二节 - 编程相关问题

1. 什么时候使用cli()?

答:cli()是内核函数,用于禁止终端,sti用户使能终端。有些东西必须运行在禁止终端的地方,因为一些操作需要操作顺序。你应到永远不使用cli()在一个用户空间程序。

cli()不再推荐使用。在单一处理器上,这用于清除内核cpuflag。在SMP系统上,保持所有处理器禁止中断会带来些麻烦。目前,我们正在尝试其他的方法。比如,你应该设置一个锁来描述该设备实例需要进行原子操作。而不是让所有的CPU都不处理中断。

2. 为何有时候cli-sti成对使用,有时候save_flags-cli()-restore_flags?

答:cli-sti确保我们能够将禁止的操作使能。而是用save_flags-cli-restore_flags用于对于速度要求高的代码。注意,在系统上,cli和sti和restore_flags操作都很快,但是在smp系统,函数需要等待全局IRQ锁。除了这个区别这些函数在SMP上都是安全的。调用cli多次,全局IRQ锁只会在第一次锁定。

3. 当禁止中断时我可以调用printk吗?

答:是的,但是你得非常小心。早版本的内核在printk中包含cli-sti对。所以,你需要在调用printk前使能中断。

4. start_bh_atomic和end_bh_atomic()?

答:为了保护你的代码放置被中断,多数用于系统调用,用户空间的函数调用最好使用cli/sti对。

5. 获取全局内核锁多次是否安全?

答:是的,全局内核锁对于每个进程递归。这意味着每个进程可以进行锁定而不会死锁。当调用unlock_kernel时锁释放。

6. 我什么时候需要初始化变量?

答:在读取前,所有变量都需要初始化。

第十三节 - 神秘的内核消息

1. “socket延迟销毁”是什么意思?

答:有时候你会在/var/log/messages看到:Jul 25 22:14:02 zero kernel: Socket destroy delayed (r=212 w=0) 这意味着内核无法释放已经释放的socket内部数据结构,因为仍然有socket数据缓冲。因此,释放和销毁会晚些再尝试。在某个时候缓存被释放,操作就会成功。

2. 不一致的MTRRS我该怎么处理?

答:有时候你会看到:

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

意味着过去过去存在不一致的问题,但是现在已经处理完了。

3. 为何我的内核报告中有很多“DriveStatusError Bad CRC”?

答:

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

    在UDMA模式,每个传输都使用校验。当传输在校验时失败,它会重新尝试并生成报告。这只是一个报告,并非错误。如果这让你心烦,可以修改驱动,让他别报了。

4. 为何我的内核报告有很多“APIC错误”?

答:APIC是ia32系统硬件用于CPU之间通讯来处理低等级的时间比如中断和TLB闪存。APIC信息也是校验的,如果失败会重复尝试。这个提示说明传输存在失败现象。APIC校验是很弱的,所以,如果看到该提示应该引起注意。确定你没有强制主板使用非法的系统时钟频率。你也可以使用“noapic选项”来强制内核不使用APIC。这同样强制CPU0处理全部中断。

第十四节 - 奇怪的内核问题

1. 为什么kapmd使用如此多的CPU时间?

答:别担心,他不会占用宝贵的cpu时间,他只是占用了空闲的周期。一般来说,当你的系统是空闲的,系统idle任务才开始运行。

2. 当连接网页时,我的2.4内核报告“connection refused”,而之前版本内核工作正常?

答:2.4内核设为来让你的网络生活更多彩。其中之一的方法为使用显示通塞通知——一个在RFC3168中定义的方法来提高TCP表现(允许路由提供网络问题的预期警告)。不幸的是,防火墙产品存在问题,导致拒绝ECN使能的数据包。如果你自己的防火墙在这方面存在问题,你应该检查是否存在补丁。如果你无法连接的网站不在你的控制下,那么你应该联系网站的维护人员,让他们知道这个问题。你可以在2.4内核中禁止ECN,可以禁止CONFIG_INET_ECN选项并重编内核,也恶意执行下面的命令:

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

3. 为何内核报告0共享内存?

答:是的,处理器仍然在共享内存,但是由于VM在2.4中的改变,CPU变得非常紧张来计算共享内存总量。为了继续使用这个工具,将/proc/meminfo共享内存比变量设置为0.

4. 为何lsmod报告一些模块的使用次数为-1?这是个bug吗?

答:不,这不是一个bug。一个模块如果使用can-unload函数,将报告使用量为-1。

5. 为何内核看不到我的全部内存?

答:现代的内核(2.4)使用现代bios调用可以检测你全部的内存,甚至知道哪些内存是bios自己使用的。你最好的做法就是安装最新的内核。你可以使用mem=xxx启动参数告诉内核你有多少内存,限制你的系统在64M内存下运行。比如你有128M内存,你可以使用mem=128M参数,或者在系统文件/etc/lilo.conf文件中写下该参数。

6. 我已经挂载了文件系统在不同的两个地方,可以工作吗?

答:因为你让内核去这样做,所以它会正常工作。

第十五节 - 编程信仰

1.  为何linux内核使用c和汇编编写?

答:有很多原因,其中一部分原因:当linus开始写linux时,他只有一个386,unix和gcc。还有一部分OS代码使用汇编语言,因为他们对于硬件过于依赖。比如cpu和虚拟内存。

2. 为何我们用汇编不重写Mega666处理器代码?

答:因为我们无法从小路上获得太多,而重写将会失去很多的可维护性和可读性。gcc实际上已经非常高效。你可能指Andrew Tanenbaum的 "Structured Computer Organization"。

3. 为何我们不使用C++重写linux代码?

答:在我们还没有听说Linux的时代,内核曾经由g++编译。这持续了一段时间,知道大家抱怨表现的下降。于是又从g++改成用C代码来实现。这没多大区别,但是已经这么做了。

4. 为何内核如此庞大?为何我们不重写做一个微内核?

答:经验证明,微内核的表现没有庞大的内核来的好。微内核有很多设计问题。这里有项目来把linux内核裁剪为微内核:

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

5. 我们为何不把goto语句替换为C异常?

答:承认,goto非常难看,但是他们常限制在错误路径并用于减少代码量。如果替换会使得代码量增加。由于内核代码需要可读,而不是展示理论,工程准则应该优先考虑。

6. 为何内核开发者轻视新技术?

答:这是一个周期性提出的质疑。一般是在某些争论结束后提出的。一些人注意到内核开发者不喜欢新的想法,并且不会解释原因。这看上去确实是一种轻视,并且给出内核开发者不想学习新技术的印象。应该注意到,内核开发者是很忙的人,他们更喜欢写代码而不是无休止的争论。也许这些开发者已经使用过这些技术,并觉得这些技术不适合。如果你觉得你喜欢的技术有价值就应该自己去证明。不应该要求其他人花时间来证明你的观点。最后,个人观点,写下代码比你读书或者听完一个讨论更有好处。

原文地址:https://www.cnblogs.com/yangv/p/5627316.html