vmalloc 学习笔记


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管理不同的物理页;

感觉还有好多不理解的😭,再写篇专门分析有关进程虚拟地址管理的😊。

参考

https://zhuanlan.zhihu.com/p/346892153


文章作者: q1ming
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 q1ming !
  目录