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

时间:2015-04-30 09:21:40

标签: c++ memory-management memory-address virtual-memory windows-embedded-compact

我有一个项目,我需要在Windows 7下的VS2010中使用C ++。该项目最初是为在WinCE上运行而开发的。它是用VC ++开发的,但链接到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;
}

项目使用:

  • 共享dll中的MFC
  • ATL的静态链接
  • 公共语言运行时支持(/ clr)

我有几个问题:

  1. 还有其他选择吗?
  2. 有什么方法可以导入一些旧的winCE库并链接到那些,允许我使用这个函数吗?
  3. 非常感谢任何帮助

    非常感谢

1 个答案:

答案 0 :(得分:0)

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

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

  1. 我相信在Win32中这样的功能是无法访问的,因为直接设置/读取寄存器是为设备驱动程序而不是应用程序代码保留的。

  2. 我认为在Win32环境中无法链接WinCE库。但更重要的是,即使有办法实现这一点,您也无法获得任何东西 - 寄存器(物理地址)特定于嵌入式设备。在PC上,这个特定的物理地址可能指向RAM,因此您将在其他应用程序的地址空间中写入。

  3. 你不应该避免缺乏VirtualCopy功能。您应该了解代码在设备上执行的操作,然后将其删除(如果不需要应用程序行为),或者以适合Win32环境的方式实现它。