VirtualAlloc和VirtualCopy的蕴含知识点

1.VirtualAlloc用来在进程的虚拟地址空间中保留(reserve)或者提交(commit)页。在保留时以64KB为粒度,即保留空间以64K为单位。而提交虚拟地址时,则以页(典型大小为4KB)为单位。 
2.VirtualCopy用来绑定一块物理内存到当前进程虚拟地址空间。参数里的lpvSrc既可以是内核段的虚拟地址也可以是物理地址(用page_physical来标记)。同时要注意lpvSrc的右移与否。 
3.使用VirtualAlloc要包含Winbase.h;使用VirtualCopy时要包含plfuncs.h.两者都要链接coredll.lib. 
4.在CE5.0之前,使用VirtualAlloc获得的虚拟地址空间分为两种情形: 
(1)大小在2MB以下时,位于调用进程的虚拟空间中; 
(2)大小大于2MB时,位于用户态的共享地址空间内(0x42000000-0x7E000000 )

ce5.0跟6.0在gpio开发方面的区别——virtualcopy和deviceiocontrol

2010年01月22日 星期五 15:24

之前在5.0下,gpio的地址映射可以直接用virtualcopy映射,现在6.0底下出现非法地址调用,百度到以下有价值的一篇文章~原来在6.0下为了增加安全性,已经禁止在用户态下的virtualcopy的使用。

引用如下----------------------------------------------------------------------------------------------------------------

在CE4.2/5.0里面滚打多年的兄弟应该经常用这个函数吧。这个函数方便驱动和应用程序范围任何的物理地址,包括物理内存啊,设备控制器的寄存器啊,甚至GPIO也可以在AP里面随便拉上拉下。

这个函数虽然方便,但是并不安全,你想你好不容易把一个功能完善的image给build出来了,结果碰到了一个写AP的“高手”,把你的寄存器和共享内存中的数据修改得一塌糊涂,最后报出bug来说你驱动的你会不会晕倒!

还好从CE6.0开始我们可以安枕无忧了,因为AP再也不能调用VirtualCopy函数来直接访问物理地址了,但因此带来了一些应用上的不便。

VirtualCopy的限制来源于CE6.0之后kernel的巨大变革,在CE5.0之前的Windows CE操作系统中,kenrel就仅仅是kern.exe(nk.exe),这个exe其实是OAL、KITL和Kernel三个的合体,nk.exe是运行于内核模式(kernel mode),也就具有了访问特殊地址的权限,然后除此之外的代码默认都是运行于用户模式(user mode),所以它们的驱动和AP都是等级的,都在用户模式运行,要运行在kernel模式也可以,调用一个API SetKmode()就行了。因为驱动是肯定要访问物理地址的,所以CE5.0以前的OS都是运行用户模式的程式访问物理地址的,然后又为了方便做从物理地址到虚拟地址的映射,就提供了一系列的帮助函数,virtualcopy就是最常用的函数之一。

CE6.0开始,kernel模式变得比较正规,类似于台式机上的windows系统了,驱动和ap的权限是严格区分的,大部分的驱动程序运行在kernel模式,它们可以用virtualcopy读写物理地址对应的物理设备,但用户模式的AP将从此没有直接访问物理地址的权限,virtualcopy每次调用都会失败返回。

在这里还要注意的是,其实并不是用户模式就不能使用virtualcopy,virtualcopy只是不能在用户模式的AP中使用,但是却还可以在用户模式的驱动使用,但是在用户模式的驱动中使用也有条件,那就是必须在对应的注册表中设置可以访问的内存地址的范围才行。

在某些场合,一些特殊功能的AP确实需要访问物理地址的,比如设置保存物理内存指定位置的全局变量,开发读写GPIO的测试工具等等。在这种情况下一种简单的方法是实现一个最简单的跑在kernel模式的流驱动,提供一个deviceiocontrol的接口来帮助AP申请对应于物理内存地址的虚拟内存地址。

除了virtualcopy之外,CE6下还有很多API是AP和user模式的驱动不能调用的,给大家参考一下,大家要把CE50下的AP移植到6.0下一定要注意找到替代

Virtual Memory APIs 
CeVirtualSharedAlloc 
LockPages 
LockPagesEx 
UnlockPages 
UnlockPagesEx 
VirtualAllocCopyEx 
VirtualCopyEx 
VirtualSetAttributes 
CreateStaticMapping 
NKDeleteStaticMapping 
VirtualCopy

File System APIs 
ReadRegistryFromOEM 
SetStoreQueueBase 
WriteRegistryToOEM

Power APIs 
PowerOffSystem (很多测试AP用到)

Miscellaneous APIs 
SetOOMEvent

#define IOP_BASE 0xB1600000 // 0x56000000

虚拟地址=物理>>4位 + 0xac000000

