wince内存直接读写.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
wince内存直接读写

2.对物理内存的直接读写   在PC环境下,Windows是不允许用户态进程直接访问内存的,任何对内存的访问都会引起程序的异常。而在嵌入式设备中,需要直接对内存进行读写,以此来提高处理速度,此外,在ARM体系中,I/O被映射到高端的地址进行访问,只有读写物理地址,I/O的驱动才能高效地运行。Windows CE中有一些API提供了对物理内存的“直接”访问。不过,在访问之前,必须把物理内存映射到虚拟地址中,通过虚拟地址才能读写物理内存。   PHYSICAL_ADDRESS描述了Windows CE的物理内存结构体,Windows CE在ceddk.h中定义了PHYSICAL_ADDRESS,其定义如下:   n     在ceddk.h中 typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;   n     在winnt.h中 typedef union _LARGE_INTEGER{  struct{ DWORD LowPart;     LONG HighPart;  };  LONGLONG QuadPart; } LARGE_INTEGER;   可见,Windows CE中用64位来代表物理地址,对于大多数32位的CPU而言,只需要把它的HighPart设置为0就可以了。   VirtualAlloc()函数是Windows CE中分配连续虚拟地址的API,VirtualCopy()函数将一段物理内存映射到虚拟地址。因此,在进程中访问物理地址,就像访问虚拟地址一样方便,当然,如何选择虚拟地址是需要研究的。 // 申请虚拟内存 LPVOID VirtualAlloc(   LPVOID lpAddress,        // 希望的虚拟内存起始地址   DWORD dwSize,             // 以字节为单位的大小   DWORD flAllocationType,   // 申请类型,分为Reserve和Commit   DWORD flProtect           // 访问权限 ); // 把物理内存绑定到虚拟地址空间 BOOL VirtualCopy(    LPVOID lpvDest,           // 虚拟内存的目标地址   LPVOID lpvSrc,            // 物理内存地址   DWORD cbSize,             // 要绑定的大小   DWORD fdwProtect          // 访问权限 ); VirtualAlloc对虚拟内存的申请分为两步,保留MEM_RESERVE和提交MEM_COMMIT。其中MEM_RESERVE只是在进程的虚拟地址空间内保留一段,并不分配实际的物理内存,因此保留的虚拟内存并不能被应用程序直接使用。MEM_COMMIT阶段才真正为虚拟内存分配物理内存。   下面的代码显示了如何使用VirtualAlloc和VirtualCopy来访问物理内存。因为VirtualCopy负责把一段物理内存和虚拟内存绑定,所以VirtualAlloc执行时只需要对内存保留,没有必要提交。 FpDriverGlobals =   (PDRIVER_GLOBALS) VirtualAlloc(     0,      DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,      MEM_RESERVE,      PAGE_NOACCESS);  if (FpDriverGlobals == NULL) {     ERRORMSG(DRIVER_ERROR_MSG, (TEXT( VirtualAlloc failed!\r\n)));     return;  }  else {     if (!VirtualCopy(     (PVOID)FpDriverGlobals,      (PVOID)(DRIVER_GLOBALS_PHYSICAL_MEMORY_START),      DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,      (PAGE_READWRITE | PAGE_NOCACHE))) {        ERRORMSG(DRIVER_ERROR_MSG, (TEXT(VirtualCopy failed!\r\n)));        return;     }  }   CEDDK还提供了函数MmMapIoSpace,用来把一段物理内存直接映射到虚拟内存。用MmMapIoSpace申请的内存要用M

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档