【问题标题】:Ioremapped address in kernel内核中的映射地址
【发布时间】:2016-08-04 07:24:02
【问题描述】:

我有一个关于 ioremap 的基本查询,用于将设备 IO 映射到内核的虚拟内存中。

我想知道 ioremap 返回的地址是否传递给 virt_to_phys() 等例程,它会返回设备 IO 地址吗?

谢谢

【问题讨论】:

    标签: c linux-kernel arm linux-device-driver


    【解决方案1】:

    virt_to_phys() 仅对内核线性映射中的虚拟地址有效,因为它只是一些快速地址算术,而不是完整的软件表遍历。线性映射通常只覆盖 RAM。然而,ioremap() 返回的虚拟地址通常(可能总是,但我没有耐心检查每个实现)是一个 vmalloc 地址,所以如果你将它传递给virt_to_phys() 你会得到废话.

    【讨论】:

    • 感谢您的回复。我明白你关于快速地址算法的观点,它只是从虚拟地址中减去一些偏移地址来获得物理地址。但是有没有什么api可以用来从ioremap返回的虚拟地址返回设备IO地址?
    • 通常的方法可能是“记住你一开始就叫ioremap()”。我正在努力想一个正当的理由想要一些映射设备的物理地址 outside 该设备的驱动程序,并且在驱动程序中,您可以将物理地址与 CPU 地址一起存储在您的私有数据中如果您知道将来会需要它(例如,用于设置 dmaengine 请求)。
    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2015-05-24
    • 2020-09-29
    • 2023-03-03
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多