內核空間
先上表格
分配函數 | 釋放函數 | 分配原理 | 大小限制/單位 | 物理地址連續 | 初始化爲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 | 字節 | 是 | / | 吧文件映射到虛擬地址上 |