LWN:逐步统一kselftests和KUnit!

Linux内核测试技术 Linux 内核测试技术是确保内核稳定性和可靠性的关键。通过社区的不断努力和改进,Linux 内核的稳定性和可靠性将得到进一步提升,为广大的用户和开发者提供更好的支持。Linux内核性能测试使用得比较多得是Rt-Tests[1]测试套件和LMbench测试套件[2],前者主要测试Linux内核的实时性能,后者更关注Linux内核的I/O吞吐性能。国科环宇在开发实时性调度模块时,就进行了单元测试和集成测试,分别对实时性调度模块的函数以及实时性调度模块的接口,输入具有不同边界条件的参数,进行测试和验证。 阅读详情

关注了就能看到更多这么棒的文章哦~

Toward the unification of kselftests and KUnit

By Jonathan Corbet
July 8, 2025
Gemini flash translation
https://lwn.net/Articles/1029077/

多年来,内核项目一直缺乏正式的测试机制;人们常开玩笑说,测试是该项目留住用户的主要原因。虽然许多类型的内核测试只能在特定硬件存在的情况下进行,但内核的其他部分可以得到更广泛的测试。然而,随着时间的推移,内核已经获得了两个独立的测试框架以及随之而来的越来越多的自动化测试。这两个框架——Kselftests 和 KUnit——对测试问题采取了不同的方法;现在,Thomas Weißschuh 的这个补丁系列旨在将它们整合起来。

Kselftests 和 KUnit

Kselftests 于 2012 年由 Frederic Weisbecker 首次添加,第一个测试 专注于 x86 架构上断点(breakpoints)的处理。这些自测试在用户空间运行,调用正常的内核系统调用(system-call)接口。多年来,Kselftests 已经发展出一套基于测试一切协议(Test Anything Protocol, TAP) 的测试套件结构,以及一套用于创建测试的函数、宏和 Makefile 支持。

在当前的内核中,kselftests 目录 包含 100 多个子目录,每个子目录都包含特定子系统的测试。其中有专注于系统调用、架构支持、sysctl 配置项、内核行为(例如系统映射(system mappings)的密封)、/proc 文件以及少数设备驱动程序等的测试。虽然这套测试并非(也可能永远不会)完整,但成功运行 Kselftests 足以让人相信内核的重要部分正在按预期工作。

KUnit 是一种不同的机制;其测试被构建为内核模块(kernel modules),并在内核内部运行。这赋予了 KUnit 测试验证用户空间无法访问的单个内核函数(kernel functions)操作的能力。KUnit 测试可以加载到正在运行的内核中并随时运行;它们也可以构建到内核中并在每次启动时自动运行。KUnit 也提供了一套支持函数,使测试变得更简单;它围绕 TAP 的一个版本,名为 KTAP,进行构建。

KUnit 于 2019年由 Felix Guo 添加。多年来,它也积累了越来越多的测试;DRM(图形)子系统有相当多的测试,并且有一组重要的测试覆盖了内核 `lib/` 目录中发现的通用支持例程。例如,请参阅 这组哈希表(hash-table)测试。

内核的两个测试套件针对测试问题的不同方面,因此它们最终采用不同的设计并非完全出乎意料。Kselftests 从外部探查内核,确保其用户空间应用程序二进制接口(user-space ABI)按预期运行,而 KUnit 则在内部工作,测试用户空间无法访问的组件。这种分离使得每个测试套件都能在其目标领域内发展,但也导致了一些偶尔的困扰。

或许殊途同归

Weißschuh 的工作似乎是由嵌入式开发人员感受到的一些特定需求所驱动的。KUnit 测试相对容易在新嵌入式系统上运行;它们可以构建到运行在这些系统上的内核中,无需额外的支持。Kselftests 测试则需要在目标系统上有一个完全正常工作的用户空间才能运行。用户空间和测试本身都必须与内核分开加载到目标系统上,使得整体测试任务更加困难。

Weißschuh 正在寻求的解决方案是整合这两个测试套件,特别是能够将 Kselftests 构建到内核中,并从 KUnit 框架中运行它们。一个成功的解决方案将允许将内核和一套完整的测试作为单个二进制文件加载到目标系统上,从而简化在新系统上使内核进入完全工作状态的过程。当然,要实现这一点,需要克服一些障碍。

Kselftests 被设计为独立程序运行,而不是像 KUnit 测试那样作为内核模块中的函数。Weißschuh 的系列补丁继续单独构建这些测试,但生成的二进制文件被链接到新的 `kunit-uapi` 模块中,然后该模块在单独的 per-CPU 内核线程(kernel thread)中运行它们。此代码基于最初作为 bpfilter 的一部分引入的用户模式辅助(user-mode-helper)功能,尽管需要进行多项更改。

