一:进程虚拟地址空间的实现
每个进程都有一个私有的虚拟地址空间
系统将每个进程的虚拟地址空间映射到物理内存上
为了实现每个进程都有一个私有的虚拟地址空间系统为每个进程都创建了一个页目录和一组页表
每个进程的页表是独立的
而内核空间的页表是所有进程共享的
X86平台上有一个CR3寄存器,该寄存器保存当前运行的进程的页目录地址
系统进行进程切换时,会将CR3内的地址置为将要执行的进程的页目录地址
每个进程都有一个KPROCESS结构的属性,其中包括了进程页目录地址
二:数据共享与保护
有一些进程间共享的数据,系统的可执行代码(系统DLL)等,在各个进程间都是一致的
由此可得:不同进程的虚拟内存分页可以映射为相同的物理内存分页
如果多个进程同时向一个DLL文件写入数据怎么办?
系统是通过Copy-On-Write实现数据保护的
1.进程将某个系统DLL加载入进程内存空间
2.开始对该DLL进行写操作
3.操作系统监视到写操作将要进行
4.系统将进程虚拟内存分页映射到另一个新的物理内存分页(此分页是不共享的)
5.系统将DLL的内容也映射到这个新的物理内存分页
6.在新的物理内存分页上完成写操作
这样就不会影响到其他进程访问该DLL了
三:虚拟内存布局、分工、堆和栈
虚拟内存空间分两部分,低2G由应用程序使用,高2G由系统内核使用
应用程序使用的虚拟内存空间分为 代码,数据(全局变量),系统和用户DLL的代码,各线程的栈,堆等
进程的每个线程都有自己的栈
栈与函数的调用,执行和返回 局部变量的保存相关
堆是一种可以动态分配和释放的内存
内存分配函数都是通过堆进行分配内存的
四:总结
虚拟地址空间中的数据是分页管理的
应用程序不用考虑系统中其他应用程序使用内存的情况
虚拟地址并不是物理地址空间中的地址
如果系统中没有足够的物理内存供使用,那么操作系统会将当前没有使用的内存分页调度到硬盘上保存起来,应用程序不用关心系统怎么实现调度的