Linux内核是如何testing的?

Linux内核开发人员如何在本地testing代码并在提交之后进行testing? 他们是否使用某种unit testing,build立自动化? testing计划?

Linux内核高度重视社区testing。

通常情况下,任何开发人员在提交之前都会testing自己的代码,而且通常他们会使用Linus的内核开发版本,或者其他不稳定/开发树中的一个来开展与他们工作相关的项目。 这意味着他们经常testing他们的变化和其他人的变化。

在正式的testing计划中没有太多的东西,但是在特征合并到上游树中之前可能会要求额外的testing。

正如Dean指出的,还有一些自动化testing, linuxtesting项目和内核自动testing( 很好的概述 )。

开发人员通常也会编写自动化testing来testing他们的变化,但我不确定是否有一个(经常使用的)机制来集中收集这些adhoctesting。

这很大程度上取决于内核的哪个区域正在发生变化 – 您为新的networking驱动程序所做的testing与replace核心调度algorithm时所进行的testing完全不同。

自然,内核本身及其部件在发布之前经过testing,但这些testing仅涵盖基本function。 有一些testing系统执行Linux内核testing:

Linuxtesting项目(LTP)将testing套件提供给开源社区,validationLinux的可靠性和稳定性。 LTPtesting套件包含一系列用于testingLinux内核和相关function的工具。 https://github.com/linux-test-project/ltp

自动testing – 一个完全自动化testing的框架。 它主要是为了testingLinux内核而devise的,虽然它在许多其他用途上是有用的,例如在Linux平台下对新硬件,虚拟化testing和其他一般用户空间程序testing进行testing。 这是一个GPL下的开源项目,由许多组织使用和开发,包括Google,IBM,Red Hat等等。 http://autotest.github.io/

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

还有一些用于Linux内核dynamic分析的系统:

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

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

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

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

他们是否使用某种unit testing,build立自动化?

在经典意义上,没有。

例如, Ingo Molnar正在运行以下工作:1.使用随机设置的configuration选项构build新内核2.启动它3.转到1

每个构build失败,引导失败,BUG或运行时警告处理。 24/7。 乘以几个箱子,可以发现相当多的问题。

testing计划?

没有。

有可能是误解,有中央testing设施,没有。 每个人都做他想做的事。

它不是很容易自动化内核testing。 大多数Linux开发人员自己做testing,就像adobriyan提到的一样。

但是,有几件事情可以帮助debuggingLinux内核:

  • kexec:一个系统调用,允许你把另一个内核放入内存并重新启动,而不必回到BIOS,如果失败,重新启动。
  • dmesg:绝对是查找内核启动过程中发生的事情的信息,以及它是否工作/不工作。
  • 内核工具:除了printk的(还有一个叫'CONFIG_PRINTK_TIME'的选项,它允许你在内核输出时看到精确到微秒),内核configuration允许你打开很多的跟踪器,使他们能够debugging什么正在发生。

然后,开发者通常会让其他人检查他们的补丁 一旦修补程序在本地进行了审查,并且认为不会干扰其他任何事情,并且修补程序经过testing可以与来自Linus的最新内核一起使用,而不会造成任何破坏,则修补程序会向上游推送

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

树内工具

在内核中findtesting工具的好方法是:

  • make help和阅读所有的目标
  • 看下工具/testing

在4.0版中,这导致我:

  • 工具/testing/ 自我 testing下的kselftest 。 运行make kselftest 。 必须已经运行内核。 另见: Documentation / kselftest.txt , https : //kselftest.wiki.kernel.org/

  • ktest在tools / testing / ktest下 。 另见: http : //elinux.org/Ktest,http : //www.slideshare.net/satorutakeuchi18/kernel-auto-testbyktest

  • 静态分析器make help部分,其中包含的目标如下:

    • checkstack : Perl:linux源代码中的checkstack.pl是干什么的?
    • Coccinelle coccicheck ( 由askb提到)

内核CI

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

它似乎只做生成和启动testing(TODO如何自动testing启动工作源应该在https://github.com/kernelci/ )。

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

Linaro熔岩

http://www.linaro.org/initiatives/lava/看起来像一个CI系统,主要关注开发板的启动和Linux内核。;

ARM LISA

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

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

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

一步debugging器

不是真正的unit testing,但可能有助于您的testing开始失败:

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

除了上面/下面的几点之外,这些重点更多的是在Linux内核的functiontesting,硬件authenticationtesting和性能testing。

实际上很多testing都是通过脚本,静态代码分析工具,代码评论等方式进行的,这对于捕捉错误是非常有效的,否则这些错误会在应用程序中破坏一些东西。

稀疏 – 一种开源工具,用于在Linux内核中查找错误。

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

checkpatch.pl和其他脚本 – 编码风格问题可以在内核源代码树的Documentation / CodingStyle文件中find。 在阅读时要记住的重要的事情不是这种风格比其他任何风格都好,只是它是一致的。 这有助于开发人员轻松find并修复代码风格问题,已经开发了内核源代码树中的脚本脚本/ checkpatch.pl。 这个脚本可以很容易地指出问题,应该由开发人员随时修改,而不是让审稿人以后指出问题,浪费时间。

还有:

MMTests是收集基准和脚本来分析结果

https://github.com/gormanm/mmtests

Linux系统调用模糊testing仪的三位一体

http://codemonkey.org.uk/projects/trinity/

另外,sourceforge的LTP页面已经过时了,项目已经移到了GitHub https://github.com/linux-test-project/ltp

我会想象他们使用虚拟化来做快速testing,比如QEMU,VirtualBox或者Xen,以及一些脚本来执行configuration和自动化testing。

自动化testing可能是通过尝试许多随机configuration或几个特定的​​(如果他们正在处理一个特定的问题)。 Linux有很多低级工具(如dmesg)来监视和logging内核的debugging数据,所以我想也是这样。

据我所知,英特尔有一个自动执行回归检查工具(命名为lkp / 0 day)运行/资助,它将testing发送到邮件列表的每个有效补丁,并检查从不同的微基准如hackbench ,fio,unixbench,netperf等,一旦有性能回归/改进,相应的报告将直接发送给补丁作者和Cc相关维护者。

LTP和内存通常是首选的工具。

adobriyan提到了Ingo随机configuration构buildtesting的循环。 现在已经包含了0天testing机器人(又名kbuildtesting机器人)。 这里介绍一个关于基础架构的好文章: 内核构build/启动testing

这个设置背后的想法是尽快通知开发人员,以便他们能尽快纠正错误。 (在某些情况下,由于kbuild基础架构也会对维护者的子系统树进行testing,在补丁程序将其joinLinus树之前)

我做了Linux内核编译,并为Android(棉花糖和牛轧糖)做了一些修改,其中我使用的是Linux版本3.我在linux系统中交叉编译它,手动debugging错误,然后在Android中运行它的启动映像文件,并检查是否它是否在循环孔中。 如果运行完善,那就意味着它是根据系统要求完美编译的。
对于MotoG内核编译

注意: – Linux内核将根据系统硬件的要求而改变