用户空间程序期望有一个可用的 C 库;这正是 Weißschuh 正试图避免的用户空间设置的一部分。幸运的是,自 5.1 版本发布以来,内核碰巧拥有自己的最小 C 库实现,即 nolibc。它并非一个完整的实现,但包含足够的支撑来运行大部分 kselftest 套件。然而,这些测试的构建必须修改为使用 nolibc 而非系统的 C 库。

`kunit-uapi` 模块必须完成为每个 kselftest 创建足够环境的其余工作,以及实际运行测试。这需要访问内核目前未导出给模块的功能——例如 `kernel_execve()`、`replace_fd()`、`create_pipe_files()` 和 `do_exit()` 等内核函数。该系列补丁包含一个导出这些符号以及其他符号的补丁。该导出仅限于 `kunit-uapi` 模块,使用刚刚在 6.16 中添加的 `EXPORT_SYMBOL_GPL_FOR_MODULES()` 宏;这是最初于 2024 年提出的受限命名空间(restricted-namespace)功能的当前形式。

新导出的函数用于为每个测试设置标准输入、输出和错误流(输入在所有实际用途中都被设置为 `/dev/null`),挂载 `/proc`,运行测试本身,并在之后进行清理。测试的 TAP 输出被传回到 KUnit 框架,以便与其余测试结果一起报告。

所有这些工作都为打包现有 Kselftests 奠定了基础,但尚未完全实现该目标。相反,在该系列补丁结束时唯一启用的测试是一个简单的示例测试和一个验证 `/proc` 挂载的测试。引入现有测试将需要为每个测试添加一些“粘合”代码,使其嵌入到可加载模块中并在正确时间运行。一种更自动化的测试整合方式是未来的愿望清单,但目前尚未实现。

实际测试的整合可能正在等待围绕其框架的共识。截至撰写本文时,该系列补丁已是第四个版本,最重要的顾虑似乎已得到解决;最新的评论主要集中在相对较小的问题上。假设最大的问题已基本克服,核心框架可能会相对快速地进入主线(mainline);整合所有实际测试的工作很可能是接下来的任务。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

kunit-0.7.802.zip rats-gradle-plugin.zip,远程android测试服务的gradle插件android gradle构建工具的testingrats插件 立即下载

相关推荐

selftest_defaultfirmware:为了帮助调试电路板焊点和连接,此固件执行了一些测试

tinyUSBboard 默认固件,带/用于板卡+usb 自检 通过外部编程器对默认固件进行编程时,请始终配置正确的保险丝设置! 也不要锁定任何位(使用默认 lockbits=0x3f)! 为了测试电路板焊点和连接,该固件首先旋转所有红色 LED。 (检查短路/冷接头)当找到合适的主机(连接到 USB)时,此旋转将在大约 1 秒后停止。 这一步不需要任何驱动程序,因为使用了 USB-HID。 但是,如果没有找到 USB 主机,或者 USB 主机不支持简单的引导 HID 协议:循环 LED 永远不会结束。 如果检测到 USB 连接,所有四个红色 LED 将闪烁约 1 秒钟,并开始约 20 秒的动画倒计时。 (LED 一个接一个地停止闪烁,直到没有人为止。) 在此期间模拟 USB HID 键盘: 如果在倒计时过程中按下 PROG 按钮(或 PD6 接地),则倒计时被重置。 当 PROG

Linux内核之Kselftests

Linux内核包含了一套开发者可用的单元测试和回归测试(Kselftests),这些测试位于内核源代码的目录下。这些测试旨在针对内核中的各个代码路径进行小规模的测试。测试应该在构建、安装和启动内核之后运行。它每天都会在不同的Linux内核树(即代码库)的内核集成测试环境上运行,主要是为了确保内核代码在合并到主干之前,在各种场景和配置下都能正常工作,从而提高内核的整体稳定性和可靠性。快速执行测试的能力(目前的目标是不到20分钟)一些开发人员希望在几秒钟内运行测试运行不同测试组的能力。

DD'Notes 1249

CentOS 9 Stream 上安装 MySQL 8.0+

根据提示进行设置,包括设置新的 root 密码、禁用远程 root 登录等。MySQL 在首次安装时会生成一个临时密码。这样就完成了 MySQL 8.0.37 的安装。这将安装最新的 MySQL 8.0 版本。

小强不是坑 1679

发现Linux kernel kselftest的一个Bug

描述了如何发现和报告Linux kernel kselftest中的一个bug的整个过程。先自测,后面网上找答案,stack overflow 求助。最后才求助于Linux kernel Maintainers,获得最终答案。

qq_42000667的博客 1000

Camera | 瑞芯微rk3568平台MIPI-CSI驱动:从设备树到V4L2框架的完整链路解析

