Long

欢迎来到Long的博客站点

内存管理之无存储器抽象

前言

内存管理主要就是用于记录内存中有哪些内存已经被使用,哪些没有被使用。在进程需要时为其分配内存,在进程被换出到磁盘或者终止时释放其使用过的内存。这些管理操作都需要存储管理器来完成。这里的存储管理器不涉及到磁盘的管理,关于磁盘的管理,在下一章的学习中会进行讨论。本文主要是对在无存储器抽象的情况下讨论存储器的管理

初步管理内存

因为没有存储器抽象,所以存储器模型就是物理内存本身。程序直接访问物理内存。比如:

MOV REGISTER1 1000

该汇编指令直接将内存中地址为1000的数据拷贝到REGISTER1中,直接操作内存。那么在这种情况下要实现多道程序系统,是根本不可能的。因为如果有另一个程序同样有这条指令,将会擦出第一个程序的数据,将直接导致两个程序奔溃。那么如何才能在没有存储器抽象的情况下实现程序的并行,这还是有方法的。下面讨论的情形是内存足够大,即一个程序完全可以装入内存当中。下一章将会讨论内存不够大的情况下的解决措施。

保护键

当我们要实现多道程序设计时,可以采用的一种方式是交换技术,但是交换技术没有特殊硬件的帮助是不行的,我们这里讨论的是没有存储器抽象的情况下实现多道程序设计,也就是说我们的程序是直接访问物理地址的,应该始终记住这种情况,这样才能进行接下来的讨论。那么既然交换技术在没有存储器抽象的情况下是不行的,那么应该采取什么方式呢,IBM/360采用的是保护键的方式进行的。将内存划分为2kB的块,每个块分配一个4位的保护键,保护键存储在CPU中的特殊寄存器当中,也就是说通过这种方式来实现对内存的保护。比如有一个内存大小为1MB,此时只需要512个这样的4位保护键,总共大小为256个字节。当一个程序在执行时,比如其大小为512KB,内存的大小为1MB,这样该程序就需要256个保护键,同时PSW(程序状态字寄存器)中存储了该程序中的4位码,用于确定一个程序对一块大小为2kB的内存是否具有访问权限,当一个程序访问了保护键和其PSW码不相同的内存,这时IBM/360将会捕获到这一个事件。同时,对于保护键的写入,只有操作系统才能完成,也就是说防止用户进程之间、进程和操作系统之间的干扰。但是,这样也存在问题,见下一节。

静态重定向

前面提到了保护键,但是保护键是存在问题的,比如我们有两个程序需要运行,这时候,在内存中同时装入两个程序,可以假设两个程序的大小都是16kB。两个程序的部分映像如下图所示。
《内存管理之无存储器抽象》
在图c中可以清楚的看到,两个程序位于内存的不同地方,同时存在着保护键,避免了进程之间的干扰。但是,程序a在执行了第一条指令,跳转到地址为24处执行mov指令,这是没有问题的,它拥有该地址的访问权限。但是,此时发生调度,程序b执行,其第一条指令跳转到地址为28处执行,但是,地址28是程序a的地址空间,b是不能访问的,根据保护键机制,此时和程序b的psw码不同,程序b访问了非法空间,直接崩溃。为什么?其实就是因为程序中使用的是物理地址,访问时直接按照物理地址空间进行。那么有什么解决措施呢,有,那就是静态重定向。

比如这里的两个程序,程序b的每个程序地址直接加上16384,也就是一个程序在加载时,需要加上其在内存中的加载地址,这样无疑会降低加载速度,但这是IBM提出的补救措施,先讨论一下这种措施,这时,我们可以认为解决了问题,比如在前面提到的程序b的JMP 28,加载后,加上其加载地址(16384), 实际访问的是jmp 28 + 16384,这样程序b的确可以执行。但是,如果是mov REGISTER1 100; 将数值100拷贝到寄存器REGISTER1中呢,这条指令如果加上加载地址,那么程序就完全错了,也就是说我们需要区分什么指令需要重定向,什么指令不需要,装载器需要一定的方法来辨别地址和常数。

我本科期间是搞单片机的,在单片机中,使用的C语言来编程,但是,其本身就是单道程序,完全不用考虑并发问题。这样就不用考虑内存的管理问题,其实在没有出现多道程序设计之前,情况和现在的一些嵌入式设备是一样的。比如,你不可能写一个程序到你家的微波炉中,这显然也是没有意义的,里面的程序在开始的时候已经写好了,同时,里面的程序所访问的就是绝对的物理地址空间,也不需要进行上面内存保护,直接对内存进行操作就是了,完全没有问题。

点赞
  1. 匿名说道:

    :arrow:

发表评论

电子邮件地址不会被公开。