将虚拟地址映射到物理地址
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;
}
项目使用:
- 共享 dll 中的 MFC
- 静态 link 到 ATL
- 公共语言运行时支持 (/clr)
我有几个问题:
- 有其他选择吗?
- 有什么方法可以导入一些旧的 winCE 库和 link 反对那些,让我使用这个功能?
任何帮助将不胜感激
非常感谢
我不是 WinCE 编程专家,但以下是一些想法:
这个函数好像是用来将程序代码中可访问的指针(虚拟地址)映射到一些设备寄存器(物理地址)。在嵌入式编程中,这种方法用于直接驱动设备(例如点亮连接到 SoC 的 LED)。
我认为在 Win32 中无法访问此类功能,因为直接 setting/reading 寄存器是为设备驱动程序保留的,而不是应用程序代码。
我认为在 Win32 环境下没有办法 link 针对 WinCE 库。但更重要的是,即使有办法实现这一点,您也一无所获——寄存器(物理地址)是特定于嵌入式设备的。在 PC 上,这个特定的物理地址可能指向 RAM,因此您将写入其他应用程序的地址 space。
你不应该绕过缺少 VirtualCopy 函数。您应该了解代码在设备上的作用,然后删除它(如果它不是应用程序行为所必需的)或以适合 Win32 环境的方式实现它。
我有一个项目,我需要在 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;
}
项目使用:
- 共享 dll 中的 MFC
- 静态 link 到 ATL
- 公共语言运行时支持 (/clr)
我有几个问题:
- 有其他选择吗?
- 有什么方法可以导入一些旧的 winCE 库和 link 反对那些,让我使用这个功能?
任何帮助将不胜感激
非常感谢
我不是 WinCE 编程专家,但以下是一些想法:
这个函数好像是用来将程序代码中可访问的指针(虚拟地址)映射到一些设备寄存器(物理地址)。在嵌入式编程中,这种方法用于直接驱动设备(例如点亮连接到 SoC 的 LED)。
我认为在 Win32 中无法访问此类功能,因为直接 setting/reading 寄存器是为设备驱动程序保留的,而不是应用程序代码。
我认为在 Win32 环境下没有办法 link 针对 WinCE 库。但更重要的是,即使有办法实现这一点,您也一无所获——寄存器(物理地址)是特定于嵌入式设备的。在 PC 上,这个特定的物理地址可能指向 RAM,因此您将写入其他应用程序的地址 space。
你不应该绕过缺少 VirtualCopy 函数。您应该了解代码在设备上的作用,然后删除它(如果它不是应用程序行为所必需的)或以适合 Win32 环境的方式实现它。