进程的虚拟内存
程序和进程的区别
- 程序是一个静态的概念,它就是预先编译好的指令和数据集合的一个文件(狭义上讲它就是一个可执行文件)。
- 进程是一个动态的概念,它是程序运行时的一个过程。
虚拟地址空间
程序在被运行起来后,也即进程,拥有自己独立的虚拟地址空间,这个虚拟地址空间的大小由计算机硬件平台所决定,具体的是由CPU地址线的数量所决定,例如16位CPU决定了其虚拟地址空间的地址为 0 到 \(2^{16}-1\),也即 0x0000 ~ 0xFFFF
,而32位CPU则具有32位寻址能力。
1. 虚拟内存是否为真正的内存?
不是,虚拟内存并不是真正的内存,在32位平台上,它是通过映射的方法使得虚拟内存达到4GB。
2. 虚拟内存管理器
前面提到了虚拟内存是通过映射的方式来达到4GB,这里是虚拟内存管理器做的事情,虚拟内存管理器就是将应用程序中的代码映射到该进程的虚拟地址的某个位置,并把当前所需要的代码读入到物理内存。那么进程如何通过虚拟地址来访问数据?这里就需要用到地址转化了。
3. 虚拟地址转化
虚拟地址转化需要内存管理单元MMU和页表的共同参与,内存管理单元又是由快表TLB和Table walk unit组成,在地址转化时,若快表中存在该项,则可以直接从快表中获得物理地址,否则,则需要使用到table walk unit来查询进程的页表(每个进程有自己的页表)。
4. 为什么在进程的虚拟地址空间中,有一部分要分给操作系统呢?
比如在Linux系统中,高1GB(0xC0000000 ~ 0xFFFFFFFF
)的虚拟地址空间为系统空间,该部分为所有的系统进程所共享,并且,访问该空间需要根权限。这个问题就涉及到了进程虚拟空间的布局。
5. 虚拟地址空间的作用
- 应用程序不会直接访问物理地址。
- 虚拟内存管理器通过虚拟地址的访问请求控制所有的物理地址访问
- 每个进程都有独立的4GB寻址空间,不同进程的地址空间是彼此隔离的。
- DLL程序没有“私有”空间,它们总是被映射到需要使用到它们的进程的地址空间中,作为调用进程的一部分运行。
参考:
- 《加密与解密》
- 《程序员的自我修养》