读书人

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

发布时间: 2012-03-01 10:25:47 作者: rapoo

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

读书人网 >WinCE

热点推荐