通过伙伴系统申请内核内存的系统的函数

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

posted @ 2022-03-06 19:27  cogitoergosum  阅读(104)  评论(0编辑  收藏  举报