在1个操作系统中,不同的进程之间都是同享cpu和主存资源的,但是,同享主存会产生1些意想不到的结果,例如当前进程有可能不谨慎写了其它进程的内存。
为了更加有效管理内存并且少出错,便引入了1种对主存抽象的概念,称为虚拟内存(VM)。它将主存看成是1个存储在磁盘上的地址空间的高速缓存;并且为每一个进程提供了1致的进程地址空间,从而简化了进程的内存管理,保护了每一个进程的地址空间不被其他进程的地址空间所破坏。
物理地址就是cpu履行加在指令时会生成1个有效的物理地址,通过内存总线,将其传递到主存,并从主存中取出数据,返回给cpu的进程。
虚拟寻址相对物理寻址,首先cpu产生的是1个虚拟地址,虚拟地址会经过MMU地址翻译后产生相应的物理地址,从而再通过物理寻址来取出数据,返回给cpu。
虚拟寻址相对物理寻址的好处是可以免访问到主存中不存在的内存,由于它可以在地址翻译时就对虚拟地址进行检查,检查其是不是有效,并且物理寻址必须依照顺序来访问,而且在虚拟寻址中,当物理内存不够用时系统自动从硬盘空间划分1些容量出来当作虚拟内存使用。
前面我们知道了虚拟内存是1个自由寄存的磁盘上的单元,当虚拟内存作为物理内存的缓冲工具时,系统通过将虚拟内存分割为虚拟页,物理内存分割为物理页,通过将虚拟页缓存到物理内存中可以弥补物理内存大小的不足;1定程度的提高反应速度;减少对物理内存的读取从而保护内存延长内存使用寿命。
缓存需要引入1个具有某种方法来判定1个虚拟页是不是缓存在DRAM中的某个地方。如果是,还必须肯定这个虚拟页寄存在哪一个物理页中,还需要能处理缺页等现象。因而引入了页表,它寄存在物理内存中,和MMU中的地址翻译硬件1起来管理内存单元;页表需要将虚拟页映照到物理页,每次翻译硬件将1个虚拟地址转换为物理地址时,都会读取页表。
页表的基本结构以下:
页命中表示的是1个进程,当通过虚拟地址查找到页表中的相干页面时,设置了有效位,此时就会产生页命中,地址翻译硬件将虚拟地址作为1个索引在页表中定位,通过拿到页表的物理页号中的内容,从而在内存中读取它。
缺页就是DRAM缓存不命中这个进程,下图展现了页表如何处理缺页。
地址翻译是将虚拟地址空间转换成物理地址空间的映照关系,首先我们来介绍1下地址翻译中的虚拟地址的结构:
由上图可知,虚拟n为的虚拟地址中包括了p位的虚拟页偏移量vpo,和n-p位的虚拟页号vpn,地址翻译进程中,通过将虚拟地址中的获得虚拟页号vpn,从而在页表中定义到相干页面,取出来的物理页号ppn和虚拟页偏移量进行合并便构成了物理地址。
全部进程以下,下图介绍了TLB加速地址翻译,它对普通的地址翻译进行了优化,可以看看图中的虚拟地址的构成:
得到了物理地址后便会根据物理地址正在高速缓存中读取相应的块如果命中便会将相应的数据返回给cpu,如果没有命中就会产生缺页,内核会调用缺页异常处理程序并调入适合的页面重新加载有关引发缺页的指令。
虚拟内存是真实的存在在硬盘当中的,它使每一个进程都能有自己独立的地址空间,避免正在履行的进程对其他进程的地址空间进行写入操作,同时虚拟内存经常使用来作为主存的缓存,作为内存管理和内存保护工具,另外,有时候需要某种方法来检测虚拟地址的合法性,便引入了页表,它通过相干机制优化了虚拟内存,使虚拟内存更加高效。后面还会介绍虚拟内存的有关知识,希望能够延续关注。