Linux内核

塔能鲍姆-林纳斯辩论

Linux不是微内核架构的事实曾经引起了林纳斯·托瓦兹与安德鲁·斯图尔特·塔能鲍姆之间一场著名的争论。1992年在Usenet讨论组群comp.os.minix开始了一场网络论战，讨论的主题在于操作系统架构的选择。稍后一些著名的黑客也加入讨论，如大卫·米勒、曹子德。这场辩论影响了Linux内核的设计走向。塔能鲍姆认为Linux内核采用的宏内核已经过时了，应该采取比较先进的微内核架构，引起了林纳斯的反击。
在2006年5月9日，这个主题被重新审视，并且在2006年5月12日塔能鲍姆写了一份立场声明。

编程语言

Linux是用C语言中的GCC版（这种C语言有对标准C进行扩展）写的，还有几个用汇编语言（用的是GCC的"AT&T风格"）写的目标架构短段。因为要支持扩展的C语言，GCC在很长的时间里是唯一一个能正确编译Linux的编译器。有许多其他的语言用在一些方面上，主要集中在内核构建过程中（这里指从源代码创建可引导镜像）。包括Perl、Python和多种脚本语言。有一些驱动可能是用C++、Fortran或其他语言写的，但是这样是强烈不建议的。

编译器兼容性

GCC是Linux内核源代码的缺省编译器。在2004年，Intel主张通过修改内核，以便Intel C++编译器能正确编译内核。在2009年，有通过修改内核2.6.22版而成功编译的报告（并带来平均8-9%性能增长）。
自从2010年，已经开始进行使用Clang建造Linux内核的努力，Clang是一个可作为替代的C语言编译器；截止2014年4月12日，官方内核几乎可以完全用Clang编译。致力于这个目标的计划叫做“LLVMLinux”，得名于Clang所基于的LLVM编译器下部构造。LLVMLinux不意图复制Linux内核或LLVM，因此它是由最终提交给上游计划的补丁构成的一个元计划。使Linux内核可以用Clang编译最大的好处是比GCC有更快的编译速度，内核开发者可以得益于由此而来的更快的工作流程。

接口

符合标准是Linux内核内部的普遍策略。另一个规则是Linux内核主线不接受只由专有用户空间软件使用的内核模块。

内核至用户空间API

源代码可移植性确保符合标准的C程序可以在符合同样标准的任何系统上编译和运行。Linux内核开发、GNU C函数库和相关的实用工具致力于追随POSIX和单一UNIX规范。Linux内核API是内核的系统调用接口。

内核至用户空间ABI

二进制可移植性将保证任何程序在符合标准的给定硬件平台上一旦编译通过，可以在符合同样标准的任何其他硬件平台上以编译后的形式运行。二进制可移植性是在基于Linux内核的操作系统上建造独立软件供应商（ISV）应用有商业可行性的本质要求。现有唯一的二进制兼容标准是Linux标准规范（LSB）。

内核内ABI

Linux内核开发者选择不维护稳定的内核内ABI。

抢占式调度系统

Linux内核提供在特定条件下的抢先式调度。直到内核版本2.4，只有用户进程是抢先式的，就是说除了时间片用尽，在用户模式下执行的当前进程，如果有更高态优先级的进程进入TASK_RUNNING状态，它就会被中断。自从2.6系列Linux内核，增加了中断执行内核代码的任务的能力，但不是对于内核代码的所有段落。
Linux内核含有不同的调度器类。内核缺省使用的调度机制叫做完全公平调度器，它介入于内核版本2.6.23。这个缺省调度器类在内部也叫做SCHED_OTHER，而内核还含有两个遵循POSIX的实时调度类，分别叫做SCHED_FIFO（实时先进先出）和SCHED_RR（实时轮流式），二者都优先于缺省类。
通过使用实时Linux内核补丁PREEMPT_RT，可以支持对关键段落、中断处理器和“中断禁用”代码序列的完全抢先。 实时Linux内核补丁部分地集成入主线内核已经带给它一些功能。抢先机制改善延迟、增进响应性，并使得Linux更加适合桌面和实时应用。老版本内核有所谓的巨锁，用于锁定粒度为整个内核的同步，它最终由Arnd Bergmann在2011年移除了。
还有叫做SCHED_DEADLINE的调度策略，实现了最近截止期限最先（EDF）算法，它增加于2014年3月30日发行的内核版本3.14。

