今天看一个WINCE下的驱动程序,想到一个问题,在WINCE下怎么访问物理地址呢?
我们都知道在WINCE用户态下能够访问的是虚拟内存地址,即它屏蔽了用户应用程序对硬件访问的权限,只有内核应用程序才可以访问硬件资源。如果要访问物理地址可以采用内存映射的方法,即将硬件寄存器映射到普通内存空间,这样就可以通过访问这些普通内存来访问物理地址了。
WINCE提供了VirtualAlloc()和VirtualCopy()函数, VirtualAlloc()负责在虚拟内存空间内保留一段虚拟内存,而VirtualCopy()负责把一段物理内存和虚拟内在绑定,这样最终对物理内存的访问就可以通过虚拟地址来进行了。首先使用VirtualAlloc 分配出一个虚拟的地址空间,代码如下:
s2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS);
这样就分配出一个MEM_RESERVE类型的存储器空间,但它并没有占用实际内存空间,而是虚拟的地址空间.接着将实际的硬件地址映射到前面分配的虚拟地址空间,使用VirtualCopy函数建立起两个地址间的映射关系.代码如下:
if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy faiLED!/r/n")));
这样就完成了虚拟内存地址2440IOP到实际物理地址IOP_BASE的绑定,通过访问2440IOP就能访问的2440中所有寄存器了。