Linux内核是如何测试的?

Ash*_*ary 248 linux linux-kernel

Linux内核开发人员如何在本地测试代码并在提交代码之后对其进行测试?他们是否使用某种单元测试,构建自动化?测试计划?

Jos*_*phH 72

Linux内核非常重视社区测试.

通常,任何开发人员都会在提交之前测试他们自己的代码,并且他们经常会使用Linus的内核开发版本,或者其他不稳定/开发树之一用于与他们的工作相关的项目.这意味着他们经常测试他们的变化和其他人的变化.

正式测试计划的方式往往不多,但在将功能合并到上游树之前可能会要求进行额外的测试.

正如Dean指出的那样,还有一些自动化测试,linux测试项目内核自动测试(好的概述).

开发人员通常也会编写旨在测试其更改的自动化测试,但我不确定是否有(经常使用的)机制来集中收集这些特殊测试.

当然,这取决于内核的哪个区域正在发生变化 - 您为新网络驱动程序所做的测试与更换核心调度算法时所做的测试完全不同.

  • +1,一半的战斗根本不会打破司机所依赖的东西,因此多年来BKL的持久性.另一件需要考虑的事情是在许多不同的体系结构上测试许多子系统,这对Linux所接受的社区滥用,错误测试实际上是可行的. (8认同)

Kar*_*yan 66

当然,内核本身及其部件在发布之前进行了测试,但这些测试仅涵盖基本功能.有一些测试系统可以执行Linux内核的测试:

Linux测试项目(LTP)为开源社区提供测试套件,以验证Linux的可靠性和稳定性.LTP测试套件包含一系列用于测试Linux内核和相关功能的工具.https://github.com/linux-test-project/ltp

自动测试 - 全自动测试的框架.它主要用于测试Linux内核,但它可用于许多其他目的,例如在Linux平台下验证新硬件,虚拟化测试和其他一般用户空间程序测试.它是GPL下的一个开源项目,由许多组织使用和开发,包括Google,IBM,Red Hat和许多其他组织.http://autotest.github.io/

还有一些主要的GNU/Linux发行公司开发的认证系统.这些系统通常检查完整的GNU/Linux发行版以与硬件兼容.有Novell,Red Hat,Oracle,Canonical,Google开发的认证系统.

还有用于Linux内核动态分析的系统:

Kmemleak是Linux内核中包含的内存泄漏检测器.它提供了一种以类似于跟踪垃圾收集器的方式检测可能的内核内存泄漏的方法,区别在于孤立对象未被释放但仅通过/ sys/kernel/debug/kmemleak报告.

Kmemcheck将每次读取和写入捕获到动态分配的内存(即使用kmalloc()).如果读取之前未写入的内存地址,则会向内核日志打印一条消息.也是Linux内核的一部分

故障注入框架(包含在Linux内核中)允许将错误和异常注入到应用程序的逻辑中,以实现更高的系统覆盖范围和容错能力.


ado*_*yan 58

Linux内核开发人员如何在本地测试代码并在提交代码之后对其进行测试?

他们是否使用某种单元测试,构建自动化?

在经典意义上,没有.

E. g.Ingo Molnar正在运行以下工作负载:1.使用随机的配置选项构建新内核2.启动它3.转到1

处理每个构建失败,引导失败,BUG或运行时警告.24/7.乘以几个盒子,可以发现很多问题.

测试计划?

没有.

