内存管理介绍
早期的计算机内存容量非常小,当时的PC主要使用DOS操作系统或者其它操作系统。早期的操作系统由于系统硬件的限制,无法支持内存管理,应用程序占用的空间和程序规模都比较小。随着计算机硬件性能不断提高,程序的处理能力也不断提高,应用程序占用的存储空间不断膨胀。实际上,程序的膨胀速度远远超过了内存的增长速度。不断增大的程序规模导致内存无法容纳下所有的程序。
早期程序处理内存不够使用的最直接的办法就是把程序分块。分块的思想是把程序等分成若干个程序块,块的大小足够装入内容即可。
当程序开始执行的时候,首先把第一个程序块装入内存。在程序执行过程中,由操作系统根据程序需要装入后面的程序块。程序分块的思想是虚拟存储器处理方法的前身。
虚拟存储
虚拟存储器的思想是允许程序占用的空间超过内存的大小,把程序划分为大小固定的页,由操作系统根据程序运行的位置把正在执行的页面调入内存,其他未使用的页面则保留在磁盘上。如一个系统有16M字节的内存需要运行32M字节大小的程序,通过虚拟存储技术,操作系统把程序中需要执行的程序段装入内存,程序其他部分存放在磁盘上。当程序运行走出装入内存的部分后,操作系统自动从磁盘加载需要的部分。
虚拟存储技术中,操作系统通过内存页面管理内存空间,在一个操作系统中内存页面的大小是固定的。程序被划分成与内存页面大小相同的若干块,便于操作系统加载程序到内存。操作系统根据内存配置决定一次可以加载多少程序页面到内存。在一个实际的系统中,虚拟存储通常是由硬件(内存管理单元MMU)和操作系统配合完成的。
内存访问顺序
计算机可以访问的地址是有限制的,通常称做有效地址范围。
地址范围的大小与计算机总线宽度有直接关系,如32位总线可以访问的地址范围是0x0~0xFFFFFFFF(4G)空间。
程序可以访问的地址空间与总线支持的地址相同,但是在实际系统中,地址空间所有的地址都是有效的。通常把程序能访问的地址空间称做虚拟地址空间。
在计算机系统上,受到内存空间大小的限制,实际的地址空间远小于虚拟地址空间。可访问的物理内存空间称做物理地址空间。程序访问的虚拟地址空间的地址需要转换为物理地址空间的地址才能访问。
在没有使用虚拟存储技术以前,程序访问的空间就是物理地址空间,访问地址无须转换。使用虚拟存储技术后,程序访问虚拟地址空间的地址需要经过内存管理单元的地址转换机制变换后,得到对应的物理地址才能访问,而转换的过程对用户来说是不可见的。
在进行虚拟地址和实际地址映射的时候,通过查内存表映射到不同的物理内存地址上。
没有MMU的管理,操作系统对内存空间是没有保护的,操作系统和应用程序访问的都是真实的内存物理地址。
地址翻译过程
使用虚拟存储的计算机系统可以提供超过内存地址空间大小的虚拟内存空间。如在64K地址空间的计算机上可以提供1M字节大小的虚拟地址空间。提供超过实际地址空间的虚拟空间后,计算机系统需要通过地址转换才能保证程序正确运行。
实际上,使用虚拟存储的计算机系统中,内存与外部存储器的数据传输也是按照页为单位进行的,从程序运行的角度看,程序可以访问超过实际内存大小的虚拟地址空间,这是由程序运行的局部性原理决定的。程序在运行的时候,在一段时间内总是限定范围的程序段内运行。因此,在程序访问某个虚拟内存空间的时候,可以通过内存管理单元把虚拟地址映射到实际的内存地址,这个过程称做地址翻译过程。
现代计算机体系结构中,地址翻译过程是由内存管理单元完成的。内存管理单元向操作系统提供了配置接口,在系统启动的时候,由操作系统向内存管理单元配置虚拟地址与物理地址之间的转换关系。在程序访问地址的时候由内存管理单元完成地址映射。一般来说,不同的处理器体系结构有不同的地址翻译方法。
访问权限
现代的多用户多进程操作系统,需要MMU才能每个用户进程都拥有自己的独立的地址空间的目标。使用MMU,OS划分出一段地址区域,在这块地址区域中,每个进程看到的内容都不一定一样。
例如Microsoft Windows操作系统,地址4M~2G处划分为用户地址空间。进程A在地址0x400000映射了可执行文件。进程B同样在地址0x400000映射了可执行文件。如果A进程读地址0x400000读到的是A的可执行文件映射到RAM的内容,而进程B读取地址0x400000时则读取到的是B的可执行文件映射到RAM的内容。这个时候就需要访问权限机制来处理不同进程访问同一地址内存的问题。
本文转自infohacker 51CTO博客,原文链接:http://blog.51cto.com/liucw/1200107