milkyway的窝

最初想法的诞生地

 

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


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

公告

随笔皆原创,文章乃转载. 欢迎留言!

常用链接

留言簿(37)

随笔分类(104)

随笔档案(101)

文章分类(51)

文章档案(53)

wince牛人

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