Linux内核开发人员如何在提交代码后在本地测试他们的代码?他们是否使用某种单元测试,构建自动化?测试计划?
Linux内核开发人员如何在提交代码后在本地测试他们的代码?他们是否使用某种单元测试,构建自动化?测试计划?
Answers:
linux内核非常重视社区测试。
通常,任何开发人员都会在提交之前测试自己的代码,并且经常会使用Linus的内核开发版本,或与他们的工作相关的项目中使用的其他不稳定/开发树之一。这意味着他们经常同时测试自己的变更和其他人的变更。
正式的测试计划的方式往往不多,但是在将功能合并到上游树之前,可能需要进行额外的测试。
正如Dean指出的那样,还有一些自动化测试,Linux测试项目和内核autotest(很好的概述)。
开发人员通常还会编写旨在测试其更改的自动化测试,但是我不确定是否有(经常使用的)机制来集中收集这些临时测试。
当然,这很大程度上取决于要更改内核的区域-您对新的网络驱动程序所做的测试与替换核心调度算法时所做的测试完全不同。
自然,内核本身及其组成部分在发布之前已经过测试,但是这些测试仅涵盖基本功能。有一些测试系统可以对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内核中)允许将错误和异常注入到应用程序的逻辑中,以实现更高的系统覆盖率和容错能力。
Linux内核开发人员如何在提交代码后在本地测试他们的代码?
他们是否使用某种单元测试,构建自动化?
用经典的话来说,不。
例如 Ingo Molnar正在运行以下工作负载:1.使用随机的一组配置选项构建新内核2.引导到其中3. goto 1
每个构建失败,启动失败,BUG或运行时警告都会得到处理。24/7。乘以几个盒子,就可以发现很多问题。
测试计划?
没有。
可能会有一个误解,那就是没有中央测试设施。每个人都做他想要的。
树内工具
在内核中找到测试工具的好方法是:
make help
并阅读所有目标在v4.0中,这导致我:
在工具/测试/自测下进行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有什么作用?coccicheck
用于球藻(由askb提及)内核CI
https://kernelci.org/是一个旨在使内核测试更加自动化和可见的项目。
它似乎仅执行构建和启动测试(TODO如何自动测试启动正常的源代码应该在https://github.com/kernelci/)。
Linaro似乎是该项目的主要维护者,来自许多大公司的贡献:https://kernelci.org/sponsors/
利纳罗熔岩
http://www.linaro.org/initiatives/lava/看起来像一个CI系统,专注于开发板启动和Linux内核。
莉莎
https://github.com/ARM-software/lisa
不确定它的详细功能,但是它是由ARM和Apache许可的,因此可能值得一看。
演示:https://www.youtube.com/watch?v = yXZzzUEngiU
步骤调试器
并不是真正的单元测试,但是一旦测试开始失败可能会有所帮助:
我自己的QEMU + Buildroot + Python设置
我还开始了一个专注于易于开发的安装程序,但最终也向它添加了一些简单的测试功能:https : //github.com/cirosantilli/linux-kernel-module-cheat/tree/8217e5508782827320209644dcbaf9a6b3141724#test-this -回购
我尚未详细分析所有其他设置,它们可能做得比我更多,但是我相信我的设置非常容易快速上手,因为它具有大量的文档和自动化工具。
自动化内核测试不是很容易。就像adobriyan提到的那样,大多数Linux开发人员都自己进行测试。
但是,有一些事情可以帮助调试Linux内核:
然后,开发人员通常会让其他人查看他们的补丁。一旦在本地对补丁进行了检查,并且发现它们不会干扰其他任何东西,并且对补丁进行了测试以使用Linus的最新内核而不会破坏任何东西,便将补丁推向上游。
编辑: 这是一个很好的视频,详细介绍了补丁在集成到内核之前要经历的过程。
除了以上/以下几点以外,它们还重点介绍了Linux内核的功能测试,硬件认证测试和性能测试。
实际上,实际上是通过脚本,静态代码分析工具,代码审查等进行了大量测试,这对于捕获错误非常有效,否则可能会破坏应用程序中的某些内容。
稀疏 –一种开源工具,旨在发现Linux内核中的错误。
Coccinelle是另一个执行匹配和转换引擎的程序,它提供了语言SmPL(语义补丁语言)来指定C代码中所需的匹配和转换。
checkpatch.pl和其他脚本 -编码样式问题可以在内核源代码树的Documentation / CodingStyle文件中找到。阅读时要记住的重要一点不是该样式在某种程度上比其他任何样式都要好,只是它是一致的。这有助于开发人员轻松找到并解决编码风格问题,内核源代码树中的脚本scripts / checkpatch.pl已经开发出来。该脚本可以轻松指出问题,并且应始终由开发人员在其更改时运行,而不是让审阅者稍后再指出问题来浪费时间。
我可以想象他们使用虚拟化来进行快速测试,例如QEMU,VirtualBox或Xen,以及一些脚本来执行配置和自动化测试。
可以通过尝试许多随机配置或一些特定的配置(如果它们正在处理特定的问题)来完成自动测试。Linux有很多底层工具(例如dmesg)来监视和记录来自内核的调试数据,因此我想也可以使用它。
还有:
MMTests,它是基准和脚本的集合以分析结果
https://github.com/gormanm/mmtests
Linux系统调用模糊测试仪Trinity
http://codemonkey.org.uk/projects/trinity/
同样,sourceforge上的LTP页面已经过时,该项目已移至GitHub https://github.com/linux-test-project/ltp
LTP和Memtests通常是首选工具。
我已经完成了Linux内核的编译,并对使用Linux版本3的android(Marshmallow和Nougat)进行了一些修改。我在linux系统中对其进行了交叉编译,手动调试了错误,然后在Android中运行其启动映像文件,并检查是否它是否有漏洞。如果运行良好,则表示它已根据系统要求进行了完美编译。
对于MotoG内核编译
注意: -Linux内核将根据要求而变化,具体取决于系统硬件
一旦贡献者提交了补丁文件并提出了合并请求,Linux网守就会通过集成并查看补丁来检查补丁。一旦成功,他们会将补丁合并到相关分支中并发布新版本。Linux测试项目(https://github.com/linux-test-project/ltp)是提供测试场景(测试用例)的主要资源,这些场景可以在应用补丁后针对内核运行。这可能需要2到4个小时左右,具体时间视情况而定。请注意有关“选定”内核的文件系统将要进行测试的信息。Ex:Ext4针对EXT3生成不同的结果,依此类推。
内核测试过程。