9.【linux驱动】一文看懂linux内存分配malloc、zalloc、kmalloc、kzalloc

内核空间

先上表格

分配函数 释放函数 分配原理 大小限制/单位 物理地址连续 初始化为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 字节 / 吧文件映射到虚拟地址上
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章