本文共 1014 字,大约阅读时间需要 3 分钟。
get_free_pages 申请大块连续物理内存
kmalloc kmem_cache_alloc 基于slab 的分配机制
dma_alloc_coherent
vmalloc 建立非连续物理内存到虚拟地址的映射
ioremap 使用与物理地址已知的场合
alloc_mem 启动内核时预留一段,内核看不到
void* alloc_bootmem(unsigned long size)
可以在Linux内核引导过程中绕过伙伴系统来分配大块内存。使用方法是在Linux内核引导时,调用mem_init函数之前用alloc_bootmem函数申请指定大小的内存。如果需要在其他地方调用这块内存,可以将alloc_bootmem返回的内存首地址通过EXPORT_SYMBOL导出,然后就可以使用这块内存了。这种内存分配方式的缺点是,申请内存的代码必须在链接到内核中的代码里才能使用,因此必须重新编译内核,而且内存管理系统看不到这部分内存,需要用户自行管理。测试结果表明,重新编译内核后重启,能够访问引导时分配的内存块。
分配原理
最大内存
其他
__get_free_pages
直接对页框进行操作
4MB
适用于分配较大量的连续物理内存
kmem_cache_alloc
基于
slab
机制实现
128KB
适合需要频繁申请释放相同大小内
存块时使用
kmalloc
基于
kmem_cache_alloc
实现
128KB
最常见的分配方式,需要小于页框
大小的内存时可以使用
vmalloc
建立非连续物
理内存
到虚拟地址的映射
物理不连续,适合需要大内存,但
是对地址连续性没有要求的场合
dma_alloc_coherent
基于
__alloc_pages
实现
4MB
适用于
DMA
操作
ioremap
实
现已
知物理
地址到
虚拟地址的映射
适用于物理地址已知的场合,如设
备驱动
alloc_bootmem
在启动
kernel
时,预留
一段内存,内核看不见
小于物理内存大小,内存管理要
参考资料:
常见内存操作函数:
http://wenku.baidu.com/link?url=ZuyWzYBcE6KYQ27XgjfA9zJTJhlX85opl_UqYum2KrnFUI-_7leAPXiEpPYDolLaoJdIXldEaDV-MEtH7ejuJmXl3cBiBm9jqOO2M4e8i
转载地址:http://etloi.baihongyu.com/