2016-08-04 81 views
3

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

我想知道如果返回的地址从ioremap传递到像virt_to_phys()这样的例程,它会返回设备IO地址吗?

感谢

回答

6

virt_to_phys()仅适用于内核线性地图内的虚拟地址,因为它只是一些快速地址运算,而不是一个完整的软件表行走。线性地图通常只包含RAM。但是,由ioremap()返回的虚拟地址通常(可能总是,但我没有耐心检查每个实现)是否为vmalloc地址,因此如果您将此地址传递给virt_to_phys(),那么您会收到无意义的回报。

+0

感谢您的回复。我看到你关于快速地址算术的观点,它只是从虚拟地址中减去一些偏移地址来获得物理地址。但是有没有可用于从ioremap返回的虚拟地址返回设备IO地址的任何API? –

+1

通常的方法可能是“首先记住你所谓的'ioremap()'”。我正在努力想出一个想要某个映射设备的物理地址的合理原因_outside_该设备的驱动程序,并且在驱动程序中,如果您知道要发布,您可以将私有数据中的物理地址存储在CPU地址旁边在未来需要它(例如,用于设置dmaengine请求)。 – Notlikethat

相关问题