162306a36Sopenharmony_ci.. _cn_process_howto:
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci.. include:: ../disclaimer-zh_CN.rst
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci:Original: :ref:`Documentation/process/howto.rst <process_howto>`
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci译者::
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci    英文版维护者: Greg Kroah-Hartman <greg@kroah.com>
1062306a36Sopenharmony_ci    中文版维护者: 李阳  Li Yang <leoyang.li@nxp.com>
1162306a36Sopenharmony_ci    中文版翻译者: 李阳  Li Yang <leoyang.li@nxp.com>
1262306a36Sopenharmony_ci                   时奎亮 Alex Shi <alex.shi@linux.alibaba.com>
1362306a36Sopenharmony_ci    中文版校译者:
1462306a36Sopenharmony_ci                   钟宇  TripleX Chung <xxx.phy@gmail.com>
1562306a36Sopenharmony_ci                   陈琦  Maggie Chen <chenqi@beyondsoft.com>
1662306a36Sopenharmony_ci                   王聪  Wang Cong <xiyou.wangcong@gmail.com>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci如何参与Linux内核开发
1962306a36Sopenharmony_ci=====================
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci这是一篇将如何参与Linux内核开发的相关问题一网打尽的终极秘笈。它将指导你
2262306a36Sopenharmony_ci成为一名Linux内核开发者,并且学会如何同Linux内核开发社区合作。它尽可能不
2362306a36Sopenharmony_ci包括任何关于内核编程的技术细节,但会给你指引一条获得这些知识的正确途径。
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci如果这篇文章中的任何内容不再适用,请给文末列出的文件维护者发送补丁。
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci入门
2962306a36Sopenharmony_ci----
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci你想了解如何成为一名Linux内核开发者?或者老板吩咐你“给这个设备写个Linux
3262306a36Sopenharmony_ci驱动程序”?这篇文章的目的就是教会你达成这些目标的全部诀窍,它将描述你需
3362306a36Sopenharmony_ci要经过的流程以及给出如何同内核社区合作的一些提示。它还将试图解释内核社区
3462306a36Sopenharmony_ci为何这样运作。
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciLinux内核大部分是由C语言写成的,一些体系结构相关的代码用到了汇编语言。要
3762306a36Sopenharmony_ci参与内核开发,你必须精通C语言。除非你想为某个架构开发底层代码,否则你并
3862306a36Sopenharmony_ci不需要了解(任何体系结构的)汇编语言。下面列举的书籍虽然不能替代扎实的C
3962306a36Sopenharmony_ci语言教育和多年的开发经验,但如果需要的话,做为参考还是不错的:
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci - "The C Programming Language" by Kernighan and Ritchie [Prentice Hall]
4262306a36Sopenharmony_ci   《C程序设计语言(第2版·新版)》(徐宝文 李志 译)[机械工业出版社]
4362306a36Sopenharmony_ci - "Practical C Programming" by Steve Oualline [O'Reilly]
4462306a36Sopenharmony_ci   《实用C语言编程(第三版)》(郭大海 译)[中国电力出版社]
4562306a36Sopenharmony_ci - "C:  A Reference Manual" by Harbison and Steele [Prentice Hall]
4662306a36Sopenharmony_ci   《C语言参考手册(原书第5版)》(邱仲潘 等译)[机械工业出版社]
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ciLinux内核使用GNU C和GNU工具链开发。虽然它遵循ISO C11标准,但也用到了一些
4962306a36Sopenharmony_ci标准中没有定义的扩展。内核是自给自足的C环境,不依赖于标准C库的支持,所以
5062306a36Sopenharmony_ci并不支持C标准中的部分定义。比如long long类型的大数除法和浮点运算就不允许
5162306a36Sopenharmony_ci使用。有时候确实很难弄清楚内核对工具链的要求和它所使用的扩展,不幸的是目
5262306a36Sopenharmony_ci前还没有明确的参考资料可以解释它们。请查阅gcc信息页(使用“info gcc”命令
5362306a36Sopenharmony_ci显示)获得一些这方面信息。
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci请记住你是在学习怎么和已经存在的开发社区打交道。它由一群形形色色的人组成,
5662306a36Sopenharmony_ci他们对代码、风格和过程有着很高的标准。这些标准是在长期实践中总结出来的,
5762306a36Sopenharmony_ci适应于地理上分散的大型开发团队。它们已经被很好得整理成档,建议你在开发
5862306a36Sopenharmony_ci之前尽可能多的学习这些标准,而不要期望别人来适应你或者你公司的行为方式。
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci法律问题
6262306a36Sopenharmony_ci--------
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ciLinux内核源代码都是在GPL(通用公共许可证)的保护下发布的。要了解这种许可
6562306a36Sopenharmony_ci的细节请查看源代码主目录下的COPYING文件。Linux内核许可准则和如何使用
6662306a36Sopenharmony_ci`SPDX <https://spdx.org/>` 标志符说明在这个文件中
6762306a36Sopenharmony_ci:ref:`Documentation/translations/zh_CN/process/license-rules.rst <cn_kernel_licensing>`
6862306a36Sopenharmony_ci如果你对它还有更深入问题请联系律师,而不要在Linux内核邮件组上提问。因为
6962306a36Sopenharmony_ci邮件组里的人并不是律师,不要期望他们的话有法律效力。
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci对于GPL的常见问题和解答,请访问以下链接:
7262306a36Sopenharmony_ci	https://www.gnu.org/licenses/gpl-faq.html
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci文档
7662306a36Sopenharmony_ci----
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ciLinux内核代码中包含有大量的文档。这些文档对于学习如何与内核社区互动有着
7962306a36Sopenharmony_ci不可估量的价值。当一个新的功能被加入内核,最好把解释如何使用这个功能的文
8062306a36Sopenharmony_ci档也放进内核。当内核的改动导致面向用户空间的接口发生变化时,最好将相关信
8162306a36Sopenharmony_ci息或手册页(manpages)的补丁发到mtk.manpages@gmail.com,以向手册页(manpages)
8262306a36Sopenharmony_ci的维护者解释这些变化。
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci以下是内核代码中需要阅读的文档:
8562306a36Sopenharmony_ci  :ref:`Documentation/admin-guide/README.rst <readme>`
8662306a36Sopenharmony_ci    文件简要介绍了Linux内核的背景,并且描述了如何配置和编译内核。内核的
8762306a36Sopenharmony_ci    新用户应该从这里开始。
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci  :ref:`Documentation/process/changes.rst <changes>`
9162306a36Sopenharmony_ci    文件给出了用来编译和使用内核所需要的最小软件包列表。
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci  :ref:`Documentation/translations/zh_CN/process/coding-style.rst <cn_codingstyle>`
9462306a36Sopenharmony_ci    描述Linux内核的代码风格和理由。所有新代码需要遵守这篇文档中定义的规
9562306a36Sopenharmony_ci    范。大多数维护者只会接收符合规定的补丁,很多人也只会帮忙检查符合风格
9662306a36Sopenharmony_ci    的代码。
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci  :ref:`Documentation/translations/zh_CN/process/submitting-patches.rst <cn_submittingpatches>`
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci    这两份文档明确描述如何创建和发送补丁,其中包括(但不仅限于):
10162306a36Sopenharmony_ci       - 邮件内容
10262306a36Sopenharmony_ci       - 邮件格式
10362306a36Sopenharmony_ci       - 选择收件人
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci    遵守这些规定并不能保证提交成功(因为所有补丁需要通过严格的内容和风格
10662306a36Sopenharmony_ci    审查),但是忽视他们几乎就意味着失败。
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci    其他关于如何正确地生成补丁的优秀文档包括:
10962306a36Sopenharmony_ci    "The Perfect Patch"
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci        https://www.ozlabs.org/~akpm/stuff/tpp.txt
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci    "Linux kernel patch submission format"
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci        https://web.archive.org/web/20180829112450/http://linux.yyz.us/patch-format.html
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci  :ref:`Documentation/translations/zh_CN/process/stable-api-nonsense.rst <cn_stable_api_nonsense>`
11862306a36Sopenharmony_ci    论证内核为什么特意不包括稳定的内核内部API,也就是说不包括像这样的特
11962306a36Sopenharmony_ci    性:
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci       - 子系统中间层(为了兼容性?)
12262306a36Sopenharmony_ci       - 在不同操作系统间易于移植的驱动程序
12362306a36Sopenharmony_ci       - 减缓(甚至阻止)内核代码的快速变化
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci    这篇文档对于理解Linux的开发哲学至关重要。对于将开发平台从其他操作系
12662306a36Sopenharmony_ci    统转移到Linux的人来说也很重要。
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci  :ref:`Documentation/process/security-bugs.rst <securitybugs>`
12962306a36Sopenharmony_ci    如果你认为自己发现了Linux内核的安全性问题,请根据这篇文档中的步骤来
13062306a36Sopenharmony_ci    提醒其他内核开发者并帮助解决这个问题。
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci  :ref:`Documentation/translations/zh_CN/process/management-style.rst <cn_managementstyle>`
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci    描述内核维护者的工作方法及其共有特点。这对于刚刚接触内核开发(或者对
13562306a36Sopenharmony_ci    它感到好奇)的人来说很重要,因为它解释了很多对于内核维护者独特行为的
13662306a36Sopenharmony_ci    普遍误解与迷惑。
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci  :ref:`Documentation/process/stable-kernel-rules.rst <stable_kernel_rules>`
13962306a36Sopenharmony_ci    解释了稳定版内核发布的规则,以及如何将改动放入这些版本的步骤。
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci  :ref:`Documentation/process/kernel-docs.rst <kernel_docs>`
14262306a36Sopenharmony_ci    有助于内核开发的外部文档列表。如果你在内核自带的文档中没有找到你想找
14362306a36Sopenharmony_ci    的内容,可以查看这些文档。
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci  :ref:`Documentation/process/applying-patches.rst <applying_patches>`
14662306a36Sopenharmony_ci    关于补丁是什么以及如何将它打在不同内核开发分支上的好介绍
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci内核还拥有大量从代码自动生成或者从 ReStructuredText(ReST) 标记生成的文档,
14962306a36Sopenharmony_ci比如这个文档,它包含内核内部API的全面介绍以及如何妥善处理加锁的规则。所有
15062306a36Sopenharmony_ci这些文档都可以通过运行以下命令从内核代码中生成为PDF或HTML文档::
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci    make pdfdocs
15362306a36Sopenharmony_ci    make htmldocs
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ciReST格式的文档会生成在 Documentation/output. 目录中。
15662306a36Sopenharmony_ci它们也可以用下列命令生成 LaTeX 和 ePub 格式文档::
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci    make latexdocs
15962306a36Sopenharmony_ci    make epubdocs
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci如何成为内核开发者
16262306a36Sopenharmony_ci------------------
16362306a36Sopenharmony_ci如果你对Linux内核开发一无所知,你应该访问“Linux内核新手”计划:
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	https://kernelnewbies.org
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci它拥有一个可以问各种最基本的内核开发问题的邮件列表(在提问之前一定要记得
16862306a36Sopenharmony_ci查找已往的邮件,确认是否有人已经回答过相同的问题)。它还拥有一个可以获得
16962306a36Sopenharmony_ci实时反馈的IRC聊天频道,以及大量对于学习Linux内核开发相当有帮助的文档。
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci网站简要介绍了源代码组织结构、子系统划分以及目前正在进行的项目(包括内核
17262306a36Sopenharmony_ci中的和单独维护的)。它还提供了一些基本的帮助信息,比如如何编译内核和打补
17362306a36Sopenharmony_ci丁。
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci如果你想加入内核开发社区并协助完成一些任务,却找不到从哪里开始,可以访问
17662306a36Sopenharmony_ci“Linux内核房管员”计划:
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	https://kernelnewbies.org/KernelJanitors
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci这是极佳的起点。它提供一个相对简单的任务列表,列出内核代码中需要被重新
18162306a36Sopenharmony_ci整理或者改正的地方。通过和负责这个计划的开发者们一同工作,你会学到将补丁
18262306a36Sopenharmony_ci集成进内核的基本原理。如果还没有决定下一步要做什么的话,你还可能会得到方
18362306a36Sopenharmony_ci向性的指点。
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci在真正动手修改内核代码之前,理解要修改的代码如何运作是必需的。要达到这个
18662306a36Sopenharmony_ci目的,没什么办法比直接读代码更有效了(大多数花招都会有相应的注释),而且
18762306a36Sopenharmony_ci一些特制的工具还可以提供帮助。例如,“Linux代码交叉引用”项目就是一个值得
18862306a36Sopenharmony_ci特别推荐的帮助工具,它将源代码显示在有编目和索引的网页上。其中一个更新及
18962306a36Sopenharmony_ci时的内核源码库,可以通过以下地址访问:
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci        https://elixir.bootlin.com/
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci开发流程
19562306a36Sopenharmony_ci--------
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci目前Linux内核开发流程包括几个“主内核分支”和很多子系统相关的内核分支。这
19862306a36Sopenharmony_ci些分支包括:
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci  - Linus 的内核源码树
20162306a36Sopenharmony_ci  - 多个主要版本的稳定版内核树
20262306a36Sopenharmony_ci  - 子系统相关的内核树
20362306a36Sopenharmony_ci  - linux-next 集成测试树
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci主线树
20762306a36Sopenharmony_ci------
20862306a36Sopenharmony_ci主线树是由Linus Torvalds 维护的。你可以在https://kernel.org 网站或者代码
20962306a36Sopenharmony_ci库中下找到它。它的开发遵循以下步骤:
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci  - 每当一个新版本的内核被发布,为期两周的集成窗口将被打开。在这段时间里
21262306a36Sopenharmony_ci    维护者可以向Linus提交大段的修改,通常这些修改已经被放到-mm内核中几个
21362306a36Sopenharmony_ci    星期了。提交大量修改的首选方式是使用git工具(内核的代码版本管理工具
21462306a36Sopenharmony_ci    ,更多的信息可以在 https://git-scm.com/ 获取),不过使用普通补丁也是
21562306a36Sopenharmony_ci    可以的。
21662306a36Sopenharmony_ci  - 两个星期以后-rc1版本内核发布。之后只有不包含可能影响整个内核稳定性的
21762306a36Sopenharmony_ci    新功能的补丁才可能被接受。请注意一个全新的驱动程序(或者文件系统)有
21862306a36Sopenharmony_ci    可能在-rc1后被接受是因为这样的修改完全独立,不会影响其他的代码,所以
21962306a36Sopenharmony_ci    没有造成内核退步的风险。在-rc1以后也可以用git向Linus提交补丁,不过所
22062306a36Sopenharmony_ci    有的补丁需要同时被发送到相应的公众邮件列表以征询意见。
22162306a36Sopenharmony_ci  - 当Linus认为当前的git源码树已经达到一个合理健全的状态足以发布供人测试
22262306a36Sopenharmony_ci    时,一个新的-rc版本就会被发布。计划是每周都发布新的-rc版本。
22362306a36Sopenharmony_ci  - 这个过程一直持续下去直到内核被认为达到足够稳定的状态,持续时间大概是
22462306a36Sopenharmony_ci    6个星期。
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci关于内核发布,值得一提的是Andrew Morton在linux-kernel邮件列表中如是说:
22762306a36Sopenharmony_ci	“没有人知道新内核何时会被发布,因为发布是根据已知bug的情况来决定
22862306a36Sopenharmony_ci	的,而不是根据一个事先制定好的时间表。”
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci子系统特定树
23162306a36Sopenharmony_ci------------
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci各种内核子系统的维护者——以及许多内核子系统开发人员——在源代码库中公开了他们
23462306a36Sopenharmony_ci当前的开发状态。这样,其他人就可以看到内核的不同区域发生了什么。在开发速度
23562306a36Sopenharmony_ci很快的领域,可能会要求开发人员将提交的内容建立在这样的子系统内核树上,这样
23662306a36Sopenharmony_ci就避免了提交与其他已经进行的工作之间的冲突。
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci这些存储库中的大多数都是Git树,但是也有其他的scm在使用,或者补丁队列被发布
23962306a36Sopenharmony_ci为Quilt系列。这些子系统存储库的地址列在MAINTAINERS文件中。其中许多可以在
24062306a36Sopenharmony_cihttps://git.kernel.org/上浏览。
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci在将一个建议的补丁提交到这样的子系统树之前,需要对它进行审查,审查主要发生
24362306a36Sopenharmony_ci在邮件列表上(请参见下面相应的部分)。对于几个内核子系统,这个审查过程是通
24462306a36Sopenharmony_ci过工具补丁跟踪的。Patchwork提供了一个Web界面,显示补丁发布、对补丁的任何评
24562306a36Sopenharmony_ci论或修订,维护人员可以将补丁标记为正在审查、接受或拒绝。大多数补丁网站都列
24662306a36Sopenharmony_cihttps://patchwork.kernel.org/
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ciLinux-next 集成测试树
24962306a36Sopenharmony_ci---------------------
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci在将子系统树的更新合并到主线树之前,需要对它们进行集成测试。为此,存在一个
25262306a36Sopenharmony_ci特殊的测试存储库,其中几乎每天都会提取所有子系统树:
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci        https://git.kernel.org/?p=linux/kernel/git/next/linux-next.git
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci通过这种方式,Linux-next 对下一个合并阶段将进入主线内核的内容给出了一个概要
25762306a36Sopenharmony_ci展望。非常欢迎冒险的测试者运行测试Linux-next。
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci多个主要版本的稳定版内核树
26062306a36Sopenharmony_ci-----------------------------------
26162306a36Sopenharmony_ci由3个数字组成的内核版本号说明此内核是-stable版本。它们包含内核的相对较小且
26262306a36Sopenharmony_ci至关重要的修补,这些修补针对安全性问题或者严重的内核退步。
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci这种版本的内核适用于那些期望获得最新的稳定版内核并且不想参与测试开发版或
26562306a36Sopenharmony_ci者实验版的用户。
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci稳定版内核树版本由“稳定版”小组(邮件地址<stable@vger.kernel.org>)维护,一般
26862306a36Sopenharmony_ci隔周发布新版本。
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci内核源码中的 :ref:`Documentation/process/stable-kernel-rules.rst <stable_kernel_rules>`
27162306a36Sopenharmony_ci文件具体描述了可被稳定版内核接受的修改类型以及发布的流程。
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci报告bug
27562306a36Sopenharmony_ci-------
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_cibugzilla.kernel.org是Linux内核开发者们用来跟踪内核Bug的网站。我们鼓励用
27862306a36Sopenharmony_ci户在这个工具中报告找到的所有bug。如何使用内核bugzilla的细节请访问:
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci	http://test.kernel.org/bugzilla/faq.html
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci内核源码主目录中的:ref:`admin-guide/reporting-bugs.rst <reportingbugs>`
28362306a36Sopenharmony_ci文件里有一个很好的模板。它指导用户如何报告可能的内核bug以及需要提供哪些信息
28462306a36Sopenharmony_ci来帮助内核开发者们找到问题的根源。
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci利用bug报告
28862306a36Sopenharmony_ci-----------
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci练习内核开发技能的最好办法就是修改其他人报告的bug。你不光可以帮助内核变
29162306a36Sopenharmony_ci得更加稳定,还可以学会如何解决实际问题从而提高自己的技能,并且让其他开发
29262306a36Sopenharmony_ci者感受到你的存在。修改bug是赢得其他开发者赞誉的最好办法,因为并不是很多
29362306a36Sopenharmony_ci人都喜欢浪费时间去修改别人报告的bug。
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci要尝试修改已知的bug,请访问 http://bugzilla.kernel.org 网址。
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci邮件列表
29962306a36Sopenharmony_ci--------
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci正如上面的文档所描述,大多数的骨干内核开发者都加入了Linux Kernel邮件列
30262306a36Sopenharmony_ci表。如何订阅和退订列表的细节可以在这里找到:
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci	http://vger.kernel.org/vger-lists.html#linux-kernel
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci网上很多地方都有这个邮件列表的存档(archive)。可以使用搜索引擎来找到这些
30762306a36Sopenharmony_ci存档。比如:
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci	https://lore.kernel.org/lkml/
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci在发信之前,我们强烈建议你先在存档中搜索你想要讨论的问题。很多已经被详细
31262306a36Sopenharmony_ci讨论过的问题只在邮件列表的存档中可以找到。
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci大多数内核子系统也有自己独立的邮件列表来协调各自的开发工作。从
31562306a36Sopenharmony_ciMAINTAINERS文件中可以找到不同话题对应的邮件列表。
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci很多邮件列表架设在kernel.org服务器上。这些列表的信息可以在这里找到:
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci	http://vger.kernel.org/vger-lists.html
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci在使用这些邮件列表时,请记住保持良好的行为习惯。下面的链接提供了与这些列
32262306a36Sopenharmony_ci表(或任何其它邮件列表)交流的一些简单规则,虽然内容有点滥竽充数。
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci	http://www.albion.com/netiquette/
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci当有很多人回复你的邮件时,邮件的抄送列表会变得很长。请不要将任何人从抄送
32762306a36Sopenharmony_ci列表中删除,除非你有足够的理由这么做。也不要只回复到邮件列表。请习惯于同
32862306a36Sopenharmony_ci一封邮件接收两次(一封来自发送者一封来自邮件列表),而不要试图通过添加一
32962306a36Sopenharmony_ci些奇特的邮件头来解决这个问题,人们不会喜欢的。
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci记住保留你所回复内容的上下文和源头。在你回复邮件的顶部保留“某某某说到……”
33262306a36Sopenharmony_ci这几行。将你的评论加在被引用的段落之间而不要放在邮件的顶部。
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci如果你在邮件中附带补丁,请确认它们是可以直接阅读的纯文本(如
33562306a36Sopenharmony_ci:ref:`Documentation/translations/zh_CN/process/submitting-patches.rst <cn_submittingpatches>`
33662306a36Sopenharmony_ci文档中所述)。内核开发者们不希望遇到附件或者被压缩了的补丁。只有这样才能
33762306a36Sopenharmony_ci保证他们可以直接评论你的每行代码。请确保你使用的邮件发送程序不会修改空格
33862306a36Sopenharmony_ci和制表符。一个防范性的测试方法是先将邮件发送给自己,然后自己尝试是否可以
33962306a36Sopenharmony_ci顺利地打上收到的补丁。如果测试不成功,请调整或者更换你的邮件发送程序直到
34062306a36Sopenharmony_ci它正确工作为止。
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci总而言之,请尊重其他的邮件列表订阅者。
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci同内核社区合作
34662306a36Sopenharmony_ci----------------
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci内核社区的目标就是提供尽善尽美的内核。所以当你提交补丁期望被接受进内核的
34962306a36Sopenharmony_ci时候,它的技术价值以及其他方面都将被评审。那么你可能会得到什么呢?
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci  - 批评
35262306a36Sopenharmony_ci  - 评论
35362306a36Sopenharmony_ci  - 要求修改
35462306a36Sopenharmony_ci  - 要求证明修改的必要性
35562306a36Sopenharmony_ci  - 沉默
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci要记住,这些是把补丁放进内核的正常情况。你必须学会听取对补丁的批评和评论,
35862306a36Sopenharmony_ci从技术层面评估它们,然后要么重写你的补丁要么简明扼要地论证修改是不必要
35962306a36Sopenharmony_ci的。如果你发的邮件没有得到任何回应,请过几天后再试一次,因为有时信件会湮
36062306a36Sopenharmony_ci没在茫茫信海中。
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci你不应该做的事情:
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci  - 期望自己的补丁不受任何质疑就直接被接受
36562306a36Sopenharmony_ci  - 翻脸
36662306a36Sopenharmony_ci  - 忽略别人的评论
36762306a36Sopenharmony_ci  - 没有按照别人的要求做任何修改就重新提交
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci在一个努力追寻最好技术方案的社区里,对于一个补丁有多少好处总会有不同的见
37062306a36Sopenharmony_ci解。你必须要抱着合作的态度,愿意改变自己的观点来适应内核的风格。或者至少
37162306a36Sopenharmony_ci愿意去证明你的想法是有价值的。记住,犯错误是允许的,只要你愿意朝着正确的
37262306a36Sopenharmony_ci方案去努力。
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci如果你的第一个补丁换来的是一堆修改建议,这是很正常的。这并不代表你的补丁
37562306a36Sopenharmony_ci不会被接受,也不意味着有人和你作对。你只需要改正所有提出的问题然后重新发
37662306a36Sopenharmony_ci送你的补丁。
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci内核社区和公司文化的差异
37962306a36Sopenharmony_ci------------------------
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci内核社区的工作模式同大多数传统公司开发队伍的工作模式并不相同。下面这些例
38262306a36Sopenharmony_ci子,可以帮助你避免某些可能发生问题:
38362306a36Sopenharmony_ci用这些话介绍你的修改提案会有好处:(在任何时候你都不应该用中文写提案)
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci    - 它同时解决了多个问题
38662306a36Sopenharmony_ci    - 它删除了2000行代码
38762306a36Sopenharmony_ci    - 这是补丁,它已经解释了我想要说明的
38862306a36Sopenharmony_ci    - 我在5种不同的体系结构上测试过它……
38962306a36Sopenharmony_ci    - 这是一系列小补丁用来……
39062306a36Sopenharmony_ci    - 这个修改提高了普通机器的性能……
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ci应该避免如下的说法:
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci    - 我们在AIX/ptx/Solaris就是这么做的,所以这么做肯定是好的……
39562306a36Sopenharmony_ci    - 我做这行已经20年了,所以……
39662306a36Sopenharmony_ci    - 为了我们公司赚钱考虑必须这么做
39762306a36Sopenharmony_ci    - 这是我们的企业产品线所需要的
39862306a36Sopenharmony_ci    - 这里是描述我观点的1000页设计文档
39962306a36Sopenharmony_ci    - 这是一个5000行的补丁用来……
40062306a36Sopenharmony_ci    - 我重写了现在乱七八糟的代码,这就是……
40162306a36Sopenharmony_ci    - 我被规定了最后期限,所以这个补丁需要立刻被接受
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci另外一个内核社区与大部分传统公司的软件开发队伍不同的地方是无法面对面地交
40462306a36Sopenharmony_ci流。使用电子邮件和IRC聊天工具做为主要沟通工具的一个好处是性别和种族歧视
40562306a36Sopenharmony_ci将会更少。Linux内核的工作环境更能接受妇女和少数族群,因为每个人在别人眼
40662306a36Sopenharmony_ci里只是一个邮件地址。国际化也帮助了公平的实现,因为你无法通过姓名来判断人
40762306a36Sopenharmony_ci的性别。男人有可能叫李丽,女人也有可能叫王刚。大多数在Linux内核上工作过
40862306a36Sopenharmony_ci并表达过看法的女性对在linux上工作的经历都给出了正面的评价。
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci对于一些不习惯使用英语的人来说,语言可能是一个引起问题的障碍。在邮件列表
41162306a36Sopenharmony_ci中要正确地表达想法必需良好地掌握语言,所以建议你在发送邮件之前最好检查一
41262306a36Sopenharmony_ci下英文写得是否正确。
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci拆分修改
41662306a36Sopenharmony_ci--------
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_ciLinux内核社区并不喜欢一下接收大段的代码。修改需要被恰当地介绍、讨论并且
41962306a36Sopenharmony_ci拆分成独立的小段。这几乎完全和公司中的习惯背道而驰。你的想法应该在开发最
42062306a36Sopenharmony_ci开始的阶段就让大家知道,这样你就可以及时获得对你正在进行的开发的反馈。这
42162306a36Sopenharmony_ci样也会让社区觉得你是在和他们协作,而不是仅仅把他们当作倾销新功能的对象。
42262306a36Sopenharmony_ci无论如何,你不要一次性地向邮件列表发送50封信,你的补丁序列应该永远用不到
42362306a36Sopenharmony_ci这么多。
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_ci将补丁拆开的原因如下:
42662306a36Sopenharmony_ci
42762306a36Sopenharmony_ci1) 小的补丁更有可能被接受,因为它们不需要太多的时间和精力去验证其正确性。
42862306a36Sopenharmony_ci   一个5行的补丁,可能在维护者看了一眼以后就会被接受。而500行的补丁则
42962306a36Sopenharmony_ci   需要数个小时来审查其正确性(所需时间随补丁大小增加大约呈指数级增长)。
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ci   当出了问题的时候,小的补丁也会让调试变得非常容易。一个一个补丁地回溯
43262306a36Sopenharmony_ci   将会比仔细剖析一个被打上的大补丁(这个补丁破坏了其他东西)容易得多。
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci2)不光发送小的补丁很重要,在提交之前重新编排、化简(或者仅仅重新排列)
43562306a36Sopenharmony_ci   补丁也是很重要的。
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci这里有内核开发者Al Viro打的一个比方:
43862306a36Sopenharmony_ci	“想象一个老师正在给学生批改数学作业。老师并不希望看到学生为了得
43962306a36Sopenharmony_ci	到正确解法所进行的尝试和产生的错误。他希望看到的是最干净最优雅的
44062306a36Sopenharmony_ci	解答。好学生了解这点,绝不会把最终解决之前的中间方案提交上去。”
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci	内核开发也是这样。维护者和评审者不希望看到一个人在解决问题时的思
44362306a36Sopenharmony_ci	考过程。他们只希望看到简单和优雅的解决方案。
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_ci直接给出一流的解决方案,和社区一起协作讨论尚未完成的工作,这两者之间似乎
44662306a36Sopenharmony_ci很难找到一个平衡点。所以最好尽早开始收集有利于你进行改进的反馈;同时也要
44762306a36Sopenharmony_ci保证修改分成很多小块,这样在整个项目都准备好被包含进内核之前,其中的一部
44862306a36Sopenharmony_ci分可能会先被接收。
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci你必须明白这么做是无法令人接受的:试图将不完整的代码提交进内核,然后再找
45162306a36Sopenharmony_ci时间修复。
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci证明修改的必要性
45562306a36Sopenharmony_ci----------------
45662306a36Sopenharmony_ci除了将补丁拆成小块,很重要的一点是让Linux社区了解他们为什么需要这样修改。
45762306a36Sopenharmony_ci你必须证明新功能是有人需要的并且是有用的。
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_ci记录修改
46162306a36Sopenharmony_ci--------
46262306a36Sopenharmony_ci
46362306a36Sopenharmony_ci当你发送补丁的时候,需要特别留意邮件正文的内容。因为这里的信息将会做为补
46462306a36Sopenharmony_ci丁的修改记录(ChangeLog),会被一直保留以备大家查阅。它需要完全地描述补丁,
46562306a36Sopenharmony_ci包括:
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci  - 为什么需要这个修改
46862306a36Sopenharmony_ci  - 补丁的总体设计
46962306a36Sopenharmony_ci  - 实现细节
47062306a36Sopenharmony_ci  - 测试结果
47162306a36Sopenharmony_ci
47262306a36Sopenharmony_ci想了解它具体应该看起来像什么,请查阅以下文档中的“ChangeLog”章节:
47362306a36Sopenharmony_ci  “The Perfect Patch”
47462306a36Sopenharmony_ci  	 https://www.ozlabs.org/~akpm/stuff/tpp.txt
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci这些事情有时候做起来很难。想要在任何方面都做到完美可能需要好几年时间。这
47862306a36Sopenharmony_ci是一个持续提高的过程,它需要大量的耐心和决心。只要不放弃,你一定可以做到。
47962306a36Sopenharmony_ci很多人已经做到了,而他们都曾经和现在的你站在同样的起点上。
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_ci感谢
48362306a36Sopenharmony_ci----
48462306a36Sopenharmony_ci感谢Paolo Ciarrocchi允许“开发流程”部分基于他所写的文章
48562306a36Sopenharmony_ci(http://www.kerneltravel.net/newbie/2.6-development_process),感谢Randy
48662306a36Sopenharmony_ciDunlap和Gerrit Huizenga完善了应该说和不该说的列表。感谢Pat Mochel, Hanna
48762306a36Sopenharmony_ciLinder, Randy Dunlap, Kay Sievers, Vojtech Pavlik, Jan Kara, Josh Boyer,
48862306a36Sopenharmony_ciKees Cook, Andrew Morton, Andi Kleen, Vadim Lobanov, Jesper Juhl, Adrian
48962306a36Sopenharmony_ciBunk, Keri Harris, Frans Pop, David A. Wheeler, Junio Hamano, Michael
49062306a36Sopenharmony_ciKerrisk和Alex Shepard的评审、建议和贡献。没有他们的帮助,这篇文档是不可
49162306a36Sopenharmony_ci能完成的。
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ci英文版维护者: Greg Kroah-Hartman <greg@kroah.com>
496