linux内核中内存分配调用API-引起的一些思考

本文详细介绍了Linux系统中不同类型的内存分配方法,包括dma_alloc_coherent、__arm_ioremap、Kmallc、Slab机制及Vmalloc等,并对它们在物理地址连续性方面的表现进行了分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1void* dma_alloc_coherent(structdevice *dev, size_t size, dma_addr_t *handle, gfp_t gfp)

bitmap中分配连续的物理内存块 物理地址连续

2void__iomem *  __arm_ioremap(unsignedlong phys_addr, size_t size, unsigned int mtype)

直接把vma描述的区域对应io地址做页表 物理地址连续

 

Kmallc

Slab机制,会把best fit的大小区域做页表 物理地址连续

Vmalloc

Getpage逐个把page描述的地址做页表 物理地址可能不连续

 

谈谈个人的理解(不对之处请大侠指点,应为没有调试和跟踪过内存管理的各模块)

1,首先page list是一个线性数组,在数组的管理上没有找到合并和就近分配的算法,因此get_page或者get_pages时候只是从页表数组中找到空闲的页。

2,Bitmap代表的是物理地址以页为单位划分的分布图。在bit管理中有相关的寻找连续块的操作。因此可以返回一块比较大且连续的内存。

3,Slab机制中有相关的best fit算法,因此保证了分配出来的内存在物理地址上的连续。

4,最后说的是ioremap和mmap类似的一种方式,直接在vma中寻找一空闲的“洞”。只要这个空闲区域满足要求分配的size大小即可。这个vma代表的区域可以是进程的4G空间的任何一段地址。然后通过ioremap_page_range这个函数直接建立页表和页表项。在缺页异常时候loadTLB完成正确的地址访问。因此所建立的页表和页表项其实代表的是物理地址开始,大小为偏移量size(length)的一段空间。落在这一段空间中任何一个地址有效。别且这个空间的颗粒度也是以page(4k)大小为单位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值