linux 内存管理 cma,内存管理 – 如何使用保留的CMA内存?

我想为支持DMA的设备分配一些物理上连续的保留内存(在预定义的物理地址中).

我认为CMA有三种选择:

1.通过内核配置文件保留内存. 2.通过内核cmdline保留内存. 3.通过设备树内存节点保留内存.

在第一种情况下:可以保留区域的大小和数量.

CONFIG_DMA_CMA=y

CONFIG_CMA_AREAS=7

CONFIG_CMA_SIZE_MBYTES=8

所以我可以使用:

start_cma_virt = dma_alloc_coherent(dev->cmadev, (size_t)size_cma, &start_cma_dma, GFP_KERNEL);

在我的驱动程序中分配连续的内存.我可以使用它最多7次,最多可以分配8M.但不幸的是

dma_contiguous_reserve(min(arm_dma_limit, arm_lowmem_limit));

来自arch / arm / mm / init.c:

void __init arm_memblock_init(struct meminfo *mi,const struct machine_desc *mdesc)

不可能为连续分配设置预定义的物理地址.

当然我可以使用内核cmdline:

mem=cma=cmadevlabel=8M@32M cma_map=mydevname=cmadevlabel

//struct device *dev = cmadev->dev; /*dev->name is mydevname*/

之后,dma_alloc_coherent()应将物理内存区域中的内存从32M 8M(0x2000000 0x800000)分配到0x27FFFFF.

但不幸的是,这个解决方案存在问题.也许我的cmdline有错误?

接下来尝试的是设备树实现.

cmadev_region: mycma {

/*no-map;*/ /*DMA coherent memory*/

/*reusable;*/

reg = <0x02000000 0x00100000>;

};

并在某个节点中发布:

memory-region = ;

正如我在内核中常见的那样,它应该被用作:

of_find_node_by_name(); //find needed node

of_parse_phandle(); //resolve a phandle property to a device_node pointer

of_get_address(); //get DT __be32 physical addresses

of_translate_address(); //DT represent local (bus, device) addresses so translate it to CPU physical addresses

request_mem_region(); //reserve IOMAP memory (cat /proc/iomem)

ioremap(); //alloc entry in page table for reserved memory and return kernel logical addresses.

但我想使用DMA通过(因为我只知道一个外部API函数dma_alloc_coherent)dma_alloc_coherent()而不是IO-MAP ioremap().但是如何打电话

start_cma_virt = dma_alloc_coherent(dev-> cmadev,(size_t)size_cma,& start_cma_dma,GFP_KERNEL);

将内存从设备树(reg =< 0x02000000 0x00100000>;)关联到dev-> cmadev?对于cmdline,很明显它有设备名称和地址区域.

自动调用of_parse_phandle()之后的预留内存应该为您的特殊驱动程序(解析DT)预订.接下来调用dma_alloc_coherent将从cmadev_region:mycma中分配内存中的dma区域?

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值