LWN:Linux kernel要有几种test framework?

Linux内核之blktests简单介绍 Linux内核之blktests简单介绍blktests最近遇到了个补丁引起的blktests测试问题,顺便了解了下blktests。它的灵感来自于xfstests文件系统测试框架。链接: https://notes.z-dd.online/2024/06/10/Linux%E5%86%85%E6%A0%B8%E4%B9%8Bblktests%E7%AE%80%E5%8D%95%E4%BB%8B%E7%BB%8D/最近遇到了个补丁引起的blktests测试问题,顺便了解了下blktests。 阅读详情
640点击上方蓝色字关注我们~



How many kernel test frameworks?

By Jake Edge
June 5, 2019


Linux kernel的自测试框架名为kselftest,已经加入kernel一段时间了。最近又有一个新的kernel unit-testing framework(KUnit)提出来,那么为什么要有两种方案共存呢?关于KUnit有一个邮件讨论话题经过了很长的讨论,大家都在争论为什么要在kernel里增加另一个测试框架。虽然kselftest和KUnit的使用场景并不一样,不过人们还是有些担心两者共存会导致内核测试整体工作的分裂。


5月上旬Brendan Giggins推送了KUnit patch set的第二版,期待能合入Linux 5.2。Greg Kroah-Hartman和Shuah Khan觉得这个可能有点时间太紧,毕竟merge window还有1周时间。不过Khan也赞同这组patch应该从她的kselftest tree这边来进入Linux kernel。这组patch里面有一些细节问题还要解决,不过整体来说已经拿到了approval和不少开发者的reviewed-by签字。


不过,Korah-Hartman和Logan Gunthorpe等人都还在抱怨KUnit对user-mode Linux (UML)的依赖。Higgins回复说“基本上解决了”。KUnit现在可以在任何体系架构上运行,不过在UML里面测试的话Python wrapper script还是需要的。他打算仔细写个文档描述清楚(后来他也确实发出来文档了)。


另一个问题是Frank Rowand提出的。从他角度来看,使用UML就意味着“避免在真实硬件或虚拟机里启动kernel”。当然,他也觉得这并不是不可以,毕竟用UML来跑Linux也就是另外一种意义上的虚拟化而已。不过,他更不喜欢的是:

KUnit对我来说就是作为kernel developer必须要去熟悉的另一个框架,带来更多麻烦,也要给我的小脑瓜里面塞更多信息进去。

我猜有些开发者估计只会尽量利用两种框架之一,这样最终会导致开发资源的分裂,还不如把所有人都引向唯一一个测试框架。

640


Khan的回复中讲,她认为kselftest和KUnit是可以互补的。Kselftest是“一组user-space测试的集合,在部分case里依赖一些kernel test module”。而KUnit就提供了一种in-kernel的测试框架。


不过Rowand没被Khan的说法说服,他觉得两个框架大部分是重复的。


与众不同的是,Ted Ts'o确实有经历证明UML测试会有帮助。他介绍过有一些针对ext4的unit test正在开发过程中,它们会能够对ext4的一些功能在独立于kernel其他部分的环境下进行测试,因此他倒觉得用UML测试会很有帮助。kselftest框架里的测试都是针对user space里运行的测试,这需要先启动一个真实的kernel。而KUnit就很简单,也能很快用起来:


所以,这就是为什么我觉得KUnit用UML不是什么问题。事实上我更觉得这是一个好功能。我们不是在测试设备驱动程序,或者内核调度器,或者任何跟体系架构有关的东西。UML并不是虚拟化。它在这个情景下能让我们尽快运行起测试代码来。启动KVM需要3~4秒时间,还包含初始化virtio_scsi和其他设备驱动。如果用UML,我们可以把其他不相干的kernel子系统尽量裁剪,裁到极致。此外,它也意味着我们能让userspace的"printf"直接跟测试框架交流,而不需要跟KVM的虚拟串口或者虚拟控制台通讯,这样搭建测试环境的花销更加能大大减少了。640


Frameworks