本文深入解析瑞芯微rk3568平台MIPI-CSI驱动的完整链路,从设备树配置到V4L2框架集成。详细介绍了rk3568的MIPI-CSI驱动架构、设备树关键节点布局、驱动初始化流程及数据流路径,帮助开发者快速掌握摄像头控制器的调试与优化技巧,实现稳定的视频采集系统。

weixin_28703489的博客 289

ubuntu18.04 升级Ubuntu 20.04

Ubuntu 18.04升级20.04指南:首先备份重要数据,更新当前系统并检查新版本可用性(sudo do-release-upgrade -c)。确认升级后执行sudo do-release-upgrade,按提示完成操作。升级过程需耐心等待,完成后重启系统。注意:升级前务必备份数据,确保系统为最新版本,以降低风险。升级后即可使用Ubuntu 20.04系统。

https://ophome.blog.youkuaiyun.com,在IT行业有多年的工作经验,尤其是在Python、Linux、负载均衡、Nginx和服务器运维等领域。 1058

代码质量保证体系——Linux

疫情在肆虐,说心忧天下貌似有些大了,只能先说些小的,在这里尝试描述一下Linux为保证代码质量所做的努力,来完成这个主题的最后一篇,也希望这段不好的日子的最后篇章也早些到来。 编码规范 这一环节涵盖了两个方面的含义:一份行之有效的编码规范,加上一些辅助检查代码是否符合规范的工具。一个项目可以比作一个国家,这个项目采用的编程语言就是这个国家的官方语言,每个开发者使用这门语言在这个国家里表达自己的...

1927

ESP32连接OneNet云平台实现多设备联动控制完整示例

通过esp32连接onenet云平台,实现远程设备间的智能联动控制,利用MQTT协议完成数据通信,esp32连接onenet云平台后可高效稳定地上传与下发指令,提升物联网系统响应速度与自动化水平。

weixin_42360733的博客 547

关于kunit的一点够用就行知识概念

kunitconfig的一个好的起点是KUnit默认配置。如果你不跑库尼特。.kunitconfig位于kunit使用的–build_dir中。py,默认为.kunit。在运行测试之前,kunit_tool确保在.kunitconfig中设置的所有配置选项都在kernel.config中设置。如果未包含所用选项的依赖项,它将警告您。有许多方法可以自定义配置:编辑.kunit/.kunitconfig。该文件应包含运行所需测试所需的kconfig选项列表,包括它们的依赖项。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 3235

DenseNet训练实践

在Cifar10上训练DenseNet,复现DenseNet论文的结果是后面两篇分析工作的基础,因此本系列的第一篇,将首先讨论深度学习的训练过程中的几个方面: 1. 数据集 1.1 Cifar10数据集 Cifar10数据集有6万张32X32的图片,是一个小型的数据集,但数据的复杂度足够,下图来自DenseNet论文,可以看出,不用数据增强的话,ResNet的正确率也很难超过90%,因而足以用来验...

一蓑烟雨任平生 1万+

深度学习与神经网络有什么区别

人工神经网络(ArtificialNeuralNetwork,即ANN)是从信息处理角度对人脑神经元网络进行抽象,是20世纪80年代以来人工智能领域兴起的研究热点,其本质是一种运算模型,由大量的节点(或称神经元)之间相互联接构成,在模式识别、智能机器人、自动控制、生物、医学、经济等领域已成功地解决了许多现代计算机难以解决的实际问题,表现出了良好的智能特性。...

super67269的博客 8487

内核单元测试框架KUnit的一些绯闻

在该提议冗长的讨论帖子,大家就往内核添加测试框架的理由争论不休。他描述了在开发 ext4 时的一些单元测试,KUnit可以将 ext4 与内核其他>部分孤立开,来测试特定功能,这正是它的价值所在。本文摘录了Linux社区邮件列表里关于新提议的内核单元测试框架KUnit的一些讨论帖子的部分内容,通过社区开发人员对内核测试抱怨的槽点、痛点及期待,一窥内核测试的框架的现状以及未来的发展。无论你是在轻量级的UML环境跑短测试,还是在较重的虚拟机(VM)里跑高阶测试,两者都得用到相同的框架来编写或是定义内核测试。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 769

非华为设备实现多屏协同:最新电脑管家破解安装指南

本文提供了在非华为电脑上安装华为电脑管家并实现多屏协同功能的详细破解指南。通过绕过硬件检测机制,用户可在联想、戴尔等设备上体验与华为生态类似的无缝文件拖拽、跨屏操作等功能。文章涵盖了从系统准备、工具下载、破解安装到手机连接及故障排查的全流程,助您打破设备壁垒,提升办公效率。

weixin_29209805的博客 1133

make kselftest-install 报错解决方案

