对于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。
本文详细介绍了32位进程的4GB虚拟地址空间如何分配及使用,包括空指针赋值分区、用户模式分区、64KB禁入分区和内核模式分区。系统在创建进程时如何分配地址空间,以及分配的粒度、页面大小和预订、释放的流程。
Windows内存体系结构&spm=1001.2101.3001.5002&articleId=9704175&d=1&t=3&u=2e912849888649fe98b59b06f3c89510)
687

被折叠的 条评论
为什么被折叠?



