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 - 在Linux中是否有用于从虚拟地址确定物理地址的API?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5748492/

    10-11 20:34
    查看更多