Linux 4.9内核中用vzalloc()分配内存却用kfree()释放会怎样?
在Linux 4.9内核中用kfree()释放vzalloc()分配的内存的影响及可行性
核心结论
在Linux 4.9内核环境下,绝对不能用kfree()释放vzalloc()分配的内存,这种不匹配的操作会直接触发内核崩溃或引发严重的内存损坏问题。
底层原因
- vzalloc()基于vmalloc()实现,它分配的内存来自虚拟地址空间的vmalloc区域,该区域的物理内存页是离散的,通过页表映射为连续的虚拟地址供调用者使用。
- kfree()是配合kmalloc()/kzalloc()的释放接口,管理的是物理上连续的内存块,归属于slab分配器体系,和vmalloc的内存管理逻辑完全独立。
- 两者的内存元数据结构完全不同:vzalloc分配的内存块头部带有vmalloc专属的管理信息,kfree会错误地将其当作slab分配器的元数据解析,直接破坏内存管理链表,引发内核态内存访问错误、Oops甚至系统panic。
正确的释放方式
必须使用vfree()来释放由vzalloc()分配的内存,这是内核提供的配套释放接口,能正确处理vmalloc区域的内存映射解除和元数据清理工作。
内容的提问来源于stack exchange,提问作者wtiangshzhu
相关产品推荐
相关产品推荐

