vmalloc的作用
valloc的作用是为了解决线性映射区空间不足的问题:
分配过程
源码路径:https://elixir.bootlin.com/linux/v5.19/source/mm/vmalloc.c
vmalloc直接调用了__vmalloc_node:
其主要过程有如下几个步骤:
步骤一:通过__get_vm_area_node获取一个虚拟地址空间:
这里的area是一个vm_struct结构,在该函数中,会通过kzalloc_node函数为其分配一个节点,然后通过alloc_vmap_area分配一片虚拟内存地址,并返回对应的vmap_area结构体va,然后通过setup_vmalloc_vm函数建立两者之间的联系;
vm_strcut和vm_area结构体定义在这里:https://elixir.bootlin.com/linux/v5.19/source/include/linux/vmalloc.h#L48
步骤二:通过__vmalloc_area_node函数为上述虚拟地址空间映射物理内存:
kvmalloc
就是将kmalloc和vmalloc整合到一起,size较小就用kmalloc,size较大就走vmalloc;
整体虚拟内存的管理结构
一个vm_struct代表一段连续的虚拟内存,因此每次vmalloc只会分配一个vm_struct;
但是一个vm_struct管理的内存空间中的物理内存可能是不连续的;
因此会有pages管理不同的物理页;
感觉还有好多不理解的😭,再写篇专门分析有关进程虚拟地址管理的😊。