DMA内存相关

 

A =dma_alloc_coherent(B,C,D,GFP_KERNEL);
含义:
A: 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存
B: struct device指针,可以平台初始化里指定,主要是dma_mask之类,可参考framebuffer
C: 实际分配大小,传入dma_map_size即可
D: 返回的内存物理地址,dma就可以用。
所以,A和D是一一对应的,只不过,A是虚拟地址,而D是物理地址。对
任意一个操作都将改变缓冲区内容。当然要注意操作环境。

 

dma_alloc_coherent and kalloc+dma_map_single

dma_alloc_coherent 使用者可不关注cacha一致性问题。

后者需要考虑。

 

 

reserved-memory

CMA对应的reserved memory节点必须有reusable属性,不能有no-map的属性。具体reusable属性的reserved memory有这样的特性,即在驱动不使用这些内存的时候,OS可以使用这些内存(当然有限制条件),而当驱动从这个CMA area分配memory的时候,OS可以reclaim这些内存,让驱动可以使用它。no-map属性和地址映射相关,如果没有no-map属性,那么OS会为这段memory创建地址映射,象其他普通内存一样。但是有no-map属性的往往是专用于某个设备驱动,在驱动中会进行io remap,如果OS已经对这段地址进行了mapping,而驱动又一次mapping,这样就有不同的虚拟地址mapping到同一个物理地址上去,在某些ARCH上(ARMv6之后的cpu),会造成不可预知的后果。

no-map属性,那么这段memory会从系统中之间删除(memory type和reserved type数组中都没有这段memory的定义。

没有nomap属性的,会加入memblock,但后面不会进入伙伴系统。http://www.wowotech.net/memory_management/cma.html

 

 

dma zone现在内核都是定义从dts里 region[0].base  ~  min(region[end].base, region[0].base+4G)  

static void __init zone_sizes_init(unsigned long min, unsigned long max)
{
    struct memblock_region *reg;
    unsigned long zone_size[MAX_NR_ZONES], zhole_size[MAX_NR_ZONES];
    unsigned long max_dma = min;

    memset(zone_size, 0, sizeof(zone_size));

    /* 4GB maximum for 32-bit only capable devices */
#ifdef CONFIG_ZONE_DMA
    max_dma = PFN_DOWN(arm64_dma_phys_limit);
    zone_size[ZONE_DMA] = max_dma - min;
#endif
    zone_size[ZONE_NORMAL] = max - max_dma;

 

 

 

改动案例:

上层模块使用ion 的carveout 类型内存,即普通的reserved段,同给ion carvout来获取,利用率不高。

于是改成cma 内存,具体reusable属性的reserved memory有这样的特性,即在驱动不使用这些内存的时候,OS可以使用这些内存(当然有限制条件),而当驱动从这个CMA area分配memory的时候,OS可以reclaim这些内存,让驱动可以使用它。

 * @ION_HEAP_TYPE_SYSTEM:    memory allocated via vmalloc

 * @ION_HEAP_TYPE_SYSTEM_CONTIG: memory allocated via kmalloc

 * @ION_HEAP_TYPE_CARVEOUT:       memory allocated from a prereserved

 *                            carveout heap, allocations are physically

 *                            contiguous

 * @ION_HEAP_TYPE_DMA:         memory allocated via DMA API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值