WinCE下访问物理地址

本文介绍了在Windows CE操作系统中如何实现对物理地址的访问。文章详细解释了通过内存映射的方法,即利用VirtualAlloc()和VirtualCopy()函数将硬件寄存器映射到虚拟内存空间,从而实现在用户态对硬件资源的访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      今天看一个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中所有寄存器了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值