LINUX CMA 详细分析

本文深入探讨Linux CMA(Contiguous Memory Allocator)机制,解释CMA内存是同时属于reserved和memory的特殊区域,如何影响内核free统计,并讨论用户态程序何时能分配到MIGRATE_CMA页框。此外,文章揭示了为何ext2等磁盘文件系统能分配到CMA内存,而ramfs不能,并通过实验验证了CMA内存的使用情况。
摘要由CSDN通过智能技术生成

CMA是什么

在我们使用ARM等嵌入式Linux系 统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,这部分内存平时不用,但是一般的做法又必须先预留着。通过CMA机制,我们可以做到不预留内存,这些内存平时是可用的,只有当需要的时候才被分配给Camera,HDMI等设备。(本段纯属百度,阅完即可,不必惦记)

如果对CMA的实现过程有兴趣可以百度或者google。我在这里给大家来点实在的!!

CMA段内存到底是reserved 还是 memory的?内核下free统计值是否包含CMA内存?

Cma段内存既是reserved又是memory的。但更像是一段普通的memory。
start_kernel -> setup_arch -> arm_memblock_init -> dma_contiguous_reserve -> dma_declare_contiguous
在dma_declare_contiguous函数中,调用__memblock_alloc_base得到内存。这里只是将内存给扣了出来。
内存扣出来做什么?当然是留出来用哦!但CMA初始化中做了一个有趣的动作!


void __init init_cma_reserved_pageblock(struct page *page)
{
       unsigned i = pageblock_nr_pages;
       struct page *p = page;

       do {
              __ClearPageReserved(p);
              set_page_count(p, 0);
       } while (++p, --i);

       set_page_refcounted(page);
       set_pageblock_migratetype(page, MIGRATE_CMA);
       __free_pages(page, pageblock_order);
       totalram_pages += pageblock_nr_pages;
#ifdef CONFIG_HIGHMEM
       if (PageHighMem(page))
              totalhigh_pages += pageblock_nr_pages;
#endif
}
#endif

在这个函数中,先将CMA区中的page设置为MIGRATE_CMA,然后放入伙伴系统中,等待用户使用(NOTE:MIGRATE_CMA是伙伴系统中页属性的概念,所以CMA区也只是伙伴系统中的一个概念,不是一个ZONE)。
这样一初始化后,free统计时也会将CMA区的内存统计进去

用户态程序何时分配MIGRATE_CMA页框?

首先让我们看下标志位__GFP_MOVABLE的定义

#define __GFP_MOVABLE ((__force gfp_t)___GFP_MOVABLE)
#define ___GFP_MOVABLE 0x08u

这个标志位在很多地方都有使用,如磁盘文件系统分配页缓存、用户态程序分配堆栈空间等。
那我们在来看下,此类标志位是怎么影响页面分配的?
分配页面的其余流程的先不做分析&#x

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值