linux 内核邮件列表

第一节 - 通常性问题css

1. 为何有些时候使用“GNU/Linux"而另外一些时候使用“Linux”?html

答:在这个FAQ中,咱们尝试使用“linux”或者“linux kernel”来表示内核,而GNU/Linux用于表示整个GNU/GPL的操做系统软件。咱们须要分清:)linux

       FAQ的目的是提供linux内核更多的信息并避免语义上的歧义。更多GNU软件和linux关系的讨论能够在http://www.gnu.org/gnu/linux-and-gnu.html获取。看上去不少人都忽视了linux内核邮件列表是一个讨论内核相关事情的论坛,而不是讨论整个GNU/Linux。请不要把这方面的邮件发布出去。ios

2.什么是实验内核版本?
答:linux内核版本被划分为两个序列:试验版(奇数序列,如1.3.xx或者2.1.x)以及企业级(如,1.2.xx, 2.0.xx)。这些实验序列用于测试新的功能,算法,驱动。所以,试验内核不是很是稳定,会形成系统稳定或者数据丢失。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. chmod -w *.c

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

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

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

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

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

  1. scripts/patch-kernel .

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

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

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

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

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

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

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

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

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

答:由于Linus但愿这样。这样使得更新补丁更方便,由于目录不用反复的重命名,这对于Linus来讲更方便。

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

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

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

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

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

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

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

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

21. 谁维护内核?

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

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

第二节 - 驱动相关问题

1. 驱动存在问题?

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

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

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

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

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

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

4. 谁维护驱动?

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

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

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

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

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

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

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

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

8. 什么是主驱动号?

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

 9. 为何不支持WinModems?

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

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

10. 现代CPU很是快,为何我本身不能写用户模式中断处理?

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

11. 是否须要针对全部版本发布驱动?

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

第三节 - 邮件相关问题

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    可是,总的来讲,订阅邮件是有好处的。咱们能够知道什么是公认正确的,什么不是。别将这里做为我的的helpdesk。这是一个社区。

4. 存在文件列表吗?

答:

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

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

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

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

8. 在列表中,我能够问什么问题?

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

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

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

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

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

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

    不要使用太大的附件。不少人把.config文件做为附件,这可能会超过1000行,并且还会持续增长。若是你.config的内容有须要加入邮件,那么能够将下面的结果附在邮件附件里:

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

    若是你使用微软Outlook,那么你须要使用下面的补丁:

10. 邮件是否有人管理?

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

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

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

12. 我须要注意其余哪些规则?

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

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

13. 我如何发送邮件?

答:你能够发送邮件到:linux-kernel@vger.kernel.org

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

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

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

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

16. 是否存在NNTP网关?

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

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

答:你能够这样作:

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

18. 若是邮件列表发送了不相干的邮件,我应该怎么作?

答:不理会他。

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

答:有些邮件列表自动增长 “回复:”帮助查看邮件。但这不是个好想法,有几个缘由,这里不想列出。能够查看以下连接:Reply-To: Munging Considered Harmful 。

21. 我能够在邮件列表中招聘工做吗?

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

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

答:有不少缘由,好比,邮件递送出现问题。邮件被阻塞。

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

1. 我如何提交补丁?

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

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

2. 我如何捕捉异常?

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

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

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

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

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

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

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

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

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

    若是你能够,尝试锁定问题到特定的内核版本。这将很是有用。

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

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

7. 我如何编译内核?

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

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

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

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

答:

  1. cat /proc/sys/kernel/tainted

    若是结果为“0”表示没有污染,不然表示被污染。

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

1. 谁负责?

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

2. 为何不作一个Linux内核Team网页,就像其余项目同样?

答:缘由恐怕是由于Linux没有组。一样的,由于全部人都对linux内核作了贡献。最后,linux内核贡献者都很是的低调。

3. 为何下面不回答个人邮件?

答:由于他们太忙了。若是你天天得到1000个邮件,你会怎么作?这不意味着粗鲁。

第六节 - CPU相关问题

1. 最好的linuxCPU是什么?

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

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

第七节 - OS相关问题

1. xxx操做系统有一个很Nice的功能,因此它比GNU/linux强大。

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

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

答:由于它不须要。若是你想,你能够增长这个功能。

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

