Linux内核(五)虚拟内存

来源:互联网 发布:java 方法 编辑:程序博客网 时间:2024/05/17 03:07

 转载请注明出处:jiq•钦's technical Blog 


内存管理单元(MMU)完成虚存地址到物理地址的转换。


1什么是虚拟内存:

虚拟内存两个关键技术:

1页表(地址变换机构)虚拟地址(连续的)到物理地址(不连续的页)的转换;

2页面置换功能。将暂时不用的页面放到磁盘,让正在运行的进行获得更大的物理空间。

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。(页面置换算法)

与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。

注意:虚拟内存不只是“用磁盘空间来扩展物理内存”的意思——这只是扩充内存级别以使其包含硬盘驱动器而已。把内存扩展到磁盘只是使用虚拟内存技术的一个结果,它的作用也可以通过覆盖或者把处于不活动状态的程序以及它们的数据全部交换到磁盘上等方式来实现。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,以借此“欺骗”程序,使它们以为自己正在使用一大块的“连续”地址。

现代所有用于一般应用的操作系统都对普通的应用程序使用虚拟内存技术,例如字处理软件,电子制表软件,多媒体播放器等等。老一些的操作系统,如DOS和1980年代的Windows,或者那些1960年代的大型机,一般都没有虚拟内存的功能——但是Atlas,B5000和苹果公司的Lisa都是很值得注意的例外。[1]

那些需要快速访问或者反应时间非常一致的嵌入式系统,和其他的特殊应用的计算机系统,可能会为了避免让运算结果的可预测性降低,而选择不使用虚拟内存。

 

2Linux中的虚拟内存

在Linux操作系统支持两种形式的交换空间:交换分区交换文件

 交换分区:在磁盘中专门分出一个磁盘分区用于交换 交换文件:创建一个文件用于交换交换空间大小没有规定特定的值,如果物理内存较小(小于512M字节)时,一般设置为物理内存的1.5倍到2倍。

Linux支持同时使用多个交换设备,还能为它们分配给不同的优先级。当需要交换出物理内存中页时,操作系统根据优先级顺序选择可用的交换设备。如果有多个交换设备优先级相同,那么它们是按照类似level0RAID的方式分配使用的。如果能够并行地访问这些交换设备的话,给他们分配相同的优先级就能够使系统性能得到提供。因此,分配优先级的时候还应该特别注意一些问题。例如,在同一物理磁盘上的多个交换分区就不应该被并行地使用,而应该以访问速度从高到底的顺序使用。所以在只有一块物理磁盘的时候,设置多个交换分区,并不能提高性能,反而可能会使性能下降。

 

3 为什么要虚拟内存?

(1) 安全性: 

(a) 隔离不同进程:

通过把不同进程的虚存空间映射道不同的物理内存,这样便实现了进程间在物理上的隔离。使得一个进程无法访问其他进程的进程空间。如图所示:

 (b) 隔离User Mode和Kernel Mode------双处理器模式的实现:

双处理器模式就是指用户模式和内核模式。通过虚存机制,操作系统使用两套不同映射寄存器将用户空间和内核空间映射到不同的物理内存,从而杜绝了用户程序直接访问(而不是使用系统调用)内核空间的可能性。

例如一个16位应用程序Hello_Jiq,最大地址空间是64k,其中32k空间0x0~0x7FFF被映射到物理内存的0x4000~0xBFFF,剩余32k空间0x8000~0xFFFF没有被做任何映射。内核空间被映射到物理内存0x0~0x3FFF。

应用程序访问0x0~0x7FFF时实际上是访问了物理空间的0x4000~0xBFFF,访问0x8000~0xFFFF时由于没做任何映射而导致总线错误。总之其无论如何都访问不到内核空间。


(2)提高空间利用率:

由于程序指令的指令字长的限制,其只能访问16位64K的地址空间。

但是总线支持18位地址模式,最大物理空间可达256K。

实际内存DRAM也比较多,一般大于256K甚至更高。

 

但是用户程序的指令如果直接访问物理内存的话只能访问0-64K的物理内存(访问不到64K-256K部分)。

使用虚拟内存可以将进程的每一个64K空间映射到物理内存的每一个64K部分(包括原来访问不到的高地址物理空间部分)。多个进程就可以充分利用所有内存空间。

 

(3)多进程支持:

任意进程可以在自己的"0-64K"的空间内任意分配代码区和数据区。如果没有虚存机制,而且任何进程都在想要使用0-64K的地址空间,但是又只能同时有一个进程使用,这样就会导致难以实现。

 

(4) 现代操作系统中虚存的另一个重要作用还有实现程序的动态链接!!!

编译 ---> 链接 ---> 装入 ---> 运行

1 0