运行make kselftest-install 出错的处理方法:(1)缺少命令,安装含该命令的包;(2)缺少库,安装相应的库;(3)缺少头文件,先在内部找,如果有,拷贝到需要的目录。

qq_42000667的博客 1587

Pre-suite 开发之MFi功能搭建

Pre-suite 固件中只有带无线硬件的Ezairo 7160sl才具备无线通信能力,其无线功能包括标准BLE 5.2 低功耗蓝牙功能以及非标准的低功耗无线音频流功能。Ezairo 7160sl 支持3种低功耗无线音频流协议:来自APPLE的MFi,来自Google的ASHA以及来自onsemi的remote mic。其中MFi音频流走的G.722编码的Mode1,速率为64kbps;而非MFi音频流走的G.722的Mode3,速率为48kbps.

SnowYang2017的博客 1499

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Linux Kernel Selftests

内核自测运行自检(热插拔测试以受限模式运行)运行部分自测运行全方位热插拔自测安装自检运行已安装的自测贡献新测试Example帮助操作 内核在tools/testing/selftests/目录下包含一组“self tests”。这些旨在作为小型测试,以练习内核中的各个代码路径。测试旨在在构建,安装和引导内核之后运行。 在某些系统上,热插拔测试可能永远挂起,以等待CPU和内存准备好脱机。创建一个特殊的热插拔目标以运行所有范围的热插拔测试。在默认模式下,热插拔测试在有限范围内的安全模式下运行。在受限模式下,cp

攻城狮 4206

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

LWN:Linux kernel要有几种test framework?

点击上方蓝色字关注我们~How many kernel test frameworks?ByJake EdgeJune 5, 2019Linux kernel的自测试框...

Linux News搬运工 1713

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux内核版本溯源及其新技术综述

Linux内核作为开源操作系统的核心,其版本迭代频繁,每个新版本都会带来一系列的改进和新功能。本文将对Linux内核的版本发展进行溯源,并综述其新功能和技术,同时探讨Linux未来的技术发展前景。

zhangxueyi的专栏 1140

如何测试Linux内核

本文翻译自:https://embeddedbits.org/how-is-the-linux-kernel-tested/ How is the Linux kernel tested? 您是否想过如何测试Linux内核?如何维护Linux内核这一使用了全球数千名程序员开发的,数百万行代码的开源项目的质量? 这不是一件容易的事。但这并不意味着这是一件不可能的事! 大约每3个月(10到12周)就会发布一个新的Linux内核版本。在此期间,将为“合并窗口”保留2周的时间,其中所有已开发和批准的内容都..

铁匠的七寸宫 1454

如何测试Linux内核?

您是否想过如何测试Linux内核?如何维护Linux内核这一使用了全球数千名程序员开发的,数百万行代码的开源项目的质量? 这不是一件容易的事。但这并不意味着这是一件不可能的事! 大约每3个月(10到12周)就会发布一个新的Linux内核版本。在此期间,将为“合并窗口”保留2周的时间,其中所有已开发和批准的内容都将合并到Linus Torvalds树(主线)中。剩下的8到10周的开发时间用于修复漏洞和稳定化。 在稳定阶段,会发布新的候选版本(通常每周一次)。当Linus Torvalds“觉得”代码“足

测试萌萌 3049

Linux KUnit 单元测试框架

当前Linux社区正在推KUnit单元测试框架,相关的文档在如下地址: https://google.github.io/kunit-docs/third_party/kernel/docs/

flyingnosky的专栏 3334

阿里内核月报2014年7月-8月

Capsicum for Linux Capsicum: 一种基于文件句柄的新安全模型 Capsicum是一种源自FreeBSD的安全模型,与Linux下众多LSM的相同之处在于它们都是基于权限管理的,而不同之处在于LSM针对的操作对象非常丰富,有进程、VMA、端口、带有标签的文件等等,而Capsicum操作的对象非常单一:文件句柄。例如,一个fd必须带...

weixin_33691700的博客 941

selftest测试框架开发

1.loopback test我觉得应该在QEMU端做处理,仅从virtio_net能发出去,但收不上来 2.重置后就断线了,而且ifconfig up后会panic

xhjcehust的专栏 4415

理解 Linux 动态库加载:LD_LIBRARY_PATH

flyfish

二分掌柜的 334

Linux 磁盘满了怎么排查?df / du / find 三步定位大文件

Linux 磁盘满排查三步法:df -h 定位分区、du 逐层下钻、find 按大小和时间抓大文件,附 inode 耗尽、文件已删未释放、du 与 df 不一致等经典坑的解决方案。

weixin_38291577的博客 218

Linux-iostat命令详解

Linux命令学习记录

m0xin的博客 99
上一篇: LWN:kernel API 规范和验证
下一篇: LWN:介绍一下 niri 滚动平铺 Wayland 合成器!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值