温馨提示×

怎样测试linux drivers

小樊
42
2026-09-24 22:05:37
栏目: 智能运维

测试 Linux 驱动(drivers)通常分为功能测试、稳定性测试、性能测试、边界/异常测试几个层次。下面按“从简单到系统”的方式给你一个实用指南。


一、最基础的测试方式(手工加载/卸载)

1. 编译驱动

make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

2. 加载 / 卸载

sudo insmod mydrv.ko
sudo rmmod mydrv

3. 查看信息

dmesg | tail
lsmod | grep mydrv

✅ 适合:验证能否加载、是否有 oops、printk 输出是否正确


二、用户态测试(最常见)

1. 字符设备驱动

fd = open("/dev/mydev", O_RDWR);
read(fd, buf, size);
write(fd, buf, size);
ioctl(fd, CMD, &arg);

2. 测试工具

  • echo / cat
  • dd
  • 自己写 C / Python 测试程序

✅ 适合:验证接口、数据正确性


三、自动化测试(推荐)

1. 使用 shell / Python 脚本

for i in $(seq 1 100); do
    ./test_app
done

2. Python 示例

with open("/dev/mydev", "rb") as f:
    data = f.read(1024)

✅ 适合:回归测试


四、内核自带测试框架

1. KUnit(内核单元测试)

make ARCH=um menuconfig
make ARCH=um run_tests

✅ 适合:纯逻辑函数、算法


2. kselftest

make -C tools/testing/selftests
sudo make -C tools/testing/selftests run_tests

✅ 适合:系统调用、接口行为


五、稳定性 & 压力测试

1. 并发测试

  • 多线程 / 多进程同时 open/write
  • stress-ng
stress-ng --dev /dev/mydev --timeout 60s

2. 长时间运行

while true; do ./test_app; done

六、异常 & 边界测试(非常重要)

  • 非法参数(ioctl / write)
  • 突然 close
  • 热插拔(USB / PCI)
  • 低内存环境
  • 中断风暴

七、调试 & 问题定位

1. 打印

pr_info("val=%d\n", val);

2. 动态调试

echo 'file mydrv.c +p' > /sys/kernel/debug/dynamic_debug/control

3. 崩溃分析

dmesg
addr2line -e mydrv.ko <addr>

4. 工具

  • gdb + kgdb
  • ftrace
  • perf

八、真实设备 vs 虚拟设备

类型 测试方式
真实硬件 实际插拔、信号测量
USB usbmon
PCI lspci, setpci
虚拟驱动 dummy, loop, null

九、一个简单测试流程示例

  1. insmod
  2. dmesg 检查初始化
  3. 用户程序读写
  4. 并发测试
  5. rmmod
  6. 检查内存泄漏(kmemleak)

如果你愿意,可以告诉我:

  • 驱动类型(字符 / 块 / 网络 / USB / PCI)
  • 内核版本
  • 是否真实硬件

我可以给你针对性的测试方案和示例代码

0