windows核心编程学习笔记(四)windows内存结构/虚拟内存/线程的堆栈

1.虚拟地址空间的大小
•32位系统每个进程的虚拟地址空间是0x00000000 - 0xFFFFFFFF, 4GB,其中 从 0X80000000 - 0xFFFFFFFF为系统为内核占用;
•64位系统每个进程的虚拟地址空间是0x0000000000000000 - 0xFFFFFFFFFFFFFFFF, 16EB,其中 从 0X0000040000000000 - 0xFFFFFFFFFFFFFFFF为系统为内核占用;

2.只说32位系统的虚拟地址空间分配情况
•0x00000000 - 0x0000FFFF: 这段内存是空指针区,同时肯定是不可访问的;
•0x00010000 - 0x7FFEFFFF: 这段是给进程用的,包括有的数据、exe和dll模块,以及内存映射文件;
•0x7FFF0000  - 0x7FFFFFFF: 这64K的区域是禁止访问的,因为紧挨着它就是内核地址,如果中间没有这个阻拦的话,你可以用一个很长的数据覆盖到内核区域,以破坏内核的完整性和正确性——这是不允许的,试图改写该区域,会产生异常,以阻拦进一步读写内核区域;
•0x80000000 - 0xFFFFFFFF: 内核区域。用于线程调度、内存管理、文件系统支持、网络支持和所有设备驱动程序的代码全部在这个分区加载。驻留在这个分区中的一切均可被所有进程共享。

也就是说实际上进程可用的地址空间大小为2G - 128K.

3.页面和页面文件
•页面是物理内存中内存单位,方便管理,在x86上是4K(4096字节);
•页面文件是位于物理磁盘上的一个文件,用于暂存物理内存中许久不用的内存的一个缓冲区,用来解决物理内存通常比较小的问题.它也按照4K一个页面的规则划分,目的是可以让物理内存页面和文件中的页面可以方便的互换.

如果要分配一块内存使用,用VirtualAlloc,这将把物理内存上的一块区域映射到虚拟地址空间的同等大小的区域中,如果你Alloc了128K,那么你的可用物理内存将减少128K(前提是MEM_COMMIT)。如果不再使用这段内存,调用VirtualFree,其结果是断开和虚拟地址空间的映射,导致可用物理内存增大128K.

4.保护属性
没啥好说的,需要留意的是PAGE_WRITECOPY、PAGE_EXECUTE_WRITECOPY和PAGE_GUARD.

5.数据对齐
数据对齐是CPU的特性,如果访问一个WORD类型,那么它的起始地址最好能被sizeof(WORD)也就是2整除,此时CPU才获得最好的执行效率,同理DWORD的起始地址就要被4整除,那char数组呢?应该是任意

6.虚拟内存
查询内存使用状态用GlobalMemoryStatus(Ex)
查询某个进程虚拟地址空间的信息用VirtualQuery(Ex)

1).VirtualAlloc(Ex)和VirtualFree(Ex)
注意:当使用这2个函数时,被操作区域的地址总是被自动对齐到64K的边界上,同时操作的大小(dwSize)也总是被对齐到4k的页边界上。

2).Address Windowing Extensions (Windows 2000 only)

需要对这些函数的用法了如指掌,尤其是各种参数的意义(MEM_RESERVE\MEM_COMMIT\MEM_DECOMMIT\MEM_RESET\MEM_RELEASE等等).

 

原文地址:https://www.cnblogs.com/yoran/p/1087702.html