【发布时间】:2010-09-26 20:47:58
【问题描述】:
在我的 C++ 程序(在 Windows 上)中,我正在分配一块内存,并且可以确保它在物理内存中保持锁定(未交换且连续)(即使用 VirtualAllocEx()、MapUserPhysicalPages() 等)。
在我的进程上下文中,我可以获得该块的虚拟内存地址, 但我需要找出它的物理内存地址 以便将其传递给某个外部设备。
1. 有什么方法可以在我的程序中以 USER 模式将虚拟地址转换为物理地址?
2. 如果没有,我只能在 KERNEL 模式下找到这个虚拟到物理的映射。我想这意味着我必须编写一个驱动程序来做到这一点......?您是否知道我可以使用的任何现成的驱动程序/DLL/API,我的应用程序(程序)将与之交互以进行翻译?
3. 如果我必须自己编写驱动程序,我该如何进行翻译?我使用哪些功能?是 mmGetPhysicalAddress() 吗?我该如何使用它?
4. 另外,如果我理解正确,mmGetPhysicalAddress() 返回调用进程上下文中的虚拟基地址的物理地址。但是,如果调用进程是驱动程序,并且我正在使用我的应用程序来调用该函数的驱动程序,那么我正在更改上下文并且在调用 mmGetPhysicalAddress 例程时我不再处于应用程序的上下文中......所以如何转换应用程序(用户模式)内存空间中的虚拟地址,而不是驱动程序?
任何答案、提示和代码摘录将不胜感激!
谢谢
【问题讨论】:
-
我很好奇,外部设备可以用物理内存地址做什么?
-
没有详细说明,它是一个板载设备,可以直接访问机器的 RAM,但不知道操作系统映射(这就是为什么虚拟地址或使用共享内存对象不起作用的原因) .
标签: c++ windows memory virtual-address-space