大家的意见分歧,可能部分来源于怎么定义framework(框架)。Ts'o坚持认为kselftest提供的不是一个in-kernel的测试框架,而Rowand也强烈反对这个说法。Rowand提出kselftest里面用到了kernel module,并且这些module也是能编译进UML kernel的。Ts'o不认为这个算是framework,毕竟“每个in-kernel的代码段要想测试都需要自己创建自己的in-kernel测试架构”。Rowand不这么看,他觉得:“kselftest的in-kernel测试都是遵循统一规范的,因此这就是一个测试框架”。对Ts'o来说,这算不上是一个框架,他评论说:

我们可能对framework的定义不太一样,在我的理解里,通过cut and paste来进行的代码重用不是一个framework。今后如果把这部分测试重写,真正利用KTF或者KUnit这样的framework,那也可以。不过它们现在并没有用真正的framework。

640


此外,Ts'o还指出kselftest需要有一个可用的user-space环境:

有一个主要的区别:kselftest需要一个userspace环境,它先启动systemd,依赖一个root file system这样才能加载module,等等等等。而Kunit就不需要root file system,也不需要启动systemd,也不允许你去跑各种perl/python/bash等等脚本。640


Rowand仍然不赞成:

Kselftest in-kernel test(我们目前讨论的是这个场景)就可以被编译进kernel,而不是编译成module,也可以编译进UML kernel。这样UML kernel就能启动、然后在UML调用init进程之前就先开始跑in-kernel test。

不需要有userspace环境,因此同KUnit的调用场景比起来开销并不多。

640


Ts'o仍然不放弃,他认为kselftest的文档从来没有提起这种测试方式。而且在init进程启动之前,有其他测试可以跑,不过并不是kselftest framework的一部分:

init执行之前kernel是有test modules可以运行——不过严格来说这并不是kselftests的一部分,也没有任何架构性的支持。而kselftests_harness头文件里面明确写了你的test case应该运行在userspace。640

Overlaps

KUnit和kselftest的功能也可能有一些重复。Knut Omang是Kernel Test Framework项目的一员,认为讨论中大家把两种不通的测试混在一起讨论了。一种是独立测试某个特定子系统的,这个子系统的开发者需要能快速并且重复运行这种测试;另一种是需要测试多个子系统的互相交互,通常应用于regression test suite里,或者continuous-integration的场景,当然开发者也会进行这种测试。ext4专门的unit test应该算是第一类,而xfstests就算是第二种类型。

Omang认为两类测试应该还是能够合并进同一个测试工具的,使用通用的configration文件,测试报告格式,等等。这就是KTF打算做的事情。不过Ts'o很怀疑可以用一个测试框架来一路走下去。目前已经有多种测试框架存在了,包括xfstests, blktests, kselftest等等。Omang还觉得UML在这种场景下把水搅得更混了:

使用UML的主要问题是你还是逃不掉启动复杂的kernel运行时环境的,而你真正需要的测试其实只是在user space上下文编译几个kernel源代码文件,然后用Valgrind等user space工具来检查这段代码。这里主要挑战是怎样在这种环境里编译好那几个源代码文件,因为通常它们编译时都会依赖一堆内核宏定义。这就是为什么你们退而求其次来找到UML。640


不过Ts'o看法不同:

在user land编译几个kernel源文件并不难,只要写一堆stub函数即可。对文件系统来说,我需要虚拟出block device layer,还有VFS层的大部分函数,scheduler和内核锁等相关函数,等等。实际上,UML就像是这堆stub函数。所以Frank说的KUnit没有提供任何支持,这一点我不同意。KUnit和ML配合着用,让我们测试内部接口的时候简单的多了,特别是相比于把这些内核源代码编译成userspace test程序来说,简单的多得多。640


Gunthorpe也觉得有一些功能重复,他区分测试类型的思路跟Omang很类似,他认为没有太多用户会使用kselftest_harness.h这里的接口,因此是应该考虑把两者重复的部分统一起来:


虽然有人不赞成,不过KUnit确实跟kselftest有很大功能重复。无论是在轻量级UML环境里跑短小的test case,还是在重量级的VM环境里跑一些偏上层的测试,最好都能用相同的框架来写in-kernel tests。对部分人来说,能在重量级的VM环境里跟其他上层测试同时运行所有UML测试,可能也会觉得很有用处。

