32位机器,每个程序有4G的虚拟地址空间。大致分为4块,从低地址到高地址依次是:NULL区,用户区,隔离区,核心区。用户私有的数据都在用户区(当然这个区里又可以细分,其中也包括一部分可以共享的内容),系统内核等东西都在核心区。总体来说,A进程的虚拟地址空间中的内容和B进程相比,只有各自的用户区不一致。通常用户区中,进程又会将exe文件(由头数据和段数据组成)中定义的代码段、堆栈段、数据段等各个段映射到用户区的特定不同部位。对于这部分区域,用户需要用VirtualAlloc先为自己预留后再提交,最后在自己的页面被cpu访问时再从exe映像中将数据加载到主存,然后将虚拟地址映射为主存的物理地址。基本上这样就可以了,至于系统如何进行页面的管理以及地址映射如何实现等细节请大家再参考别的文献。真正的虚拟内存,是由内核管理的内存映射表(系统分配),由多级目录组成,而进程管理的虚表,最终指向内核管理的内存映射表,解释出指向的内存物理区块。(这就可以解释不同的进程,同样的虚址,指向不同的内存)系统空间是为系统预留的(不知道存放的是什么); 内核分配的数据,只有内核可直接访问(如,驱动的映射,内核对象表,......)虚拟内存空间和进程的虚拟地址空间是不同的,而且真正运行时进程的虚拟地址空间会映射到虚拟内存空间.
进程空间&虚拟内存
最新推荐文章于 2023-01-06 18:04:01 发布