virt_to_bus()在linux内核模块编译中已弃用

fly*_*igh 2 c kernel-module linux-kernel

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

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

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

cni*_*tar 5

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

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

#define virt_to_bus virt_to_phys
#define bus_to_virt phys_to_virt
Run Code Online (Sandbox Code Playgroud)

它们的通用对应物,在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)
Run Code Online (Sandbox Code Playgroud)

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


我真的没有使用DMA的经验,但有很多信息指出dma_map*应该替换virt_to_bus.