看一下现有的selftest代码,可以看到一些Kunit正在添加的test。kselftest_harness.h内部的EXPECT_*和ASSERT_* 这些宏定义就跟KUNIT_EXPECT_*和KUNIT_ASSERT_*定义非常类似。

640


Ts'o不反对把两个框架统一起来,不过他认为kselftest_harness.h需要重构一下,in-kernel test才能够开始用它。Gunthorpe后来回复的时候似乎改变了一些想法,他觉得统一两种场景的花费太大可能不值得了:


用kunit做in-kernel test,用kselftest_harness做userspace test似乎是一个比较合理的分界线。要把kernel和userspace统一起来感觉比较难,可能并不值得。除非有人愿意做出很漂亮的工作来实现出来。640


最后,Rowand想要看到一个KUnit为什么有必要存在的证明,以及它跟kselftest有什么不同。Higgins想要一些具体的建议,关于KUnit缺少什么部分。Rowand回复指出patch里要写清楚正当理由:

讨论下来有一点应该很明确了,部分开发者并不理解kselftest包含in-kernel test,以为它只有userspace tests。因此,KUnit其实是相同功能的第二种实现方式。(可能会有争论kselftest和KUnit提供了那些in-kernel test功能,以及有多少是重复的。所以这里我说的相同功能可能并不是最终结论)因此需要把这个关键信息记录下来在patch内解释清楚。640



不过Gunthorpe仍然不同意:“在我看来,Brendan已经提供了足够多的信息来讲明Kunit的必要性”。关于kselftest是否提供了in-kernel的framework似乎变成了双方争论的难点。Ghunthorpe相信in-kernel kselftest代码应该被改成使用KUnit,他非常期待看到这样的改动。


讨论进入尾声,Higgins在5月13日贴出了v3版本的patch set,几天后又更新到了v4版本。他解决了v2里人们提及的一些代码问题,也增加了文档介绍了如何在UML之外的体系架构上运行测试。这次没有太多反对意见,很可能KUnit能够在5.3版本里合入。


全文完

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

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议上的修改再创作~


长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~


640?wx_fmt=jpeg

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03 需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。 阅读详情

相关推荐

ktf:内核测试框架-Linux内核的单元测试框架

内核测试框架(KTF) KTF是类似于Google Test的环境,用于为内核代码编写C单元测试。 测试是作为内核模块实现的,内核模块将每个测试声明为测试用例的一部分。 每个测试用例的主体均包含断言。 测试看起来像这样: TEST(examples, hello_ok) { EXPECT_TRUE(true); } “示例”是测试用例名称,“ hello_ok”是测试。 KTF提供了许多不同类型的断言,有关完整列表,请参见kernel / ktf.h。 通常,测试通过以下方式添加到测试模块的init中: ADD_TEST(test_name); 这会将测试注册到KTF框架以供以后执行。 examples /目录中有许多示例。 提供了“ ktfrun”来执行测试,它通过netlink套接字与KTF内核模块通信,以查询可用的测试并触发测试执行。 KTF的设计重点是使其 易于运行的

blktests测试

使用场景: debug kernel 测试工具说明: 测试步骤: 1)git clone https://github.com/osandov/blktests.git 2)当有自定义的patch时<使能patch如下> cd blktests 将patch copy进来 patch -p1 < xxx.patch ``` ......

weixin_43010385的博客 1291

FPGA赋能:从加权灰度均值到快速收敛的自动曝光实战

本文深入探讨了FPGA在工业视觉自动曝光算法中的应用,重点介绍了加权灰度均值法的优化实现与快速收敛策略。通过硬件友好的算法改造和流水线架构设计,FPGA方案能在1帧内完成曝光调整,显著提升处理速度和能效比,适用于复杂光照条件下的工业检测场景。

weixin_29306317的博客 82

Linux内核之Kselftests

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

DD'Notes 1249

Adversarial Texture for Fooling Person Detectors in the Physical World

