关于物理地址映射问题
我看到介绍的驱动例程有两种形式的映射
一种是利用MmMapIoSpace,另外一种是用VirtualAlloc
如:ELECTROMOTOR_GPACON=(ULONG)MmMapIoSpace(GPACON,4,FALSE);
v_pIOPregs = (volatile S3C2410X_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2410X_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
这两种方式有什么相同点和不同点,各都可以用在什么情况下呢
谢谢大家!
[解决办法]
This function maps a physical address space to a nonpaged, process-dependent address space. It provides a virtual address, which is directly mapped, to the device.
PVOID MmMapIoSpace(
PHYSICAL_ADDRESS PhysicalAddress,
ULONG NumberOfBytes,
BOOLEAN CacheEnable
);
-----------------------------
This function reserves or commits a region of pages in the virtual address space of the calling process. Memory allocated by VirtualAlloc is initialized to zero.
[解决办法]
其实,MmMapIoSpace函数内部就是通过VirtualAlloc和VirtualCopy函数来实现物理地址到虚拟地址映射的,MmMapIoSpace的原型代码在下面目录:
%_WINCEROOT%\PUBLIC\COMMON\OAK\DRIVERS\CEDDK\DDK_MAP\ddk_map.c
看一下你就都明白了
[解决办法]
VirtualAlloc貌似只针对内核空间。
MmMapIoSpace提供给用户空间。
所以在用户空间希望获得内核空间的权限,必须用VirtualAlloc + VirtualCopy来配合使用。