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


当前回答

我曾经做过Linux内核编译,并对Android (Android 6.0 (Marshmallow)和Android 7.0 (Nougat))做过一些修改,其中我使用的是Linux版本3。我在Linux系统上交叉编译它,手动调试错误,然后在Android上运行它的引导映像文件,检查它是否进入了一个漏洞。如果它运行完美,则意味着它根据系统需求进行了完美的编译。

用于MotoG内核编译

注意:Linux内核将根据依赖于系统硬件的需求进行更改

其他回答

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

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

通常没有太多正式的测试计划,但是在将特性合并到上游树之前可能会要求进行额外的测试。

正如Dean所指出的,还有一些自动化测试:Linux测试项目和内核Autotest(很好的概述)。

开发人员通常还会编写针对测试他们的更改的自动化测试,但我不确定是否有一种(经常使用的)机制来集中收集这些临时测试。

当然,这在很大程度上取决于内核的哪个部分正在被更改——您为一个新的网络驱动程序所做的测试与替换核心调度算法时所做的测试是完全不同的。

据我所知,英特尔有一个自动性能回归检查工具(名为lkp/0 day)运行/资助。它将测试发送到邮件列表的每个有效补丁,并检查从不同的微基准测试(如hackbench, fio, unixbench, netperf等)更改的分数。

一旦出现性能下降/改进,相应的报告将直接发送给补丁作者和Cc相关的维护者。

自动化内核测试并不容易。大多数Linux开发人员自己进行测试,就像adobriyan提到的那样。

然而,有一些事情可以帮助调试Linux内核:

kexec: A system call that allows you to put another kernel into memory and reboot without going back to the BIOS, and if it fails, reboot back. dmesg: Definitely the place to look for information about what happened during the kernel boot and whether it works/doesn't work. Kernel Instrumentation: In addition to printk's (and an option called 'CONFIG_PRINTK_TIME' which allows you to see (to microsecond accuracy) when the kernel output what), the kernel configuration allows you to turn on a lot of tracers that enable them to debug what is happening.

然后,开发人员通常会让其他人检查他们的补丁。一旦补丁在本地被检查,并且没有干扰其他任何东西,并且补丁被测试与来自Linus的最新内核一起工作而没有破坏任何东西,补丁就会被推送到上游。

这里有一个很好的视频,详细介绍了一个补丁在集成到内核之前所经历的过程。

我可以想象他们使用虚拟化来进行快速测试。它可以是QEMU、VirtualBox或Xen之类的东西,以及一些执行配置和自动化测试的脚本。

自动化测试可能是通过尝试许多随机配置或少数特定配置(如果他们处理特定问题)来完成的。Linux有很多低级工具(比如dmesg)来监视和记录来自内核的调试数据,所以我认为也会使用它。

当然,内核本身及其部分在发布之前要进行测试,但这些测试只覆盖基本功能。有一些测试系统执行Linux内核的测试:

Linux测试项目(LTP)向开源社区交付测试套件,以验证Linux的可靠性和稳定性。LTP测试套件包含一组用于测试Linux内核和相关特性的工具。

autotest -用于完全自动化测试的框架。它主要用于测试Linux内核,但也有许多其他用途,例如在Linux平台下验证新硬件、虚拟化测试和其他一般用户空间程序测试。它是一个基于GPL的开源项目,被许多组织使用和开发,包括谷歌、IBM、Red Hat和许多其他组织。

还有一些主要的GNU/Linux发行公司开发的认证系统。这些系统通常检查完整的GNU/Linux发行版与硬件的兼容性。有由Novell、Red Hat、Oracle、Canonical和谷歌开发的认证系统。

还有一些Linux内核的动态分析系统:

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

Kmemcheck捕获动态分配(即使用kmalloc())的对内存的每一次读写。如果读取之前没有写入的内存地址,则将消息打印到内核日志中。它也是Linux内核的一部分。

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