Linux内核内存分配:vmalloc及相关API深入解析
1. 内核模块实验与清理
在较旧的(版本小于5.8)内核中,可以进行一个有趣的实验。若定义了宏 WR2ROMEM_BUG (默认未定义),程序会尝试向只读的 vmalloc 区域写入数据,这会导致内核错误(Oops)。相关代码片段如下:
#ifdef WR2ROMEM_BUG
/* Try writing to the RO memory! We should, of course, find that the kernel
crashes (emits an Oops!) */
pr_info("6. Attempting to now write into a kernel vmalloc-ed region that's
RO!\n");
*(u64 *) (vrx + 4) = 0xba;
#endif /* WR2ROMEM_BUG */
当在旧内核上运行此代码时,要做好内核崩溃的准备。
内核模块的清理代码很直接,会释放之前分配的所有内存区域:
static void __exit vmalloc_demo_exit(void)
{
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0)
vfree(vrx);
#endif
kvfree(kvarr);
kvfree(kv);
超级会员免费看
订阅专栏 解锁全文
36

被折叠的 条评论
为什么被折叠?