答:固然,你能够对free软件作任何事。可是CTE-variant好像不是一个free软件吧。

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

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

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

答:有四个缘由:

    1)增长新的功能单元。

    2)增长新的驱动。

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

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

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

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

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

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

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

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

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

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

10. 为何说linux是“World Domination”?

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

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

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

    1)支持Pnp

    2)支持SMP

    3)支持64位

    4)支持POSIX

    5)APM

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

答:对于一些处理器,没法找到时钟频率。所以内核没法经过检测MHz来获取精确时间。Bogomips

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

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

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

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

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

15. 什么是线程?

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

16. 我能够在linux上使用线程吗?

答:固然,Linux内核如今能够clone系统调用,提供了使用线程的库。Xavier Leroy已经为咱们提供了linuxThreads。

    若是你有一个 libc 5系统,你须要安装linuxThreads。

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

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

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

18. GNU/linux机器能够作集群吗?

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

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

19. Linux如何支持SMP?

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

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

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

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

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

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

22. linux网络栈如何工做?

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

23. 咱们可以将网络栈凡在用户空间吗?

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

第八节 - 编译相关问题

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

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

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

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

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

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

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

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

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

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

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

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

对于2.1内核,常被其余版本的编译器编译,可是若是你没法使用推荐编译器请不要抱怨,Linux开发者有不少的工做须要去作,有不少的bug须要处理。请注意,优化选项可能致使更大或者编译更慢的内核。

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

答:通常来讲,使用推荐编译器不会获得警告/错误。可是少数例外:

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

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

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

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

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

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

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

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

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

8. 为什么我报错:符号没法处理,好比foo_ver_foo?

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

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

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

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

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

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

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

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

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

7. 你能够打开多少文件?

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

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

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

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

12. Linux tmpfs怎么样?

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

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

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

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

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

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

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

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

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

答:

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

4. 性能?

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

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

6.什么是__initxxx宏?

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

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

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

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

9. 个人tty设备不工做,出了什么状况?

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

10. 我能使用unix98 ptys吗?

答:若是你有一个内核和libc支持,那就能够。这在linux2.2和glibc2.1中获得支持。

11. Capabilities?

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

 

第十一节 - 文档相关问题

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

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

2. 可否有I/O接口?

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

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

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

4. 什么是linux内核时间?

答:你能够在这里找到相关信息:here.

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

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

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

 

第十二节 - 编程相关问题

1. 何时使用cli()?

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

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

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

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

3. 当禁止中断时我能够调用printk吗?

答:是的,可是你得很是当心。早版本的内核在printk中包含cli-sti对。因此,你须要在调用printk前使能中断。

4. start_bh_atomic和end_bh_atomic()?

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

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

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

6. 我何时须要初始化变量?

答:在读取前,全部变量都须要初始化。

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

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

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

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

答:有时候你会看到:

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

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

3. 为什么个人内核报告中有不少“DriveStatusError Bad CRC”?

答:

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

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

4. 为什么个人内核报告有不少“APIC错误”?

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

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

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

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

2. 当链接网页时,个人2.4内核报告“connection refused”,而以前版本内核工做正常?

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

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

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

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

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

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

5. 为什么内核看不到个人所有内存?

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

6. 我已经挂载了文件系统在不一样的两个地方,能够工做吗?

答:由于你让内核去这样作,因此它会正常工做。

第十五节 - 编程信仰

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

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

2. 为什么咱们用汇编不重写Mega666处理器代码?

答:由于咱们没法从小路上得到太多,而重写将会失去不少的可维护性和可读性。gcc实际上已经很是高效。你可能指Andrew Tanenbaum的 "Structured Computer Organization"。

3. 为什么咱们不使用C++重写linux代码?

答:在咱们尚未据说Linux的时代,内核曾经由g++编译。这持续了一段时间,知道你们抱怨表现的降低。因而又从g++改为用C代码来实现。这没多大区别,可是已经这么作了。

4. 为什么内核如此庞大?为什么咱们不重写作一个微内核?

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

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

5. 咱们为什么不把goto语句替换为C异常?

答:认可,goto很是难看,可是他们常限制在错误路径并用于减小代码量。若是替换会使得代码量增长。因为内核代码须要可读,而不是展现理论,工程准则应该优先考虑。

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

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

相关文章
相关标签/搜索