嗨,我编写了一个内核模块,它执行 2 MB kmalloc(用于物理连续内存)并将其虚拟地址转换为总线地址,用于将其virt_to_bus()
发送回应用程序。
我需要总线地址,因为我必须将它传输到另一个运行 linux 的系统并使用 pcie-link 连接到主机系统。现在另一个系统将能够使用该总线地址启动 DMA 传输。
问题是:virt_to_bus()
已弃用并导致警告,还有其他方法可以将此地址转换为总线地址吗?
嗨,我编写了一个内核模块,它执行 2 MB kmalloc(用于物理连续内存)并将其虚拟地址转换为总线地址,用于将其virt_to_bus()
发送回应用程序。
我需要总线地址,因为我必须将它传输到另一个运行 linux 的系统并使用 pcie-link 连接到主机系统。现在另一个系统将能够使用该总线地址启动 DMA 传输。
问题是:virt_to_bus()
已弃用并导致警告,还有其他方法可以将此地址转换为总线地址吗?
有没有其他方法可以将此地址转换为总线地址
是的,使用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
.