You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

vmalloc()相关vm_struct链表创建及内存分配技术疑问

关于vmalloc与vm_struct的疑问解答

1. vm_struct链表的创建机制

vm_struct链表并不是系统启动时就预先创建好的,和kmem_cache_create预先创建slab缓存的机制完全不同:

  • 每次调用vmalloc()时,内核会先在vmalloc专属虚拟地址空间(x86_64架构下是独立于直接映射区的一段虚拟地址范围)里查找一段连续的空闲虚拟地址。
  • 找到合适的地址范围后,内核会通过kmalloc从slab分配器动态分配一个新的vm_struct结构体,把它添加到vm_structs链表中,用来记录这段虚拟地址区域的信息(比如起始地址、长度、物理页指针等)。
  • 之后内核才会分配离散的物理页(可能来自ZONE_NORMAL等内存域),并建立虚拟地址到物理页的页表映射。

简单说,vmalloc()不止调整页表,还包含了地址空间查找、vm_struct动态分配、物理页分配等多个步骤。

2. 16GB x86_64机器的ZONE_NORMAL用途

ZONE_NORMAL绝对不会全部用来创建vm_struct链表:

  • vm_struct本身是很小的元数据结构(单结构体仅几十字节),就算创建大量节点,占用的内存也可以忽略不计。
  • ZONE_NORMAL是内核管理常规物理页的核心区域,主要用于分配连续物理页、承载slab缓存的底层页、以及给vmalloc提供离散物理页等。
  • vmalloc使用的是虚拟地址空间,它的物理页是按需从ZONE_NORMAL等区域分配的离散页,只有当你实际调用vmalloc()申请内存时,才会从ZONE_NORMAL取对应大小的物理页,而非把整个ZONE_NORMAL预留给vm_struct链表。

内容的提问来源于stack exchange,提问作者Franc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:50:24