VirtualAlloc和VirtualCopy的蕴含知识点相关推荐

  1. VirtualAlloc和VirtualCopy----VirtualFree

    VirtualAlloc 和VirtualCopy VirtualAlloc 首先会从我们的虚拟地址空间中申请(或者说预留)一块虚拟空间,准备接下来要用它.注意此时,可用的物理内存并没有减少,只是虚拟 ...

  2. 简单深入两个虚拟内存API VirtualAlloc及VritualCopy

    VirtualAlloc : (配置虛擬記憶體) [MSDN] http://msdn.microsoft.com/en-us/library/aa366887(VS.85).aspx LPVOID ...

  3. VirtualCopy()操作I/O口 物理地址为什么要移8位

    (1)IO接口是XSCale处理器的外部设备,对于一般的单片机,可以直接操作硬件,即通过直接读写IO端口来访问硬件.而对于WICNE操作系统,它屏蔽了用户应用程序对硬件访问的权限,只有内核应用程序才可 ...

  4. WinCE驱动开发问题精华集锦

    如何让系统加载自己写的驱动程序?     两种办法:   1.在[HKEY_LOCAL_MACHINE/Drivers/BuiltIn]下添加注册键.   2.在应用程序中调用ActivateDevi ...

  5. WINCE下I/O操作基础

      对外设进行 I/O 操作实际上也就是读写外设的寄存器,而我们通常使用的X86或者ARM处理器在硬件上决定了wince系统启动后,无法直接访问物理地址,因此需要做一些工作来实现I/O操作. 首先要理 ...

  6. wince下Gpio 驱动程序

    [转]wince下Gpio 驱动程序 在WINCE下能够直接访问的都是虚拟地址,不能直接访问GPIO端口,因此我们首先需要将GPIO口的物理地址映射到虚拟地址上来.      分别使用VirtualA ...

  7. 转:WinCE驱动开发问题精华集锦

    1.在应用程序中,如何向修改本机的ip 地址等网络参数,并使之立即生效?           网络设置保存在注册表中,位置[HKEY_LOCAL_MACHINE\Comm\网卡名称\Parms\Tcp ...

  8. 【转】WinCE驱动开发问题精华集锦

    [转]WinCE驱动开发问题精华集锦 WinCE驱动开发问题精华集锦  如何让系统加载自己写的驱动程序?    两种办法:  1.在[HKEY_LOCAL_MACHINE\Drivers\BuiltI ...

  9. WinCE驱动开发问题精华集锦 [转]

    WinCE驱动开发问题精华集锦 [转] 原文  http://blog.mcuol.com/User/basicygp/Article/4340_1.htm 在mediaplayer全屏播放的时候,我 ...

最新文章

  1. Python基于MASK信息抽取ROI子图实战:原始影像和mask文件都是二维的情况
  2. 离散数学专业术语(continuous updating)
  3. 定制zabbix的rpm包---spec文件的书写
  4. 手写简版spring --8--Aware感知容器对象Aware感知容器对象
  5. hiho一下 第七周 Hihocoder #1043 : 完全背包
  6. java mp4分割_Android(java方法)上实现mp4的分割和拼接 (二)
  7. 荣耀鸿蒙os2.0公测版,鸿蒙OS 2.0他来了!华为HarmonyOS 2.0开发者公测版正式推送
  8. vue-cli设置跨域代理 + 开发/生成环境简单请求接口设置
  9. Qt安装事件过滤器、过滤子控件事件、截获控件按键、鼠标事件
  10. 关于18183-王者荣耀专区网站的TDK简要分析(更多内容请访问http://www.eduaskx6.com/)...
  11. 最新Java开发毕业论文参考文献干货满满
  12. matlab disp输出换行,matlab输出语句disp
  13. [基础控件]---状态切换控件CompoundButton及其子类CheckBox、RadioButton、ToggleButton、switch事件监听与场景使用...
  14. 微型计算机外观分为,2015计算机应用基础单选练习题1.1
  15. 快捷键你到底知道多少(Pr篇)
  16. 零基础爬取堆糖网图片(一)
  17. 向前迈进!走入GC世界:G1 GC原理深入解析
  18. Uber 叫车时,弹出以下代码导致无法打车(An email confirmation has been sent to...),解决办法...
  19. 智慧养殖远程管理监控方案
  20. 中科院涉及集成电路(芯片)的院所

热门文章

  1. android beta项目官方页面,安卓7.0开发者预览版如何安装?Android Beta项目正式上线...
  2. Spring中拦截/和拦截/*的区别 - 不能访问到返回的JSP - 访问静态资源(jpg,js等)
  3. nginx 反向proxy多个 tomcat,负载均衡
  4. java多线程思维导图
  5. python基础:python循环、三元运算、字典、文件操作
  6. 003-JavaString数据类型
  7. 作业1#python用列表实现多用户登录,并有三次机会
  8. SQL批量提交修改业务
  9. Discuz3.3精仿小米风格整站模板制作——1、新建模板方案
  10. 取MapString,sitemap中的全部key