linux源码解析06–常用内存分配函数kmalloc、vmalloc、malloc和mmap实现原理 10月前查看 评论
linux源码解析06–常用内存分配函数kmalloc、vmalloc、malloc和mmap实现原理

您好!这是一份关于内存分配函数的总结,涵盖了 kmalloc、vmalloc、malloc 和 mmap 函数。 **1. kmalloc 函数** - 基于 slab 分配器实现,分配的内存物理上连续。 - 分配流程: - 检查大小是否超过 KMALLOC_MAX_CACHE_SIZE,若超过,调用 kmalloc_large。 - 计算使用的 slab 缓冲区索引。 - 调用 kmem_cache_alloc_trace 从 slab 分配内存。 **2. vmalloc 函数** - 临时在 vmalloc 内存区申请 vma,并分配物理页面,建立映射。 - 适合分配较大内存,物理内存不一定连续。 **3. malloc 函数** - C 库实现,维护缓存,内存不足时通过系统调用 brk 向内核申请。 - 分配流程: - 从 C 库缓存分配或通过 brk 系统调用向内核申请。 - 若设置 VM_LOCKED 标志,立即分配物理页面并建立映射;否则,延迟分配。 - 访问未映射的虚拟空间时触发缺页异常,分配物理页面并建立映射。 **4. mmap 函数** - 用于用户程序分配内存、读写大文件、链接动态库、多进程内存共享等。 - 映射类型: - 私有匿名映射:fd=-1, flags=MAP_ANONYMOUS|MAP_PRIVATE - 共享匿名映射:fd=-1, flags=MAP_ANONYMOUS|MAP_SHARED - 私有文件映射:flags=MAP_PRIVATE - 共享文件映射:flags=MAP_SHARED - 分配流程: - 创建 vma 结构体。 - 根据文件关联性和映射区域属性,调用相应的映射函数。 - 建立虚拟地址到物理地址的映射。 - 默认情况下,mmap 只建立 vma,未分配物理页面,访问时触发缺页异常。 **总结** - kmalloc 和 vmalloc 适合分配内存,malloc 和 mmap 适合分配虚拟地址空间。 - 访问未映射的虚拟空间时,会触发缺页异常,内核会分配物理页面并建立映射。 - mmap 的重复映射和文件打开过多会导致性能问题。