017 虚拟内存2

用户地址空间

  ● 内存的分配

    ○ 当进程被创建并赋予它的地址空间时,该可用地址空间的主体是空闲的,即未被分配的。

      若要使用该地址空间的各个部分,必须通过调用 VirtualAlloc函数来分配它里边的各个区域。

      每当你保留地址空间的一个区域时,系统要确保该区域从一个分配颗度的边界开始。

      当你保留地址空间的一个区域时,系统还要确保该区域的大小是系统的页面大小倍数。

  ● 分配颗粒

    ○ 所有CPU平台都会使用相同的分配颗粒即 64KB.

  ● 页面大小

    ○ 4KB

  ● VirtualAlloc 函数

    函数原型

    

1 LPVOID WINAPI VirtualAlloc(
2   _In_opt_ LPVOID lpAddress,
3   _In_     SIZE_T dwSize,
4   _In_     DWORD  flAllocationType,
5   _In_     DWORD  flProtect
6 );

  ○ 参数1:lpAddress
    要分配的内存区域的地址
  ○ 参数2:dwSize
    分配的大小
  ○ 参数3:flAllocationType
    分配的类型
  ○ 参数4:flProtect
    该内存的初始保护属性

可能的数值
含义
MEM_COMMIT 0x1000
为指定地址空间提交物理内存。这个函数初始化内在为零
试图提交已提交的内存页不会导致函数失败。这意味着您可以在不确定当前页的当前提交状态的情况下提交一系列页面。
如果尚未保留内存页,则设置此值会导致函数同时保留并提交内存页。
MEM_RESERVE 0x2000
保留指定地址空间,不分配物理内存。
这样可以阻止其他内存分配函数malloc和LocalAlloc等再使用已保留的内存范围,直到它被被释放。
当使用上面的VirtualAlloc函数保留了一段地止空间后,接下还你还可以继续多次调用同样的函数提交这段地址空间中的不同页面。
MEM_RESET0x80000
表示,在所指定的内存范围内的数据lpAddress的dwSize不再是利益。页面不应该被读出或写入到分页文件。然而,将再次使用的内存块后,所以它不应该decommitted的 。这个值不能使用任何其他的价值 。
使用这个值并不保证范围与经营MEM_RESET将包含零。如果你想的范围包含零,decommit内存,然后将它重新作出 。
当您指定MEM_RESET,VirtualAlloc函数忽略值flProtect。但是,您仍然必须设置flProtect有效的值,比如,PAGE_NOACCESS。
如果你使用MEM_RESET的内存范围映射到一个文件,VirtualAlloc返回一个错误。如果它被映射到分页文件共享视图是唯一可以接受的的 。
分配类型 也可以是下列值
可能的数值
含义
MEM_LARGE_PAGES0x20000000的
分配内存使用大页面支持。
大小和对齐必须是一个大页面的最低多个 。要获得这个值,使用GetLargePageMinimum。
MEM_PHYSICAL0x400000
储备的地址范围,可用于内存地址窗口扩展(AWE)的页面。
此值必须使用MEM_RESERVE,并没有其他值。
MEM_TOP_DOWN0x100000
在尽可能高的地址分配内存。这可以比普通的分配速度较慢,尤其是当需要许多分配。
MEM_WRITE_WATCH0x200000
导致系统来跟踪分配的地区,都写在页面 。如果指定此值,则还必须指定MEM_RESERVE。
要检索的页面是否写入,因为该地区被分配或写跟踪状态被重置地址,调用GetWriteWatch功能。要重置写跟踪状态,调用GetWriteWatch或ResetWriteWatch。写跟踪功能仍然启用,直到该地区被释放。
访问类型
PAGE_READONLY 0x02
该区域为只读。如果应用程序试图访问区域中的页的时候,将会被拒绝访问。
PAGE_EXECUTE 0x10
区域包含可被执行的代码。试图读写该区域的操作将被拒绝。
PAGE_EXECUTE_READ 0x20
区域包含可执行代码,应用程序只能读该区域。
PAGE_READWRITE 0x04
区域不可执行代码,应用程序可以读写该区域。
PAGE_EXECUTE_READWRITE 0x40
区域可以执行代码,应用程序可以读写该区域。
PAGE_GUARD 0x100
区域第一次被访问时进入一个STATUS_GUARD_PAGE异常,这个标志要和其他保护标志合并使用,表明区域被第一次访问的权限
PAGE_NOACCESS 0x01
任何访问该区域的操作将被拒绝
PAGE_NOCACHE 0x200
RAM中的页映射到该区域时将不会被微处理器缓存(cached)

原文地址:https://www.cnblogs.com/sdk123/p/7162057.html