本文提出了对抗纹理的想法(AdvTexture),与基本补丁攻击不同对抗纹理可以生成任意大小,可以覆盖任意大小的不了,并且纹理的任何局部都有对抗性的效果。当衣服被对抗纹理覆盖是,摄像头捕捉到的每一个局部区域都可以攻击探测器,这成功解决了片段缺失的问题。提出了一种两阶段生成方法:基于环形收割的可扩展生成攻击(TC-EGA)来制作广告纹理。第一阶段,训练一个全卷积网络FCN作为生成器,通过采样随机潜变量作为输入来产生纹理(不同于GAN中传统的生成器架构,每一层都使用卷积运算)......

weixin_49171105的博客 1067

禾赛XT16 vs XT32激光雷达实测对比:选16线还是32线?看完这篇不纠结

本文深度评测禾赛XT16与XT32激光雷达的性能差异与应用选择。通过实测数据对比,分析16线与32线激光雷达在点云密度、动态场景适应性及与IMU协同工作等方面的表现,帮助用户根据自动驾驶、机器人等不同应用场景做出最优选型决策。

table的专栏 944

发现Linux kernel kselftest的一个Bug

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

qq_42000667的博客 1000

Win11系统重装全记录:从备份Office激活到搞定RAID阵列,我的微星笔记本复活记

本文详细记录了Win11系统重装的完整过程,从数据备份到RAID阵列配置,特别针对微星笔记本的特殊硬件驱动问题提供了解决方案。文章涵盖了Office激活状态备份、BIOS设置、驱动安装顺序等关键步骤,帮助用户顺利完成系统重装并优化性能。

weixin_31421613的博客 309

3分钟装好 Logisim-Evolution:数字逻辑电路仿真软件的跨平台完整安装指南

Logisim-Evolution 是一款免费开源的数字逻辑电路设计与仿真工具。你可以在画布上摆放逻辑门、触发器、存储器等组件,拨动输入引脚后实时观察 0 和 1 如何在电路里流动。本文按实际操作顺序,讲清它在 Windows、macOS、Linux 上怎么装、装完怎么确认。 ## 📋 开工前检查表:4 项一次过 安装前花一分钟核对着下表,装包不匹配是最大的返工原因。 | 检查项 | 要求

gitblog_00627的博客 435

【异常】Codybuddy Error Code: 14003 too many requests 限流报错问题排查与解决指南

14003报错本质为服务端限流拦截,并非账号封禁或程序致命故障,90%以上的场景可通过等待冷却+规范使用行为解决。通过本文的排查步骤,可快速恢复工具使用,同时规避后续重复触发该问题。

奶爸的编程之路,也就一周冷个三天 1252

本文将详细介绍如何在 Qt (C++) 应用程序中集成 osgEarth,加载三维数字地球,并在指定经纬度添加三维模型(如飞机、建筑等)。

OSG 与 Qt 的交互通常需要处理 OpenGL 上下文。osgEarth 3.x 提供了对 Qt 的较好支持,或者可以使用。在普通 OSG 程序中,你需要手动处理坐标系转换将经纬度转为笛卡尔坐标 (XYZ)。这是实现的关键,将 OSG 的渲染循环集成到 Qt 的事件循环中。第三方库,但在本教程中,我们将展示一种通过继承。,将 Qt 的输入事件转换为 OSG 理解的。事件,这是实现交互(旋转地球、缩放)的基础。来嵌入 OSG 视图的标准方法。在这里我们初始化地球并添加模型。节点简化了这一过程。

qq_45859163的博客 1044

Low-Level Programming University 学习路线图:从汇编、C 与 Rust 到 Linux 内核的底层编程完全指南

