C - virt_to_bus() 在 Linux 内核模块编译中已弃用



嗨,我编写了一个内核模块,该模块执行 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

最新更新