VirtualAlloc和VirtualCopy的蕴含知识点
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的蕴含知识点相关推荐
- VirtualAlloc和VirtualCopy----VirtualFree
VirtualAlloc 和VirtualCopy VirtualAlloc 首先会从我们的虚拟地址空间中申请(或者说预留)一块虚拟空间,准备接下来要用它.注意此时,可用的物理内存并没有减少,只是虚拟 ...
- 简单深入两个虚拟内存API VirtualAlloc及VritualCopy
VirtualAlloc : (配置虛擬記憶體) [MSDN] http://msdn.microsoft.com/en-us/library/aa366887(VS.85).aspx LPVOID ...
- VirtualCopy()操作I/O口 物理地址为什么要移8位
(1)IO接口是XSCale处理器的外部设备,对于一般的单片机,可以直接操作硬件,即通过直接读写IO端口来访问硬件.而对于WICNE操作系统,它屏蔽了用户应用程序对硬件访问的权限,只有内核应用程序才可 ...
- WinCE驱动开发问题精华集锦
如何让系统加载自己写的驱动程序? 两种办法: 1.在[HKEY_LOCAL_MACHINE/Drivers/BuiltIn]下添加注册键. 2.在应用程序中调用ActivateDevi ...
- WINCE下I/O操作基础
对外设进行 I/O 操作实际上也就是读写外设的寄存器,而我们通常使用的X86或者ARM处理器在硬件上决定了wince系统启动后,无法直接访问物理地址,因此需要做一些工作来实现I/O操作. 首先要理 ...
- wince下Gpio 驱动程序
[转]wince下Gpio 驱动程序 在WINCE下能够直接访问的都是虚拟地址,不能直接访问GPIO端口,因此我们首先需要将GPIO口的物理地址映射到虚拟地址上来. 分别使用VirtualA ...
- 转:WinCE驱动开发问题精华集锦
1.在应用程序中,如何向修改本机的ip 地址等网络参数,并使之立即生效? 网络设置保存在注册表中,位置[HKEY_LOCAL_MACHINE\Comm\网卡名称\Parms\Tcp ...
- 【转】WinCE驱动开发问题精华集锦
[转]WinCE驱动开发问题精华集锦 WinCE驱动开发问题精华集锦 如何让系统加载自己写的驱动程序? 两种办法: 1.在[HKEY_LOCAL_MACHINE\Drivers\BuiltI ...
- WinCE驱动开发问题精华集锦 [转]
WinCE驱动开发问题精华集锦 [转] 原文 http://blog.mcuol.com/User/basicygp/Article/4340_1.htm 在mediaplayer全屏播放的时候,我 ...
最新文章
- Python基于MASK信息抽取ROI子图实战:原始影像和mask文件都是二维的情况
- 离散数学专业术语(continuous updating)
- 定制zabbix的rpm包---spec文件的书写
- 手写简版spring --8--Aware感知容器对象Aware感知容器对象
- hiho一下 第七周 Hihocoder #1043 : 完全背包
- java mp4分割_Android(java方法)上实现mp4的分割和拼接 (二)
- 荣耀鸿蒙os2.0公测版,鸿蒙OS 2.0他来了!华为HarmonyOS 2.0开发者公测版正式推送
- vue-cli设置跨域代理 + 开发/生成环境简单请求接口设置
- Qt安装事件过滤器、过滤子控件事件、截获控件按键、鼠标事件
- 关于18183-王者荣耀专区网站的TDK简要分析(更多内容请访问http://www.eduaskx6.com/)...
- 最新Java开发毕业论文参考文献干货满满
- matlab disp输出换行,matlab输出语句disp
- [基础控件]---状态切换控件CompoundButton及其子类CheckBox、RadioButton、ToggleButton、switch事件监听与场景使用...
- 微型计算机外观分为,2015计算机应用基础单选练习题1.1
- 快捷键你到底知道多少(Pr篇)
- 零基础爬取堆糖网图片(一)
- 向前迈进!走入GC世界:G1 GC原理深入解析
- Uber 叫车时,弹出以下代码导致无法打车(An email confirmation has been sent to...),解决办法...
- 智慧养殖远程管理监控方案
- 中科院涉及集成电路(芯片)的院所
热门文章
- android beta项目官方页面,安卓7.0开发者预览版如何安装?Android Beta项目正式上线...
- Spring中拦截/和拦截/*的区别 - 不能访问到返回的JSP - 访问静态资源(jpg,js等)
- nginx 反向proxy多个 tomcat,负载均衡
- java多线程思维导图
- python基础:python循环、三元运算、字典、文件操作
- 003-JavaString数据类型
- 作业1#python用列表实现多用户登录,并有三次机会
- SQL批量提交修改业务
- Discuz3.3精仿小米风格整站模板制作——1、新建模板方案
- 取MapString,sitemap中的全部key