gpt4 book ai didi

c - virt_to_bus() 在 linux 内核模块编译中被弃用

转载 作者:行者123 更新时间:2023-12-05 01:48:34 25 4
gpt4 key购买 nike

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

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

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

最佳答案

is there any other way around to translate this address to bus address

是的,使用 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 以获得物理地址。

编辑

I am using arm

在这种情况下,您可能正在寻找 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)

The buffer has to be pre-allocated (e.g. using kmalloc()). DMA for it is set up with dma_map_single().


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

关于c - virt_to_bus() 在 linux 内核模块编译中被弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10547171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com