linux - 是否有任何 API 用于从 Linux 中的虚拟地址确定物理地址?

标签 linux memory memory-management linux-kernel virtual-address-space

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/

相关文章:

linux - 如何让 linux 内核导出/proc/[pid]/io?

linux - 测试 :compile error

ios - 在 Swift 中,我应该在完成后将可选实例变量设置为 nil 吗?

ios - GLKit 内存泄漏 copywithZone

python - SO_REUSEPORT 可以用在 Unix 域套接字上吗?

java - Netty WebSocket 客户端 channel 在 Linux 服务器上总是处于非 Activity 状态

sql-server - SQL Server CLR 内存分配

Linux 的 PHP 扩展 : reality check needed!

c++ - **在C/C++中是什么意思?

linux - 在不使用 ioremap 或 mmap 的情况下写入 linux 内核中的可缓存物理地址