Kernel Sanitizer Details

Zheng Yu lucky

Tips

  • 尽管用户态的Memory Sanitizer是原始内存和对应的shadow memory一起使用,的对应关系是静态的。但是KMSAN的shadow memory是动态分配的,每个页对应的shadow page存储在struct page中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /*
    * KMSAN metadata for this page:
    * - shadow page: every bit indicates whether the corresponding
    * bit of the original page is initialized (0) or not (1);
    * - origin page: every 4 bytes contain an id of the stack trace
    * where the uninitialized value was created.
    */
    struct page *kmsan_shadow;
    struct page *kmsan_origin;

    这样设计的原因在于KMSAN要求更多shadow memory来存储信息,然而内核中无法找到足够的连续空间来存储shadow memory。这样事实上造成了KMSAN无法将检查函数内联到代码中,将造成性能损失。(尽管KMSAN的设计者是这样解释使用动态分配shadow memory的理由的,但我认为这样的设计是为了兼容Linux内核的设计,考虑到现在许多架构支持五级页表,我们完全可以把其他区域例如vmalloc的区域用来存储shadow memory,这样就可以实现内联检查函数,而不需要动态分配shadow memory)。

  • KASAN为了节省内存(这是我猜的,例如对于一些不需要检查的区域,可以把它们的shadow memory映射到同一个物理页),会事先将整个shadow memory区域映射到同一个事先准备好的全局物理页上。详细可以看kasan_early_initkasan_init函数。

Reference

  • Post title:Kernel Sanitizer Details
  • Post author:Zheng Yu
  • Create time:2023-04-01 14:46:00
  • Post link:https://dataisland.org/2023/04/01/kernel-sanitizer-detail/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
On this page
Kernel Sanitizer Details