可移植性

尽管林纳斯·托瓦兹的初衷不是使Linux成为一个可移植的操作系统，今天的Linux却是全球被最广泛移植的操作系统内核。从移动电话到超级计算机，甚至于有人成功的将Linux内核在索尼出品的游戏机PS2及PS3和微软出品的游戏机Xbox上使用。Linux也是IBM超级计算机Blue Gene的操作系统。直至2011年11月，全球前五百大超级计算机（TOP500）有高达91.4%的比例采用Linux为它们的操作系统。一些为手机开发的操作系统，使用Linux内核的修改后的版本，其中包括谷歌Android、Firefox OS、HP WebOS和诺基亚Maemo。

内核错误和oops

在Linux中，内核错误（Kernel panic）是指操作系统在监测到内核系统内部无法恢复的错误，相对于在用户空间代码类似的错误。操作系统试图读写无效或不允许的内存地址是导致内核错误的一个常见原因。内核错误也有可能在遇到硬件错误或操作系统BUG时发生。在许多情况中，操作系统可以在内存访问违例发生时继续运行。然而，系统处于不稳定状态时，操作系统通常会停止工作以避免造成破坏安全和数据损坏的风险，并提供错误的诊断信息。
在Linux上，oops即Linux内核的行为不正确，并产生了一份相关的错误日志。许多类型的oops会导致内核错误，即令系统立即停止工作，但部分oops也允许继续操作，作为与稳定性的妥协。这个概念只代表一个简单的错误。当内核检测到问题时，它会打印一个oops信息然后杀死全部相关进程。oops信息可以帮助Linux内核工程师调试，检测oops出现的条件，并修复导致oops的程序错误。

安全

计算机安全是一个非常公众化的主题，关系到Linux内核，因为大量在内核中的错误可能成为潜在的安全漏洞，是否允许提升权限漏洞或拒绝服务攻击源漏洞。在过去的几年中，许多这样的缺陷被发现，并在Linux内核中被修补好。新的安全功能被继续实现，以解决在Linux内核中的计算机不安全问题。
批评者指责内核开发人员，称他们掩盖（至少并未公布）安全漏洞。2008年，作为回应，Torvalds称：“个人认为，安全漏洞只是‘正常的漏洞’。这些漏洞我并不去掩盖，不过我不认为应当把它们特殊化，更不认为应该追踪并公示它们……我不理会整个安全团队，原因之一就是，我认为这些漏洞不仅美化还鼓励了错误的行为。这令安全人员成了‘英雄’，就犹如不修补正常漏洞的人就不值一提似的。而事实上，所有无聊的正常漏洞极为重要，仅仅因为它们实在太多了。我不认为该美化和关心那些严重的安全漏洞——它们并不及那些由死锁造成的随机严重崩溃来得更特殊。”
如2012年五月，SYSRET指令被发现在AMD和英特尔处理器间在实现方面有差异，这个差异在Windows、FreeBSD、XenServer和Solaris这些主流操作系统会导致漏洞。2012年六月，Linux内核中该问题已被修复。

开发

内核版本

开发者社区

截止2007年，内核开发已经从20位最活跃开发者写80%的代码转变为顶端30人写30%的代码，而顶端开发者花费更多的时间审核变更。 开发者还可以按从属关系来归类；在2007年，顶端类属是“不知名”而顶端公司是Red Hat，它占有12%的贡献，而知名业余爱好者占3.9%。 在2007年中所做内核变更已经由超过1900位开发者提交。一般假定Linux内核开发者社区由5000或6000名成员组成。
Linux基金会发表的2016年Linux内核开发报告的更新表明，从版本3.18（2014年12月）至4.7（2016年7月）期间：平均每次发行有来自200-250个公司的大约1500位开发者作出贡献。顶端30位开发者贡献了稍大于16%的代码。在公司中，顶端贡献者是Intel（12.9%）和Red Hat（8.0%），第三和第四位为“none”（7.7%）和“unknown”（6.8%）类属。

