1. 为什么需要vmalloc机制
第一次接触Linux内核内存管理时,很多人会有这样的疑问:内核已经有了kmalloc这样高效的内存分配器,为什么还需要vmalloc?这个问题要从x86架构的历史说起。在32位系统上,内核只能直接访问1GB的地址空间(3GB-4GB),其中前896MB被设计为直接映射区。这意味着物理内存的前896MB被线性映射到这个区域,访问时只需要简单的地址偏移计算(虚拟地址=物理地址+3GB)。
但这里有个致命限制:如果物理内存超过896MB,多出来的部分就无法通过直接映射区访问了。想象一下你买了4GB内存的电脑,内核却只能用前896MB,这显然不合理。vmalloc机制就是为了解决这个痛点而生的,它像一座桥梁,让内核能够访问那些"遥不可及"的高端内存。
实际项目中我遇到过这样的场景:开发视频处理驱动时需要申请200MB的缓冲区,用kmalloc总是失败,换成vmalloc就完美解决。这是因为:
- kmalloc要求物理连续,系统运行一段时间后很难找到这么大的连续空间
- vmalloc只需要虚拟地址连续,物理页可以分散,通过页表巧妙"组装"成连续的虚拟空间
2. vmalloc的工作原理
2.1 地址空间布局
现代Linux内核采用更灵活的地址空间划分,但基本原理相同。以x86_64为例:
+---------------------+ 0xffffffffffffffff
| |
| Kernel Space |
| |
+---------------------+ 0xffff800000000000
| |
| vmalloc区 |
| |
+---------------------+ VMALLOC_START
| |
| 直接映射区 |
|


3847

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



