关于物理地址映射有关问题

关于物理地址映射问题
我看到介绍的驱动例程有两种形式的映射
一种是利用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来配合使用。