转载自:http://blog.csdn.net/nanjianhui/article/details/3735963
在CEDDK中提供了用于地址映射的函数,在CEDDK/ddk_map/ddk_map.c中。该模块中主要提供了两个函数用于物理地址到虚拟地址的映射与取消映射:
1. PVOID MmMapIoSpace(PHYSICAL_ADDRESS PhysicalAddress, ULONG NumberOfBytes, BOOLEAN CacheEnable)
PhysicalAddress: 要被映射的物理起始地址
NumberOfBytes: 要被映射的字节数
CacheEnable: 是否使能Cache,如果是映射设备的寄存器,应该是FALSE
驱动中经常会用到该函数而且一般是在初始化的时候,从物理地址映射出虚拟地址,然后通过虚拟地址来操作设备。该函数实际上调用了VirtualAlloc和VirtualCopy函数来完成从物理地址到虚拟地址的映射,函数的返回值为映射后的虚拟地址。
2. VOID MmUnmapIoSpace(IN PVOID BaseAddress, IN ULONG NumberOfBytes)
BaseAddress: 指向被映射后的虚拟地址
NumberOfBytes: 被映射的字节数
该函数用于取消映射,是通过调用VirtualFree函数来实现。
在该模块中还可以看到TransBusAddrToVirtual和TransBusAddrToStatic两个函数,这两个函数已经被CEDDK的Bus模块中的BusTransBusAddrToVirtual和BusTransBusAddrToStatic两个函数所代替,这两个函数以前已经介绍过,这里不再重复了。