【问题标题】:How can I get address in physical addressing area by pointer in virtual addressing area?如何通过虚拟寻址区域中的指针获取物理寻址区域中的地址?
【发布时间】:2013-11-05 14:43:04
【问题描述】:

如果我在当前进程的虚拟寻址区域中有一个指向固定(页面锁定)内存的地址(指针),那么如何通过使用在该内存区域的物理寻址区域中获取地址(指针) POSIX?

  • CPU:x86
  • 操作系统:Linux 2.6 和 Windows 7/8(服务器 2008R2)

【问题讨论】:

  • 这样的信息在用户空间中基本没有意义,因为物理地址可能一直在变化。
  • 我什至不确定这是否可行。
  • POSIX...没办法。内核模式驱动程序,是的。否则无论如何都没有用。
  • 但是如果我分配了pinned(page-locked)内存,然后我知道它不能被交换,我怎么才能得到这个内存区域的物理地址,这有意义吗?

标签: c++ c memory-management posix virtual-address-space


【解决方案1】:

您无法访问用户空间中的物理地址。您所做的一切都经过 MMU 和页表。即使你固定了一个页面,内核仍然可以在物理内存中移动它。

即使你得到它,它对你有什么用?用户空间进程不能通过物理访问直接访问内存。只有内核模式可以。

如果你真的需要这个功能(尽管我仍然无法想象任何使用这些信息的方式),你必须编写一个内核模式驱动程序。

【讨论】:

  • 谢谢!例如,如果我通过 PCI-Express 将两个映射内存区域映射到两个设备的 CPU 物理地址:FPGA 和 GPU。我希望 FPGA 和 GPU 可以在没有 CPU 的情况下进行通信和数据传输。 FPGA和GPU只能用物理地址,不能用虚拟地址,不是吗?
  • @Alex:是的,但是与硬件的通信应该在内核空间中完成,必要的结果和参数传递给用户空间和从用户空间传递。强制执行此操作的最大原因是系统稳定性(随机进程破坏 GPU 内存)和安全性(恶意进程使用 GPU 的 DMA 用恶意代码覆盖其他内核/用户内存)。
  • 那么在没有CPU的情况下FPGA和GPU之间的通信,是不是必须要写驱动,用它的API来获取CPU物理寻址区的指针,然后把这些指针指向设备(FPGA,GPU )?
  • @Alex:不完全是。您需要在驱动程序中与它们进行通信,并将结果传递给用户空间进程。但是,我建议您不要自己这样做。为什么使用 OpenGL(图形)或 OpenCL(GPU 计算)不能满足您的目的?这些是成熟、稳定的库,可以为您节省几个月尝试直接使用 GPU 的工作,然后再节省几个月的时间来支持更多种类的 GPU。
  • @Alex:让 FPGA 和 GPU 通信,还是两者都和 CPU 通信?
猜你喜欢
  • 2011-10-06
  • 1970-01-01
  • 2014-03-15
  • 2014-09-14
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
相关资源
最近更新 更多