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

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)大小为单位。

你可能感兴趣的:(arm)