内核空间
先上表格
分配函数 | 释放函数 | 分配原理 | 大小限制/单位 | 物理地址连续 | 初始化为0 | 适用场景 |
---|---|---|---|---|---|---|
__get_free_pages | __free_pages | buddy | 4MB/页 | 是 | 否 | 适用于分配较大量的连续物理内存 |
alloc_pages | __free_pages | buddy | 4MB/页 | 是 | 否 | 适合需要频繁申请释放相同大小内存块时使用 |
kmem_cache_alloc | kmem_cache_free | slab | 128KB/字节 | 是 | 否 | 适合需要频繁申请释放相同大小内存块时使用 |
kmalloc | kfree | kmem_cache_alloc | 128kb/字节 | 是 | 否 | 最常见的分配方式,需要小于页框大小的内存时可以使用 |
kzalloc/kcalloc | kfree | slab | 128kb/字节 | 是 | 是 | 最常见的分配方式,需要小于页框大小的内存时可以使用 |
vmalloc | vfree | slab | 无限制/字节 | 否 | 否 | 可能睡眠,不能从中断上下文中调用,或其他不允许阻塞情况下调用。VMALLOC区域vmalloc_start~vmalloc_end之间,vmalloc比kmalloc慢,适用于分配大内存。 |
dma_alloc_coherent | dma_free_coherent | __alloc_pages | 4MB/字节 | 是 | 否 | DMA操作 |
ioremap | iounmap | 物理地址到虚拟地址映射 | 字节 | 是 | / | 需要操作物理地址的时候 |
alloc_bootmem | / | 物理地址到虚拟地址映射 | 字节 | 是 | / | 在启动kernel时,预留一段内存,内核看不见 |
用户空间
分配函数 | 释放函数 | 单位 | 物理地址连续 | 初始化为0 | 适用场景 |
---|---|---|---|---|---|
malloc | free | 堆申请/字节 | 否 | 否 | 适用于分配较大量的连续物理内存 |
calloc | free | 堆申请/字节 | 否 | 是 | 适用于分配较大量的连续物理内存 |
alloca | 自动 | 栈申请/字节 | 否 | 是 | 适用于分配较大量的连续物理内存 |
mmap | munmap | 字节 | 是 | / | 吧文件映射到虚拟地址上 |