• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
格局
技术\业务\管理
博客园    首页    新随笔    联系   管理    订阅  订阅

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 )
posted on 2007-03-27 22:51 milkyway 阅读(2022) 评论(4)  编辑 收藏 引用 所属分类: Wince学习小结

 
评论
# re: VirtualAlloc和VirtualCopy的蕴含知识点 2007-10-10 15:09 applevip
博主,你好

关于VirtualCopy函数中lpvSrc参数的设定,我有一个问题一直想不明白。
问题是,lpvSrc何时需要右移8位?

我有下面理解,希望指教。
1. 如果copy的物理地址在512M范围内,那么由于静态映射的存在,lpvSrc可以为静态映射的虚拟地址,也可以为物理地址。采用后者需要指定page_physical,同时lpvSrc右移8位。
2. 如果copy的物理地址在512M范围外,那么由于微软的如下规定“
VirtualCopy also supports the PAGE_PHYSICAL flag. You must set this flag when you are mapping physical memory that resides beyond 512 MB, that is, physical memory with an address above 0x1FFFFFFF.”
lpvSrc只能为物理地址,同时需要右移。


  回复  更多评论   

# re: VirtualAlloc和VirtualCopy的蕴含知识点 2007-10-15 14:50 milkyway
你的理解是正确的。可以简单认为,只要设置了PAGE_PHYSICAL 为真,那么就需要把lpvSrc右移8位。  回复  更多评论   

# re: VirtualAlloc和VirtualCopy的蕴含知识点 2008-06-16 09:43 邹晓均
听君一席话,胜读十年书啊!!!
这两天一直在看WINDOWS内存管理,对页面和粒度这两个概念模糊,直到看到老兄这段话,茅塞顿开,十分感谢!!!
VirtualAlloc用来在进程的虚拟地址空间中保留(reserve)或者提交(commit)页。在保留时以64KB为粒度,即保留空间以64K为单位。而提交虚拟地址时,则以页(典型大小为4KB)为单位。
在保留时以64KB为粒度,即保留空间以64K为单位。而提交虚拟地址时,则以页(典型大小为4KB)为单位  回复  更多评论   

# re: VirtualAlloc和VirtualCopy的蕴含知识点 2008-08-13 22:09 464999979
请问C#如何调用VirtualAlloc()和VirtualCopy()函数?能否给个例子或说明一下,谢谢  回复  更多评论   

 

posted @ 2008-09-10 16:29  惠众益自  阅读(830)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3