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()函数?能否给个例子或说明一下,谢谢 回复 更多评论