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
相关产品推荐
相关产品推荐

