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初始化)

Linux内存从0到1学习笔记(六,物理内存初始化之三 --- 物理内存管理数据结构)

Linux内存从0到1学习笔记(6.9,物理内存初始化之Slab分配器)