Linux内核设置poison

在Linux内核中,内存Poisoning是一种调试技术,用于检测内存使用错误(如释放后使用、未初始化访问)。以下是配置和启用内存Poisoning的步骤:


1. 配置内核选项

  • 页级Poisoning(Page Poisoning)
    启用此选项后,内核在释放内存页时填充特定模式(如0xAA),分配时检查是否被篡改。

    1
    CONFIG_PAGE_POISONING=y
  • SLUB分配器Poisoning
    针对SLUB分配器(小对象内存管理),启用内存填充和校验:

    1
    2
    CONFIG_SLUB_DEBUG=y
    CONFIG_SLUB_DEBUG_ON=y # 默认启用调试(可选)
  • KASAN(内核地址消毒剂)
    更全面的内存错误检测工具,包含Poisoning功能:

    1
    2
    CONFIG_KASAN=y
    CONFIG_KASAN_GENERIC=y

2. 修改内核启动参数

在引导加载器(如GRUB)的配置中,添加以下参数:

  • 启用页Poisoning

    1
    page_poison=1
  • 启用SLUB Debug

    1
    slub_debug=FZP  # F: RedZoning, Z: Poisoning, P: Tracking

3. 编译并启动新内核

1
2
make oldconfig && make -j$(nproc) && sudo make install
sudo reboot

4. 验证配置

  • 检查启动日志
    使用dmesg查看是否启用了相关功能:

    1
    dmesg | grep -iE "poison|slub|kasan"
  • 触发测试用例
    编写内核模块尝试访问已释放内存,观察是否触发错误(如Kernel Oops)。


5. 工作原理

  • 填充模式
    释放内存时填充特定值(如0x6B0xAA),分配时校验这些值是否被修改。

  • 错误检测
    若内存被意外访问,模式不匹配会触发警告或崩溃,帮助定位问题。


常见问题

  • 性能影响
    Poisoning会增加内存操作开销,建议仅在调试环境启用。

  • 配置冲突
    KASAN与某些架构或旧内核不兼容,需检查文档。


通过以上步骤,您可以在Linux内核中启用内存Poisoning功能,有效捕捉内存相关错误。