> 本指南以 [README_es.md](https://link.gitcode.com/i/0c8c0ad30c7e91e659279c80b84253f0)(西班牙语版)为主体,并结合英文原版 [README.md](https://link.gitcode.com/i/3230609940b5a7f6ae8aaf93ece329a0) 与中文版 [README_cn.md](https:

gitblog_07670的博客 385

ThingsBoard3.9.1规则引擎方式发送钉钉通知消息

thingsboard3.9.1/4.0规则链方式发送钉钉通知消息。

hssjf的专栏 530

Low-Level Programming University 底层程序员路线图:从汇编、C 语言到 Linux 内核的完整学习指南

本文以开源项目 Low-Level Programming University 的官方文档为核心,系统梳理一条从零起步、最终成长为底层程序员(low-level programmer)与 Linux 内核工程师的学习路线。该路线图覆盖两条理论基石(计算机体系结构与操作系统)、三门核心语言(汇编、C、Rust)、三大应用方向(硬件与固件、Linux 内核与设备驱动、其他底层应用),并给出按顺序可执

gitblog_00160的博客 795

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LWN: Linux稳定分支状况以及相应测试

点击上方蓝色字关注我们~Testing and the stable treeByJake EdgeMay 28, 2019LSFMMSasha Levin在2019 ...

Linux News搬运工 548

IMSL CNL 7.0.0 (x86-64)Crack

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

代码质量保证体系——Linux

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

1927

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

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

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

LWN:实时Linux和嵌入式Linux的当前状态!

关注了就能看到更多这么棒的文章哦~The state of realtime and embedded LinuxBy Jonathan CorbetApril 25, 2024OSSNAChatGPT translationhttps://lwn.net/Articles/970555/Linux 以存在于众多类型的系统中而闻名。其中服务器和数据中心确实获得了大量的关注,而今年又总是被称为 Li...

Linux News搬运工 484

LWN: linux-next 的最佳实践

Torvalds 说,这种习惯也会在 linux-next 中引起麻烦,但 Mark Brown 认为,只有在其他人在已变基的仓库基础上进行构建时,变基才会真正成为问题。Jiri Kosina 询问,既然这些仓库应该已经被拉入 linux-next 并在那里进行了构建测试,那么 Torvalds 在提取仓库时遇到的构建问题是如何发生的。当维护者在将提交发送到主线之前对其进行拣选 (cherry-pick) 时,也会产生额外的问题,这使得追踪这些提交在 linux-next 中出现时的状态变得更加困难。

Linux News搬运工 147

Linux内核代码调测,linux-kernel-test

本文目标学习Linux内核和驱动测试环境搭建本文推荐使用QEMU等环境,这里部署个人测试环境搭建模块整体说明kernel-test # 内核基础测试driver-test # 驱动基础测试pcie-test # Linux下PCIE驱动相关测试代码driver-test说明() # 描述了基础的设备驱动文档和代码 test_01_algo # 基础的数据结构和算法 test_02_m...

weixin_35681965的博客 536

LWN:Linux图形栈简介,第一部分!

关注了就能看到更多这么棒的文章哦~The Linux graphics stack in a nutshell, part 1December 19, 2023This article was contributed by Thomas ZimmermannChatGPT translationhttps://lwn.net/Articles/955376/Linux 图形开发者经常提到“现代”L...

Linux News搬运工 916

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

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

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

LWN:改进page-fault的可扩展性!

关注了就能看到更多这么棒的文章哦~Improving page-fault scalabilityBy Jonathan CorbetMay 29, 2023LSFMM+BPFDeepL assisted translationhttps://lwn.net/Articles/932298/某些话题总是每年都要回到开发会议上来讨论一次,通常是因为开发人员仍在努力针对某个特定的问题寻找一个可行的解决...

Linux News搬运工 1164

LWN:Linux图形栈简介,第二部分!

关注了就能看到更多这么棒的文章哦~The Linux graphics stack in a nutshell, part 2December 28, 2023This article was contributed by Thomas ZimmermannChatGPT translationhttps://lwn.net/Articles/955708/在屏幕上显示应用程序的图形化输出内容需要...

Linux News搬运工 791

LWN:统一Linux 随机数设备!

关注了就能看到更多这么棒的文章哦~Uniting the Linux random-number devicesBy Jake EdgeFebruary 16, 2022DeepL ass...

Linux News搬运工 1143
上一篇: LWN:再次提交fs-verity方案!最终版?!
下一篇: 腾讯云网络事业部招聘Linux网络工程师(初级、高级、资深、架构师统统都可以)...
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值