内存基础知识

内存(Memory)是计算机的重要部件之一,也称内存储器和主存储器,它用于暂时存放CPU中的运算数据,与硬盘等外部存储器交换的数据。它是外存与CPU进行沟通的桥梁。只要计算机开始运行,操作系统就会把需要运算的数据从内存调到CPU中进行运算,当运算完成,CPU将结果传送出来。

在多道程序环境下,同一时间可能会有多个程序并发执行,即有多个程序的数据需要同时存放在内存中,此时,为了区分内存中不同数据存放的位置,就需要引入存储单元的概念

存储单元:一般应具有存储数据和读写数据的功能,以8位二进制作为一个存储单元,也就是一个字节。每个单元有一个地址,是一个整数编码,可以表示为二进制整数。程序中的变量和主存储器的存储单元相对应。变量的名字对应着存储单元的地址,变量内容对应着单元所存储的数据。存储地址一般用十六进制数表示,而每一个存储器地址中又存放着一组二进制(或十六进制)表示的数,通常称为该地址的内容。

  1. 如果计算机“按字节编址”则每个存储单元大小为1字节即1B,即8个二进制位
  2. 如果字长为16位的计算机“按字编址”,则每个存储单元大小为1字,每个字大小为16个二进制位

内存在进程运行过程中的操作

可见,我们写的代码要翻译成CPU能识别的指令。这些指令会告诉CPU应该去内存的哪个地址存/取数据,这个数据应该做什么样的处理。在这个例子中,指令中直接给出了变量x的实际存放地址(物理地址)。但实际在生成机器指令的时候并不知道该进程的数据会被放到什么位置。所以编译生成的指令中一般是使用逻辑地址(相对地址)

逻辑地址与相对地址的区别

链接的三种方式

  1. 静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
  2. 装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。
  3. 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。

装入的三种方式:

内存管理

操作系统作为系统资源的管理者,当然也需要对内存进行管理,这些管理涉及到:

  1. 操作系统负责内存控件的分配与回收
  2. 操作系统需要提供某种技术从逻辑上对内存控件进行扩充
  3. 操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换(通过上文所说的三种装入方法)
  4. 操作系统需要提供内存保护功能,保证各个进程在各自的存储空间内运行,互不干扰

内存保护的概念与实现方法

方法一:

在CPU中设置一堆上下限寄存器,存放进程的上下限地址。进程的指令要访问某个地址时,CPU检查是否越界

方法二:

采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。