Linux操作系统中是否有API可以从虚拟地址中判断物理地址?
最佳答案
内核和用户空间使用由内存管理硬件映射到物理地址的虚拟地址(也称为线性地址)。此映射由页表定义,由操作系统设置。
DMA 设备使用总线地址。在 i386 PC 上,总线地址与物理地址相同,但其他架构可能具有特殊的地址映射硬件来将总线地址转换为物理地址。
在 Linux 中,您可以使用 asm/io.h
中的这些函数:
- virt_to_phys(virt_addr);
- phys_to_virt(phys_addr);
- virt_to_bus(virt_addr);
- bus_to_virt(bus_addr);
所有这些都是关于访问普通内存的。 PCI 或 ISA 总线上还有“共享内存”。它可以使用 ioremap() 映射到 32 位地址空间内,然后通过 readb()、writeb() 等函数使用。
周围有各种缓存,因此生活变得复杂,因此访问同一物理地址的不同方式不必给出相同的结果。
另外,虚拟地址后面的真实物理地址可以改变。更重要的是 - 在您访问该内存之前,可能没有与虚拟地址相关联的地址。
至于用户级 API,我不知道。
关于linux - 是否有任何 API 用于从 Linux 中的虚拟地址确定物理地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5748492/