将虚拟地址映射到物理地址

Mapping virtual address to physical address

我有一个项目,我需要在 Windows 下的 VS2010 中使用 C++ 工作。该项目最初是在 WinCE 上 运行 开发的。它是在 VC++ 中开发的,但 linked 到 WinCE 开发环境中使用的一些库。

该项目使用了 ::VirtualCopy,它无法编译,因为我认为它在 Coredll.lib 中。在 WinCE 环境下。 https://msdn.microsoft.com/en-us/library/aa450977.aspx

error LNK2028: unresolved token (0A000B85) "extern "C" int __cdecl VirtualCopy(void *,void *,unsigned long,unsigned long)" (?VirtualCopy@@$$J0YAHPAX0KK@Z) referenced in ..
error LNK2019: unresolved external symbol "extern "C" int __cdecl VirtualCopy(void *,void *,unsigned long,unsigned long)" (?VirtualCopy@@$$J0YAHPAX0KK@Z) referenced in ..

我的代码中的函数是通过以下方式引用的:

extern "C" 
{
BOOL VirtualCopy(LPVOID lpvDest, LPVOID lpvSrc, DWORD cbSize, DWORD fdwProtect);
}

然后使用:

if( ! ::VirtualCopy(pVMem, reinterpret_cast<void *>(dwASIC_REGISTERS_BASE), tSystemInfo.dwPageSize, PAGE_READWRITE | PAGE_NOCACHE) )
{
    DWORD dwError = ::GetLastError();

    TRACE1("Failed ", dwError);
    return;
}

项目使用:

我有几个问题:

  1. 有其他选择吗?
  2. 有什么方法可以导入一些旧的 winCE 库和 link 反对那些,让我使用这个功能?

任何帮助将不胜感激

非常感谢

我不是 WinCE 编程专家,但以下是一些想法:

这个函数好像是用来将程序代码中可访问的指针(虚拟地址)映射到一些设备寄存器(物理地址)。在嵌入式编程中,这种方法用于直接驱动设备(例如点亮连接到 SoC 的 LED)。

  1. 我认为在 Win32 中无法访问此类功能,因为直接 setting/reading 寄存器是为设备驱动程序保留的,而不是应用程序代码。

  2. 我认为在 Win32 环境下没有办法 link 针对 WinCE 库。但更重要的是,即使有办法实现这一点,您也一无所获——寄存器(物理地址)是特定于嵌入式设备的。在 PC 上,这个特定的物理地址可能指向 RAM,因此您将写入其他应用程序的地址 space。

  3. 你不应该绕过缺少 VirtualCopy 函数。您应该了解代码在设备上的作用,然后删除它(如果它不是应用程序行为所必需的)或以适合 Win32 环境的方式实现它。