Linux内存从0到1学习笔记(6.10 物理内存初始化之vmalloc分配器)
Posted 高桐@BILL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内存从0到1学习笔记(6.10 物理内存初始化之vmalloc分配器)相关的知识,希望对你有一定的参考价值。
写在前面
前面有提到,kmalloc()是基于slab分配器的接口函数,slab缓冲区建立在一个物理地址连续的大内存块之上,所以其缓存对象页是物理地址连续的。如果在内核中不需要连续的物理地址,而仅仅需要内核空间的虚拟地址是连续的内存块,就需要vmalloc()函数了。
如下图,在内存布局中vmalloc分配的虚拟地址范围在VMALLOC_START/VMALLOC_END之间,属堆内存。
一、vmalloc_init()
前面提到的kmalloc基于slab分配器,slab缓冲区建立在一个物理地址连续的内存块之上,所以其缓存对象的物理地址也是连续的。如果在内核中不需要连续的物理地址,仅仅需要内核空间的虚拟地址是连续的内存,就需要vmalloc()函数了。
linux_mainline-5.17.0/mm/vmalloc.c
2339
2340 void __init vmalloc_init(void)
2341
2342 struct vmap_area *va;
2343 struct vm_struct *tmp;
2344 int i;
2345
2346 /*
2347 * Create the cache for vmap_area objects.
2348 */
2349 vmap_area_cachep = KMEM_CACHE(vmap_area, SLAB_PANIC);
2350 //遍历可用CPU,主要是初始化vbq和p两个结构体
2351 for_each_possible_cpu(i)
2352 struct
以上是关于Linux内存从0到1学习笔记(6.10 物理内存初始化之vmalloc分配器)的主要内容,如果未能解决你的问题,请参考以下文章
Linux内存从0到1学习笔记(6.8,物理内存初始化之buddy伙伴系统)
Linux内存从0到1学习笔记(六,物理内存初始化之四 --- 内存分配器)---持续更新
Linux内存从0到1学习笔记(六,物理内存初始化) --- 更新中
Linux内存从0到1学习笔记(6.7,物理内存初始化之CMA初始化)