关于VirtualAlloc和VirtualCopy
来源:互联网 发布:unity3d 跳跃 编辑:程序博客网 时间:2024/04/29 12:54
弄清楚这个问题首先要了解VirtualCopy和VirtualAlloc这2个函数的实现和目的,以及wince下动态虚拟内存映射和静态虚拟内存映射。
先说VirtualAlloc 和VirtualCopy
VirtualAlloc 首先会从我们的虚拟地址空间中申请(或者说预留)一块虚拟空间,准备接下来要用它。注意此时,可用的物理内存并没有减少,只是虚拟地址少了一块可用的区域。
真正把这块之前reserved的虚拟空间映射到物理的内存区域就是由VirtualCopy来干的,此时,MMU的页表就会增加一个entry,来表示物理--虚拟的映射关系。
再说动态虚拟内存映射和静态虚拟内存映射
OEMaddressTable只是建立了一个一级的静态虚拟--物理的映射关系,一般给kernel(NK.EXE)通过直接访问的形式来用(OALPAtoVA);
MmMapIOSpace(VirtualAlloc +VirtualCopy)是一种动态虚拟映射的手段,一般给驱动根据当前需要(对硬件操作)动态申请并建立映射。
那就是说VirtualCopy 可以直接把物理内存映射到虚拟内存中
而OEMaddressTable所建立的静态虚拟--物理的映射不是必须的
也就是说比如对寄存器的映射:
可以通过VirtualAlloc申请(预留)一块虚拟内存给寄存器(如:v_pIOPregs)
然后用
VirtualCopy直接把寄存器的物理地址映射到刚才申请(预留)的虚拟地址空间
而在OEMaddressTable中所做的寄存器物理地址与虚拟地址的映射这步可以省略
不是省略不省略的问题,是这两种方法是在不同的场合下使用的,如2楼说的,内核部分就要用这个OEMaddressTable来转换,wince5.0下 用户态的驱动(wince6.0驱动貌似是在内核态)就要用这个VirtualAlloc+VirtualCopy来进行地址映射。
OEMaddressTable的定义,你可以查看 bsp/src/inc/oemaddrtab_cfg.inc ,那个g_oalAddressTable便是。
- 关于VirtualAlloc和VirtualCopy
- 关于VirtualAlloc和VirtualCopy的奇怪问题
- VirtualAlloc,VirtualCopy和MmMapIoSpace
- VirtualCopy和VirtualAlloc
- VirtualAlloc和VirtualCopy----VirtualFree
- VirtualAlloc,VirtualCopy和MmMapIoSpace
- VirtualAlloc和VirtualCopy的蕴含知识点
- VirtualAlloc和VirtualCopy的蕴含知识点
- VirtualAlloc和VirtualCopy的蕴含知识点
- VirtualAlloc和VirtualCopy的蕴含知识点
- VirtualAlloc和VirtualCopy的蕴含知识点
- VirtualAlloc和VirtualCopy的蕴含知识点
- VirtualAlloc和VirtualCopy的蕴含知识点
- VirtualAlloc和VirtualCopy的蕴含知识点
- 关于VirtualAlloc和VirtualCopy的奇怪问题(作者:gooogleman@foxmail.com)
- MmMapIoSpace以及MmUnmapIoSpace,VirtualAlloc和VirtualCopy 函数的实现原理以及实现方法
- MmMapIoSpace以及MmUnmapIoSpace,VirtualAlloc和VirtualCopy 函数的实现原理以及实现方法
- MmMapIoSpace以及MmUnmapIoSpace,VirtualAlloc和VirtualCopy 函数的实现原理以及实现方法
- 《深入解析Oracle》学习笔记(6)---Oracle体系结构之存储结构
- 基于TCP的通讯程序 进行封包和拆包二
- callablestatement存储过程
- FireBird备份为空库的简单方法
- 从坛子里转来的英文介绍
- 关于VirtualAlloc和VirtualCopy
- Ext tree 动态生成、拖动排序、右键菜单
- 网站优化的每日必修四个功课
- 随机数
- 使用HTML,CSS快速导出数据到Excel
- VirtualCopy in WinCE6.0
- Linux CC与GCC的区别概括介绍
- 输出中心
- 爱情 经典生日短信