通过伙伴系统申请内核内存的系统的函数
a、内在分配有两类算法:
1、伙伴系统
2、slab机制
b、常用内存分配函数
__get_free_pages
__get_free_pages函数是最原始的内存分配方式,直接从伙伴系统中获取原始页框,返回值为第一个页框的起始地址。
kmem_cache_alloc
是基于slab分配器的一种内存分配方式,适用于反复分配释放同一大小内存块的场合
kmalloc
kmalloc是内核中最常用的一种内存分配方式,它通过调用kmem_cache_alloc 函数来实现。kmalloc一次最多能申请的内存大小由
include/linux/Kmalloc_size.h的内容来决定
其中kmalloc有kzalloc & devm_kzalloc
kzalloc()实现了kmalloc()+memset()的功能。devm_kzalloc 是具有资源管理的 kzalloc()。使用资源管理(resource-managed)函数分配的内存,是会与所属设备相关联。当设备从系统中分离或者设备驱动被卸载,该内存会被自动释放。也可以通过devm_kfree()来释放内存
vmalloc
但是在某些场合中,对内存区的请求不是很频繁,较高的内存访问时间也可以接受,这是就可以分配一段线性连续,物理不连续的地址,带来的好处是一次可以分配较大块的内存
dma_alloc_coherent
DMA是一种硬件机制,允许外围设备和主存之间直接传输IO数据,而不需要 CPU的参与,使用DMA机制能大幅提高与设备通信的吞吐量
ioremap
ioremap是一种更直接的内存“分配”方式,使用时直接指定物理起始地址和 需要分配内存的大小,然后将该段物理地址映射到内核地址空间。ioremap用到的物理地址空间都是事先确定的,和上面的几种内存 分配方式并不太一样,并不是分配一段新的物理内存。ioremap多用于设备驱动,可以让CPU直接访问外部设备的IO空间。ioremap能映射的内存由原有的物理内存空间决定,所以没有进行测试
参考链接:https://mp.weixin.qq.com/s/Sc8rNQYCsARF9z6n9dpgcQ