作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想获得与 dma_alloc_coherent
分配的内存块相关联的 PFN用于 PCIe 设备,如下所示:
unsigned long pfn;
buffer = dma_alloc_coherent(&pcie->dev, size, &bus_addr, GFP_KERNEL);
// Get PFN?
virt_to_phys(buffer) >> PAGE_SHIFT;
dma_to_pfn
的 ARM 函数,这似乎正是我需要的,但对于 x86。
最佳答案
你的做法确实是错误的。来自 virt_to_phys()
的手册页:
This function does not give bus mappings for DMA transfers. In almost all conceivable cases a device driver should not be using this function.
dma_to_phys()
, 在
include/linux/dma-direct.h
中定义如下:
phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr);
dma_to_phys(&pcie->dev, bus_addr) >> PAGE_SHIFT;
bus_addr
由
dma_alloc_coherent()
返回,而不是
buffer
,因为您显然需要将 DMA 地址 (
dma_addr_t
) 传递给此函数,而不是虚拟地址。
PHYS_PFN()
定义于
include/linux/pfn.h
获取给定物理地址的 PFN,如果您更喜欢使用它:
PHYS_PFN(dma_to_phys(&pcie->dev, bus_addr));
关于linux-kernel - 从 DMA 地址 (dma_addr_t) 获取 PFN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59847162/
我想获得与 dma_alloc_coherent 分配的内存块相关联的 PFN用于 PCIe 设备,如下所示: unsigned long pfn; buffer = dma_alloc_cohere
我是一名优秀的程序员,十分优秀!