内存
1、每个进程都有自己的虚拟地址空间。32位进程的虚拟地址空间为4GB,64位进程为16EB。正常读/写数据需要把物理存储器分配或映射到相应的地址空间,否则会导致访问违规。
2、空指针赋值分区:0X00000000到0X0000FFFF的进程地址空间,进程中的线程试图读取或写入位于这一分区内的内存地址,就会引发访问违规,用于捕获对空指针的赋值。
3、用户模式分区:进程的大部分数据都保存在这一分区,大小取决于CPU,X86系统中大小为2GB。Windows中,所有.exe和DLL都载入到这一区域。
4、内核模式分区:存储操作系统代码,为所有进程共有。
5、页面是一个内存单元,系统通过它来管理内存,x86和x64系统使用的页面大小为4KB。
6、磁盘(硬盘)上的文件一般被称为页交换文件,内存大小+页交换文件大小 = 可用内存大小。
z流程图(p363补)
7、当把一个程序位于硬盘上的文件映像(即一个.exe或DLL文件)用作地址空间区域对应的物理存储器时,便称这个文件映像为文件映射文件。
8、一个块是一些连续的页面,这些页面具有相同的保护属性,并且以相同类型的物理存储器为后备存储器。
9、Windows提供了三种机制来对内存进行操纵:
虚拟内存:适合用来管理大型对象数组或大型结构数组;
内存映射文件:适合用来管理大型数据流(文件),以及在同一机器上运行的多个进程间的共享数据;
堆:适合管理大量的小型对象。
10、调用VirtualAlloc函数来预定进程的地址空间区域或者将物理存储器调拨给所预定的区域,撤销调拨物理存储器或者释放地址空间中的一整块区域,调用VirtualFree函数
11、默认情况下,系统创建线程时,会为线程栈预订1MB的地址空间区域,并给区域调拨两个页面的物理存储器。
构建应用程序时,链接器会把想要的栈的大小写入到.exe或.dll文件的PE文件头中,当系统创建线程栈时,会根据其大小来预定地址空间区域。
12、预订地址空间区域后,系统会给区域顶部的两个页面调拨物理存储器。线程开始执行之前,系统会把线程栈的指针指向区域顶部的那个页面的末尾。区域顶部往下第二个页面被称为防护页面。
13、系统不会给栈底的那个页面调拨存储器(避免栈下溢,覆盖线程栈之外的内存),在给栈倒数第二个页面调拨物理存储器时,会引发栈溢出异常,若继续使用栈那么将访问栈底的页面,因为其未调拨物理存储器,所以系统会抛出访问违规异常,系统将结束整个进程。
14、