开发过程与模式

一个想要对Linux 内核进行修改的开发者一般就从对那个修改的开发和测试开始着手。接下来的过程取决于变化的重要程度，及修改该变更的子系统数量是由单个还是多个修补程序组成。如果仅仅是修改了由单个维护人员维护的单个子系统，那么这些修改的补丁代码就直接通过Cc中某个邮件列表发送给相关的维护人员。邮件列表的阅读者和子系统的维护人员将检查补丁代码并提供反馈。一旦审查过程完成，维护者接受他内核代码树中的补丁。如果这些更改被认为是够重要的错误修复，那么包含这些修补程序的拉取请求（pull request）将在几天内发送给Linus。否则，将在下一个合并窗口时向Linus发送拉取请求。合并窗口通常会持续两周，并在之前的内核版本发布后立即启动。
Linus Torvalds拥有对Linux内核能够接受哪些更改和谁可以成为维护者的最终决定权。内核维护者在他们自愿放弃之前将维持他们的角色。当前，没有任何已知的内核维护者被要求退出。此外，还没有一个内核维护者因与其他维护者的交互风格的因素而受到Linus批评的例子。这为维护者提供了宽松的社区空间。虽然内核开发社区的文化多年来有所改善，但曾有一段时间它的声誉很糟糕。认为自己遭受了不公正对待的开发者可以向Linux基金会的技术专家委员会报告。尽管如此，一些社区成员仍然不认同现在的讨论氛围。

同 Linux 发行版的关系

大多数Linux用户运行一个由他们Linux 发行版提供的内核。一些发行版搭载的是Linux 的通用内核（也就是“vanilla”或“stable”）版本。不过，一些Linux内核发行商（如Red Hat和SUSE）会维护他们自己的内核分支。这些发行商分支的内核版本通常相对于稳定版本（vanilla）而言更新的速度更慢一些，但是同样会包括所有相关的稳定版本分支的补丁。此外，他们同时也会增添一些新特性和对新硬件的支持，而这些支持是这些发行商分支基于的稳定分支所不包括的。

重新开发的估价

按照传统商业软件开发的方式，重新开发Linux 2.6.0内核的估计代价将是6.12亿美元（4.67亿欧元、3.94亿英镑），以2004年的COCOMO人月估计模型.在2006年，欧盟资助的一项研究表明，重新开发Linux 2.6.8以后的内核，代价是8.82亿欧元（11.4亿美元、7.44亿英镑）。
截至2011年1月4日，使用当前的代码行（LOC）和大卫·惠勒的计算工资数，这将花费约30亿美元（约22亿欧元），才能够重新开发Linux的内核。

版本命名

Linux内核有三个不同的命名方案。早期版本：第一个版本的内核是0.01，其次是0.02,0.03,0.10,0.11,0.12（第一GPL版本),0.95,0.96,0.97,0.98,0.99及1.0。，从0.95版有许多的补丁发布于主要版本版本之间。
旧计划（1.0和2.6版之间)，版本的格式为A.B.C，其中A,B,C代表：A大幅度转变的内核，这是很少发生变化，只有当发生重大变化的代码和内核发生才会发生，在历史上曾改变两次的内核：1994年的1.0及1996年的2.0； B是指一些重大修改的内核，内核使用了传统的奇数次要版本号码的软件号码系统（用偶数的次要版本号码来表示稳定版本）；C是指轻微修订的内核，这个数字当有安全补丁，bug修复，新的功能或驱动程序，内核便会有变化。自2.6.0（2003年12月）发布后，人们认识到，更短的发布周期将是有益的。自那时起，版本的格式为A.B.C.D，其中A,B,C,D代表：A和B是无关紧要的，C是内核的版本，D是安全补丁。
自3.0（2011年7月）发布后，版本的格式为3.A.B，其中A,B代表：A是内核的版本，B是安全补丁。而4.0（2015年4月）发布后，则延续3.A.B的命名格式，只是将主版号变更为4。

版本时间线

来源：kernel.org

许可证

