欢迎来到天天文库
浏览记录
ID:51629627
大小:825.36 KB
页数:12页
时间:2020-03-26
《访问物理内存CEDDK.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、访问物理内存访问物理内存嵌入式设备与桌面PC的一个显著不同是应用程序中可以直接访问某一段物理内存与桌面版本Windows相比,WindowsCE提供了相对简单的物理内存访问方式无论是驱动程序还是应用程序都可通过API访问某一段物理内存访问物理内存物理内存结构体PHYSICAL_ADDRESStypedefLARGE_INTEGERPHYSICAL_ADDRESS,*PPHYSICAL_ADDRESS;typedefunion_LARGE_INTEGER{struct{DWORDLowPart;LONGHighPart;};
2、LONGLONGQuadPart;}LARGE_INTEGER;WindowsCE用64位来代表物理地址。对于大多数32位的CPU而言,只需把它的HighPart设置为0即可。内存管理函数设备驱动程序是用户态模块必须将物理内存映射成虚拟内存内存管理函数VirtualAlloc用于在当前进程的虚拟地址空间中保留或者提交一段虚拟内存空间LPVOIDVirtualAlloc(LPVOIDlpAddress,//希望分配的虚拟内存起始地址SIZE_TdwSize,//大小,以字节为单位DWORDflAllocationType,//申请类
3、型,分为MEM_COMMIT和MEM_RESERVEDWORDflProtect);//访问权限MEM_RESERVE:只是在进程的虚拟地址空间内保留一段,并不分配实际的物理内存。MEM_COMMIT:真正为虚拟内存分配物理内存。内存管理函数VirtualCopy用来绑定一段物理内存和虚拟内存BOOLVirtualCopy(LPVOIDlpvDest,//虚拟目的地址指针,接受VirtualAlloc的返回值LPVOIDlpvSrc,//源物理地址指针DWORDcbSize,//要绑定的大小,大小必须与虚拟地址相同DWORDfdw
4、Protect//访问权限);这里需要注意的是fdwProtect参数。如果是驱动程序访问,需要设置为PAGE_NOCACHE,以访问无缓存段虚拟地址。如果映射的物理地址范围在0x1FFFFFFF之上,必须使用PAGE_PHYSICAL,此时必须把lpvSrc右移八位,实现地址对齐。(这是由内核中VirtualCopy的实现决定的,在那个函数中会判断如果是PAGE_PHYSICAL就将PHYSADDR左移8位移回来)内存管理函数使用VirtualAlloc+VirtualCopy来访问物理内存VirtualAlloc只需对内存保留
5、,VirtualCopy负责把一段物理内存和虚拟内存绑定内存管理函数MmMapIoSpace用来把物理地址直接映射到与进程无关的虚拟地址上;MmMapIoSpace申请的内存要用MmUnMapIoSpace释放。PVOIDMmMapIoSpace(PHYSICAL_ADDRESSPhysicalAddress,//起始物理地址ULONGNumberOfBytes,//要映射的字节数BOOLEANCacheEnable//是否缓存);MmUnmapIoSpace( PVOIDBaseAddress,//MmMapIoSpace返回
6、的起始虚拟地址ULONGNumberOfBytes//MmMapIoSpace映射的字节数);CEDDKCEDDK.dllexposesfunctionstypicallyusedbydriversforhandlingbusaddresstranslations,allocatingandmappingdevicememory,settingupdirectmemoryaccess(DMA)buffers,performingI/O,andsoon.——MSDNCEDDK.DLL:是一个动态链接库,提供大量的函数来完成驱动程序的
7、一些常用操作。总线管理内存管理I/O管理CEDDK简介设备驱动使用CEDDK设备管理器设备驱动CEDDK.DLL硬件CEDDK内容部分函示例总线管理HalGetBusDataByOffset()HalGetBusData()HalSetBusDataByOffset()HalSetBusData()HalTranslateBusAddress()TranslateSystemAddress()内存管理MmMapIOSpace–MmUnmapIOSpaceHalAllocateCommonBufferI/O存取XXXX=>UCHAR
8、/USHORT/ULONGREAD_REGISTER_XXXXWRITE_REGISTER_XXXXREAD_PORT_XXXXWRITE_PORT_XXXXCEDDKCEDDK.dll源代码位置%_WINCEROOT%PublicCommon
此文档下载收益归作者所有