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

 

转载于:https://www.cnblogs.com/inspurhaitian/archive/2008/09/10/1288470.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ 中,可以使用 `VirtualAlloc` 函数来分配内存,并将其用作 Thunk 函数的代码。下面是一个示例代码,展示了如何使用 `VirtualAlloc` 来创建一个简单的 Thunk 函数: ```cpp #include <iostream> #include <windows.h> // 定义一个函数指针类型 typedef int (*FuncPtr)(int); // Thunk 函数 int __stdcall ThunkFunction(int num) { std::cout << "Thunk function called with parameter: " << num << std::endl; // 调用原始函数 return num * 2; } int main() { // 分配内存空间 DWORD dwSize = 4096; // 分配的内存大小,这里假设为 4KB LPVOID lpAddress = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); // 将 Thunk 函数的代码复制到分配的内存中 memcpy(lpAddress, ThunkFunction, dwSize); // 创建函数指针并将其设置为分配的内存地址 FuncPtr thunk = (FuncPtr)lpAddress; // 使用函数指针调用 Thunk 函数 int result = thunk(5); std::cout << "Result: " << result << std::endl; // 释放分配的内存 VirtualFree(lpAddress, 0, MEM_RELEASE); return 0; } ``` 在这个示例中,我们使用 `VirtualAlloc` 函数分配了一块内存空间,大小为 4KB。然后,使用 `memcpy` 函数将 Thunk 函数的代码复制到这块内存中。 接下来,我们创建了一个函数指针 `thunk`,并将其设置为分配的内存地址。通过这个函数指针,我们可以调用 Thunk 函数。 最后,我们使用函数指针调用 Thunk 函数,并打印出结果。完成后,使用 `VirtualFree` 函数释放分配的内存。 需要注意的是,使用 `VirtualAlloc` 分配的内存需要适当地设置内存保护属性,以确保其可执行和可读写。在本示例中,使用了 `PAGE_EXECUTE_READWRITE` 属性,表示内存既可执行又可读写。具体的内存保护属性需要根据实际需求进行选择。 此外,需要注意 Thunk 函数的参数传递和调用约定,以及在不同平台和编译器下可能存在的差异。这些细节需要根据具体情况进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值