原先托瓦兹将Linux 置于一个禁止任何商业行为的条例之下，但0.12版本之后改用GNU 通用公共许可证第二版。 该协议允许任何人对软件进行修改或发行，包括商业行为，只要其遵守该协议，所有基于Linux的软件也必须以该协议的形式发表，并提供源代码。
托瓦兹曾经公开声称将Linux置于GNU通用公共许可证之下是他一生中所做的“最好的决定”。

GPL第三版

Linux 内核明确地仅发表在GNU 通用公共许可证（GPL）第二版下，而不向被许可方提供选择“任何更高版本”的选项（这是常见的GPL 扩展）。关于如何轻松地改变许可证以使用后来的GPL 版本（包括第3版）以及这种更改是否合乎需要，存在着相当多的争论。 托瓦兹本人在版本2.4.0的发布中明确指出，他自己的代码仅在版本2下发布。然而，GPL的条款规定，如果没有指定版本，那么可以使用任何版本；并且艾伦·考克斯指出，很少有其他Linux 贡献者指定了特定版本的GPL。
2006年9月，对29位关键内核程序员的调查显示其中的28位更倾向于使用GPL 第二版（GPLv2）而非当时的GPL 第三版（GPLv3）草案。 托瓦兹评论说：“我认为一些外界人士......相信我才是那个古怪不合群的人，因为我这么大张旗鼓地不做GPLv3 的忠实粉丝。”这些高水平的内核开发者就大众媒体对GPLv3 的反对发表了评论，其中包括林纳斯·托瓦兹本人、葛雷格·克罗哈曼和安德鲁·莫顿。他们提到有关DRM/TiVo化、专利及“附加限制”的条款，并警告GPLv3对“开源宇宙”的巴尔干化。决定不采用GPLv3 作为 Linux 内核许可证的托瓦兹在几年后重申了他的批评。

固件争议

许可证争议的一个重点是Linux使用固件二进制包以支持某些硬件设备。理查德·马修·斯托曼认为这些东西让Linux某部分成为非自由软件，甚至以此散布Linux更会破坏GPL，因为GPL需要完全可获取的源代码。
林纳斯·托瓦兹及Linux社群中的领导者，支持较宽松的许可证，不支持理查德·马修·斯托曼的立场。社群中的Linux-libre提供完整的自由软件固件。

加载式内核模块许可证

另一个争论点，就是加载式内核模块是否算是知识产权下的派生创作，意即LKM是否也受GPL约束？托瓦兹本人相信LKM仅用一部分“公开”的内核接口，因此不算派生创作，因此允许一些仅有二进制包裹的驱动程序或不以GPL宣告的驱动程序用于内核。但也不是每个人都如此同意，且托瓦兹也同意很多LKM的确是纯粹的派生创作，也写下“基本上，内核模块是派生创作”这样的句子。另一方面托瓦兹也说过：
有时候一些驱动程序原先并非为Linux设计，而是为其他操作系统而作（意即并非为Linux作的派生创作），这是个灰色地带……这“的确”是个灰色地带，而我个人相信一些模块可视为非Linux派生创作，是针对Linux设计，也因此不会遵守Linux订下的行为准则。
特别像绘图卡驱动程序就有非常大的争议，也许到最后得由立法机关给个答案。

SCO争议

在2003年3月，SCO Group对IBM提告，声称IBM将一些在SCO知识产权许可证保护下的Unix源代码植入Linux中，破坏了SCO给予IBM的源代码使用权限。另外SCO也发出一大堆存证函给许多公司，警告他们在没有SCO权限的情况下使用了Linux，此举可能导致侵犯知识产权，并且以起诉为手段对个别用户施压。SCO也同时对Novell、戴姆勒克莱斯勒（DaimlerChrysler，在2004年7月被部分驳回）以及AutoZone提出告诉，且被Red Hat与其他反对SCO论点的公司反告。2007年8月24日，联邦法院审理SCO对Novell案（SCO v. Novell），法院认定Novell才是Unix商标的合法拥有者，而不是SCO。2010年3月20日，美国联邦第十巡回上诉法院宣判，Novell才是UNIX与UnixWare商标的合法拥有者。此项判决宣布后，已进入破产保护程序的SCO公司，决定停止继续提出诉讼。