2

嗨,我编写了一个内核模块,它执行 2 MB kmalloc(用于物理连续内存)并将其虚拟地址转换为总线地址,用于将其virt_to_bus()发送回应用程序。

我需要总线地址,因为我必须将它传输到另一个运行 linux 的系统并使用 pcie-link 连接到主机系统。现在另一个系统将能够使用该总线地址启动 DMA 传输。

问题是:virt_to_bus()已弃用并导致警告,还有其他方法可以将此地址转换为总线地址吗?

4

1 回答 1

5

有没有其他方法可以将此地址转换为总线地址

是的,使用virt_to_phys. 内核中的快速浏览显示了 x86 的情况:

#define virt_to_bus virt_to_phys
#define bus_to_virt phys_to_virt

它们的通用对应物,在 asm-generic/io.h 中定义,分别简单地转换为unsigned long/ void *


当然你知道你总是可以减去PAGE_OFFSET线性映射内存来获得物理地址。

编辑

我正在使用手臂

在这种情况下,您可能正在寻找dma_map_single.

static inline dma_addr_t dma_map_single(struct device *dev, void *cpu_addr,
    size_t size, enum dma_data_direction dir)

缓冲区必须预先分配(例如使用 kmalloc())。它的 DMA 使用 dma_map_single() 设置。


我对 DMA 的经验真的很少,但是有很多信息指出dma_map*应该替换virt_to_bus.

于 2012-05-11T07:25:11.313 回答