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


当前回答

自动化内核测试并不容易。大多数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的最新内核一起工作而没有破坏任何东西,补丁就会被推送到上游。

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

其他回答

在树的工具

在内核中找到测试工具的一个好方法是:

做出帮助并阅读所有目标 在工具/测试下面找找

在4.0版本中,这导致我:

在工具/测试/自我测试下进行自我测试。运行make selftest。必须运行已构建的内核。请参见:Documentation/kselftest.txt, https://kselftest.wiki.kernel.org/ 工具/测试/ Ktest下的Ktest。参见:http://elinux.org/Ktest, http://www.slideshare.net/satorutakeuchi18/kernel-auto-testbyktest make help的静态分析器部分,其中包含如下目标: linux源代码中的checkstack.pl做什么? 双球菌检查(askb提及)

内核CI

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

它似乎只做构建和引导测试(TODO如何自动测试引导工作,源代码应在https://github.com/kernelci/)。

Linaro似乎是这个项目的主要维护者,有许多大公司的贡献:https://kernelci.org/sponsors/

Linaro洗

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

可怜的丽莎

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

不知道它具体做了什么,但它是由ARM和Apache授权的,所以可能值得一看。

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

一步调试器

不是真正的单元测试,但在测试开始失败时可能会有所帮助:

QEMU + GDB: https://stackoverflow.com/a/42316607/895245 KGDB: https://stackoverflow.com/a/44226360/895245

我自己的QEMU + Buildroot + Python设置

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

我没有非常详细地分析所有其他设置,它们可能比我的设置做得更多,但是我相信我的设置非常容易快速开始,因为它有很多文档和自动化。

LTP和memtest通常是首选工具。

adobriyan提到了Ingo的随机配置构建测试循环。现在,零日测试机器人(又名kbuild测试机器人)几乎涵盖了这一点。这里有一篇关于基础结构的不错的文章:内核构建/引导测试

这种设置背后的想法是尽快通知开发人员,以便他们能够尽快纠正错误(在某些情况下,在补丁进入Linus的树之前,因为kbuild基础设施也会针对维护人员的子系统树进行测试)。

当然,内核本身及其部分在发布之前要进行测试,但这些测试只覆盖基本功能。有一些测试系统执行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内核中)允许将错误和异常注入到应用程序的逻辑中,以实现更高的系统覆盖率和容错性。

自动化内核测试并不容易。大多数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的最新内核一起工作而没有破坏任何东西,补丁就会被推送到上游。

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