【问题标题】:DMA memory (first 2 GB)DMA 内存(前 2 GB)
【发布时间】:2016-05-19 09:38:24
【问题描述】:

我想为 PCI 设备和 RAM 之间的 dma 传输分配内存。我正在使用下一个函数来分配内存:

pci_alloc_consistent 

我想分配 2GB 以下的内存。否则,pci 设备失败。但是这个函数提供了我的 ram (4GB) 中的任何地址。有什么解决办法吗?

BR

【问题讨论】:

    标签: linux-device-driver dma pci


    【解决方案1】:

    您可以在struct pci_dev * 上拨打pci_set_coherent_dma_mask,或者最好在pcidev->dev 上拨打dma_set_coherent_mask 来设置掩码。将掩码设置为 DMA_BIT_MASK(31) 会将相干映射限制为前 2 GiB。为了保持一致性,您可能还想通过调用 pci_set_dma_maskdma_set_mask 来限制非连贯映射。

    调用上述函数的好地方是您的 PCI 驱动程序“探测”函数。

    【讨论】:

    • 我觉得你听起来太技术化了,应该添加“应该在相关驱动程序的 PCI 部分进行更改”之类的内容。
    • @AndyShevchenko,我添加了一段关于从哪里调用函数的段落。抱歉听起来“技术性太强”。我的目标是一些技术性很强的受众——如果受众正在编写代码来执行 DMA 传输,那么在我的书中这算是“技术性很强”!
    • 我不知道你在 SO 呆了多久(啊哈,不到一年),但根据我的经验,我可以说这里有很多人第一次在 Linux 内核中编程环境。有时,在几次乒乓球比赛之后让那个人不太了解是一种负担......似乎SO缺乏良好的假设引擎来搜索重复项(或者至少我不知道),因为太多了他们中的一些人经常一次又一次地问类似的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多