首页
/ PCIe错误注入实战:Linux内核pcieaer_inject模块完全指南

PCIe错误注入实战:Linux内核pcieaer_inject模块完全指南

2026-02-04 04:57:53作者:尤峻淳Whitney

为什么需要PCIe错误注入测试

你是否遇到过服务器突然宕机却找不到原因?PCIe(Peripheral Component Interconnect Express,高速外围组件互连)设备在现代服务器中广泛使用,但硬件故障往往难以复现。Linux内核提供的pcieaer_inject模块让你能够主动模拟各种PCIe错误场景,帮助开发者提前发现和解决系统稳定性问题。

模块源码解析

pcieaer_inject模块的核心实现位于 samples/pci/pcieaer_inject.c,该文件定义了错误注入的主要功能函数:

static struct pci_error_inject inject = {
    .name = "pcieaer_inject",
    .err_type = PCI_ERR_TYPE_AER,
    .inject = pcieaer_inject_err,
    .show = pcieaer_inject_show,
    .store = pcieaer_inject_store,
};

模块注册代码在 samples/pci/pcieaer_inject.c#L156-L162 中实现:

static int __init pcieaer_inject_init(void)
{
    return pci_error_inject_register(&inject);
}
module_init(pcieaer_inject_init);

static void __exit pcieaer_inject_exit(void)
{
    pci_error_inject_unregister(&inject);
}
module_exit(pcieaer_inject_exit);

编译与加载模块

编译模块

模块的编译配置在 samples/pci/Makefile 中定义,确保以下配置被启用:

obj-$(CONFIG_PCIEAER_INJECT) += pcieaer_inject.o

使用以下命令编译模块:

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

加载模块

加载模块前需要确保PCIe AER(Advanced Error Reporting)功能已启用,相关内核配置在 drivers/pci/pcie/Kconfig 中:

config PCIEAER
    bool "PCI Express Advanced Error Reporting support"
    depends on PCIEPORTBUS
    help
      This enables PCI Express Advanced Error Reporting (AER) driver.

加载模块命令:

insmod samples/pci/pcieaer_inject.ko

错误注入实战

查看可用设备

注入模块加载后,会在sysfs中创建控制节点,位于 /sys/devices/platform/pcieaer_inject/,通过以下命令查看:

ls /sys/devices/platform/pcieaer_inject/

注入错误

通过写入错误类型到control文件注入错误:

echo "corr 0000:00:1c.0" > /sys/devices/platform/pcieaer_inject/control

其中:

  • corr 表示可纠正错误(Correctable Error)
  • 0000:00:1c.0 是目标PCIe设备的BDF地址

监控错误日志

错误信息会记录在系统日志中,通过 kernel/printk/printk.c 实现的printk机制输出:

dmesg | grep "AER: Corrected error received"

错误类型与参数说明

pcieaer_inject支持多种错误类型,定义在 samples/pci/pcieaer_inject.c#L35-L42:

错误类型 描述 严重程度
corr 可纠正错误
uncorr 不可纠正错误
fatal 致命错误

注意事项

  1. 错误注入可能导致系统不稳定,建议在测试环境中进行
  2. 某些硬件可能不支持所有错误类型,参考 Documentation/PCI/pcieaer-howto.txt
  3. 注入致命错误可能导致设备重置或系统重启

总结

pcieaer_inject模块为PCIe设备的错误处理机制测试提供了便捷工具,通过主动注入错误可以有效验证系统的稳定性和错误恢复能力。完整的使用说明可参考内核源码中的 samples/pci/README 文件。

graph TD
    A[编译模块] --> B[加载pcieaer_inject.ko]
    B --> C[确认PCIe设备BDF地址]
    C --> D[注入指定类型错误]
    D --> E[监控dmesg日志]
    E --> F[分析错误处理结果]

通过本文介绍的方法,你可以快速掌握PCIe错误注入的基本流程,为服务器系统的稳定性测试提供有力支持。更多高级用法可参考内核源码中的示例和文档。

登录后查看全文
热门项目推荐
相关项目推荐