背景
内存是现代计算机运行的中心。内存有很大一组字或字节组成,每个字或字节都有它们自己的地址。CPU根据程序计数器(PC)的值从内存中提取指令,这些指令可能会引起进一步对特定内存地址的读取和写入。
一个典型指令执行周期,首先从内存中读取指令。接着该指令被解码,且可能需要从内存中读取操作数。在指令对操作数执行后,其结果可能被存回到内存。内存单元只看到地址流,而并不直到这些地址是如何产生的(由指令计数器、索引、间接寻址、实地址等)或它们是什么地址(指令或数据)。
基本硬件:
CPU所能直接访问的存储器只有内存和处理器内的寄存器。机器指令可以用内存地址作为参数,而不能用磁盘地址作为参数。如果数据不在内存中,那么CPU使用前必须先把数据移到内存中。
CPU内置寄存器通常可以在一个CPU时钟周期内完成访问。对于寄存器的内容,绝大多数CPU可以在一个时钟周期内解析并执行一个或多个指令,而对于内存就不行。完成内存访问需要多个CPU时钟周期,由于没有数据以便完成正在执行的指令,CPU通常需要暂停(stall)。由于内存访问频繁,这种情况是难以忍受的,解决方法是在CPU与内存之间增加高速内存。这种协调速度差异的内存缓冲去,称为高速缓存(cache)。(这一方面是计算机组成原理的内容)
除了保证访问物理内存的相对速度之外,还要确保操作系统不会被用户进程所访问,以及确保用户进程不会被其他用户进程访问。这种保护可通过硬件来实现,硬件实现由许多方法,将在之后讨论。
其中一种可能方案为:
首先确保每个进程都有独立的内存空间,为此,需要确定进程可访问的合法地址的范围,并确保进程只能访问其合法地址。通过基地址寄存器(base register)和界限地址寄存器(limit register)可以实现这种保护。
基地址寄存器(base register)含有最小的物理内存地址,界限地址寄存器(limit register)决定了范围的大小。例如:如果基地址寄存器为300040而界限寄存器为120900,那么程序可以访问从300040到420940的所有地址。
内存空间保护的实现,是通过CPU硬件对用户模式所产生的每个地址与寄存器的地址进程比较来完成的。如果访问了不该访问的地址,则会陷入到操作系统中,并作为致命错误处理。
只有操作系统可以通过特殊的特权指令来加载基地址寄存器和界限地址寄存器。由于特权指令只可在内核模式下执行,而只有操作系统在内核模式下执行,所以只有操作系统可以加载基地址寄存器和界限地址寄存器。这种方案允许操作系统修改两个寄存器的值,而不允许用户程序去修改他们。
操作系统在内核模式下,可以无限制地访问操作系统和用户内存。因此操作系统可以将用户程序装入用户内存,在出错时输出这些程序,访问并修改系统调用的参数等。
地址绑定:
通常,程序以二进制可执行文件的形式存储在磁盘上。为了执行,程序被调入内存并放入进程空间内。
根据所使用的内存管理方案,进程在执行时,可以在磁盘和内存之间移动。在磁盘上等待调入内存以便执行的进程形成输入队列(input queue)。
通常的步骤是从输入队列中选取一个进程并装入内存。进程在执行时,会访问内存中的指令和数据。最后,进程终止,其地址空间将被释放。
许多系统允许用户进程放在物理地址的任意位置。这种组合方式会影响用户程序能够使用的地址空间。在绝大多数情况下,用户程序在执行前,会经过好几个步骤ÿ