第八章 访问物理内存CEDDK.ppt

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Session 2: Testing Windows CE .NET Alan Page, Microsoft 访问物理内存 嵌入式设备与桌面PC的一个显著不同是 应用程序中可以直接访问某一段物理内存 与桌面版本Windows相比,Windows CE提供了相对简单的物理内存访问方式 无论是驱动程序还是应用程序都可通过API访问某一段物理内存 访问物理内存 物理内存结构体PHYSICAL_ADDRESS typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS; typedef union _LARGE_INTEGER { struct { DWORD LowPart; LONG HighPart; }; LONGLONG QuadPart; }LARGE_INTEGER; Windows CE用64位来代表物理地址。对于大多数32位的CPU而言,只需把它的HighPart设置为0即可。 内存管理函数 设备驱动程序是用户态模块 必须将物理内存映射成虚拟内存 内存管理函数 VirtualAlloc用于在当前进程的虚拟地址空间中保留或者提交一段虚拟内存空间 LPVOID VirtualAlloc ( LPVOID lpAddress, //希望分配的虚拟内存起始地址 SIZE_T dwSize, //大小,以字节为单位 DWORD flAllocationType, //申请类型,分为MEM_COMMIT和 MEM_RESERVE DWORD flProtect ); //访问权限 MEM_RESERVE:只是在进程的虚拟地址空间内保留一段,并不分配实际的物理内存。 MEM_COMMIT:真正为虚拟内存分配物理内存。 内存管理函数 VirtualCopy用来绑定一段物理内存和虚拟内存 BOOL VirtualCopy ( LPVOID lpvDest, //虚拟目的地址指针,接受VirtualAlloc的返回值 LPVOID lpvSrc, //源物理地址指针 DWORD cbSize, //要绑定的大小,大小必须与虚拟地址相同 DWORD fdwProtect //访问权限 ); 这里需要注意的是 fdwProtect 参数。 如果是驱动程序访问,需要设置为 PAGE_NOCACHE ,以访问无缓存段虚拟地址。 如果映射的物理地址范围在 0x1FFFFFFF 之上,必须使用 PAGE_PHYSICAL ,此时必须把 lpvSrc 右移八位,实现地址对齐。(这是由内核中 VirtualCopy 的实现决定的,在那个函数中会判断如果是 PAGE_PHYSICAL 就将 PHYSADDR 左移 8 位移回来) 内存管理函数 使用VirtualAlloc+VirtualCopy来访问物理内存 VirtualAlloc只需对内存保留,VirtualCopy负责把一段物理内存和虚拟内存绑定 内存管理函数 MmMapIoSpace用来把物理地址直接映射到与进程无关的虚拟地址上;MmMapIoSpace申请的内存要用MmUnMapIoSpace释放。 PVOID MmMapIoSpace( PHYSICAL_ADDRESS PhysicalAddress,//起始物理地址 ULONG NumberOfBytes, //要映射的字节数 BOOLEAN CacheEnable //是否缓存 ); MmUnmapIoSpace( ?PVOID??BaseAddress, //MmMapIoSpace返回的起始虚拟地址 ULONG ??NumberOfBytes // MmMapIoSpace映射的字节数 ); CEDDK CEDDK.dll exposes functions typically used by drivers for handling bus address translations, allocating and mapping device memory, setting up direct memory access (DMA) buffers, performing I/O, and so on. ——MSDN CEDDK.DLL:是一个动态链接库,提供大量的函数来完成驱动程序的一些常用操作。 总线管理

文档评论(0)

xiaofei2001129 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档