对于32位进程(0x0000 0000~0xFFFF FFFF),有4GB的地址空间。
每个进程都有自己专有的地址空间,当进程的各个线程运行时,它们只能访问属于该进程的内存。
这4GB其实是虚拟地址空间,不是物理存储器。
为了能够正常读写数据,需要把物理存储器分配或者映射到相应的地址空间,否则将发生访问违规错误(Access Violation)。
x86 32位 Windows虚拟地址空间的分区
空指针赋值分区 0x0000 0000——0x0000 FFFF (捕获空指针的赋值)
用户模式分区 0x0001 0000——0x7FFE FFFF
64KB禁入分区 0x7FFF 0000——0x7FFF FFFF
内核模式分区 0x8000 0000——0xFFFF FFFF
当系统创建一个进程并赋予它地址空间时,可用地址空间中的发部分都是闲置的或尚未分配的。
为使用这部分的的地址空间,要调用VirtualAlloc分配其中的区域,这个操作被称为预订。(不再使用时,调用VirtualFree释放。)
分配的粒度为64K,起始地址为分配粒度的整数倍。系统会确保分配的大小正好是系统页面大小的整数倍。
x86系统的页面大小为4KB。