虚拟内存和物理内存如何映射?
以X86处理器为例,进程被创建时有4G的寻址空间,至于为什么是4G,这个又和CPU地址总线有关。当我们开启计算机时,明明只有4G物理内存的,为什么开启的进程数量有几百个。进程4G的进程关系一定时和物理内存保持了某种映射关系。而不是独占。
1、用户编制程序时使用的地址称为虚地址或逻辑地址,其对应的存储空间称为虚存空间或逻辑地址空间;而计算机物理内存的访问地址则称为实地址或物理地址,其对应的存储空间称为物理存储空间或主存空间。
4、虚拟内存:使程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
若计算机运行程序或操作所需的随机存储器(RAM)不足时,则 Windows 会用虚拟存储器进行补偿,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟内存,虚拟内存在硬盘上的存在形式就是 PAGEFILE.SYS这个页面文件。它将计算机的RAM和硬盘上的临时空间组合。将数据移入分页文件可释放RAM,以便完成工作。
若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。
分页文件:硬盘上一个或者多个隐藏文件pagefile.sys,Windows用于存储未存入内存的部分程序和数据文件。页面文件和物理内存或随机存取内存(RAM)构成了虚拟内存。Windows会根据需要将数据从页面文件移至内存,或将数据从内存移至页面文件以便为新数据释放内存。也叫“交换文件”。
使用了分页机制之后,4G的地址空间被分成了固定大小的页,每一页或者被映射到物理内存,或者被映射到硬盘上的交换文件中,或者没有映射任何东西。对于一般程序来说,4G的地址空间,只有一小部分映射了物理内存,大片大片的部分是没有映射任何东西。物理内存也被分页,来映射地址空间。对于32bit的Win2k,页的大小是4K字节。CPU用来把虚拟地址转换成物理地址的信息存放在叫做页目录和页表的结构里。
虚拟内存:
1.每个进程都有各自独立的4G 字节的虚拟地址空间。4G的进程空间分为两部分,0~3G-1 为用户空间,3G~ 4G-1 为内核空间。
2.用户程序中使用的都是虚拟地址空间中的地址,永远无法直接访问实际物理地址。
3.虚拟内存到物理内存的映射由操作系统动态维护。
4.虚拟内存一方面保护了操作系统的安全,另一方面允许应用程序使用比实际物理内存更大的地址空间。
5.用户空间中的代码不能直接访问内核空间中的代码和数据,但是可以通过系统调用进入内核态,间接地与内核交互。
6.对内存的越权访问,或访问未建立映射的虚拟内存(野指针、不在映射表中),将会导致段错误。
7. 用户空间对应进程,进程一切换,用户空间随即变换。
内核空间由操作系统内核使用,不会随进程切换而变化。
内核空间由内核根据独立且唯一的页表init_mm.pgd 进行映射,而用户空间的页表则每个进程一份。
8. 每个进程的内存空间完全独立,因此在不同进程之间交换虚拟地址毫无意义。
9.虚拟内存到物理内存的映射,以页(4096字节)为单位。