Kernel Sanitizer Details
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_init
和kasan_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.