可能存在误解,即存在中央测试设施,没有.每个人都做他想做的事.

  • 呃,你们所有人都意识到Alexey Dobriyan是一个Linux内核开发者吗? (53认同)
  • 作为另一个内核开发人员,我必须说这是对这个问题最诚实的回答:内核不是经典意义上的测试,只是因为它是不可能的.配置和硬件的组合多于可用的开发人员测试时间.很少有人具备测试某些设备所需的技能,在某些情况下,很少有人真正拥有某些设备. (9认同)
  • 鉴于存在诸如[this](http://ltp.sourceforge.net/)和[this](http://test.kernel.org/tko/)之类的网站,我也会质疑这个答案的有效性. (6认同)
  • 我认为adobriyan的核心答案是"有中央测试设施,没有." 是对的.然而,不同的组执行不同级别的测试,并不是内核完全未经测试. (3认同)
  • 我认为SUSE和RedHat除了测试自己的内核外,经常测试香草.本身没有集中测试,但是仍然有一个测试 - 由Linux的主要用户进行.否则评论代表.如果它写得不那么讽刺,我甚至会对它进行修改. (2认同)
  • @ninjalj确实!在linux内核邮件列表中搜索Alexey Dobriyan:4,371个匹配的文章 (2认同)
  • @EzequielGarcia 是什么让它变得不可能? (2认同)

Cir*_*四事件 15

树内工具

在内核中查找测试工具的好方法是:

在v4.0中,这导致我:

内核CI

https://kernelci.org/是一个旨在使内核测试更加自动化和可见的项目.

它似乎只做构建和启动测试(TODO如何自动测试启动工作源应该在https://github.com/kernelci/).

Linaro似乎是该项目的主要维护者,得到了许多大公司的贡献:https://kernelci.org/sponsors/

Linaro Lava

http://www.linaro.org/initiatives/lava/看起来像一个CI系统,专注于开发板启动和Linux内核.

ARM LISA

https://github.com/ARM-software/lisa

不确定它的功能是什么,但它是由ARM和Apache Licensed提供的,所以很值得一看.

演示:https://www.youtube.com/watch?v = yXZzzUEngiU

步调试器

不是单元测试,但一旦测试开始失败可能会有所帮助:

我自己的QEMU + Buildroot + Python设置

我也开始专注于易于开发的设置,但我最终还添加了一些简单的测试功能:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/8217e5508782827320209644dcbaf9a6b3141724#test-this -repo

我没有详细分析所有其他设置,它们可能比我的更多,但我相信我的设置很容易快速入门,因为它有很多文档和自动化.


Van*_*ril 13

它不是很容易自动化内核测试.大多数Linux开发人员都在自己进行测试,就像adobriyan提到的那样.

但是,有一些东西可以帮助调试Linux内核:

  • kexec:一个系统调用,允许您将另一个内核放入内存并重新启动而无需返回BIOS,如果失败,请重新启动.
  • dmesg:绝对是寻找有关内核启动期间发生的事情以及它是否有效的信息的地方.
  • 内核检测:除了printk(以及一个名为'CONFIG_PRINTK_TIME'的选项,它允许你在内核输出什么时看到(达到微秒精度),内核配置允许你打开很多跟踪器,使他们能够调试什么正在发生.

然后,开发人员通常让其他人审查他们的补丁 一旦在本地审查补丁并且看到它们不会干扰其他任何东西,并且测试补丁以使用Linus的最新内核而不破坏任何内容,则补丁被推送到上游.

编辑: 这是一个很好的视频,详细介绍了补丁在集成到内核之前所经历的过程.


ask*_*skb 6

除了上/下点之外,它更侧重于Linux内核的功能测试,硬件认证测试和性能测试.

实际上通过脚本,静态代码分析工具,代码审查等进行了大量测试,这在捕获错误方面非常有效,否则会破坏应用程序中的某些内容.

Sparse - 一种开源工具,旨在查找Linux内核中的错误.

Coccinelle是另一个程序匹配和转换引擎,它提供语言SmPL(语义补丁语言),用于指定C代码中所需的匹配和转换.

checkpatch.pl和其他脚本 - 编码样式问题可以在内核源代码树的Documentation/CodingStyle文件中找到.阅读它时要记住的重要事情并不是这种风格在某种程度上比任何其他风格更好,只是它是一致的.这有助于开发人员轻松查找和修复编码样式问题,内核源代码树中的脚本scripts/checkpatch.pl已经开发完成.此脚本可以轻松指出问题,并且应始终由开发人员对其更改进行操作,而不是让审阅者稍后通过指出问题来浪费时间.


小智 5

还有:

MMTests是用于分析结果的基准测试和脚本的集合。

Trinity是 Linux 系统调用模糊测试器。

此外, SourceForge 上的LTP页面也相当过时,该项目已移至 GitHub。