主要内容

  • 计算机体系结构/内存分层体系
  • 地址空间&地址生成

计算机体系结构/内存分层体系

  • 计算机体系结构

    计算机硬件体系结构主要包含三大块内容:

     CPU:完成对程序或软件执行的控制。

     内存:防止程序执行的代码和处理的数据。

     外部设备:配合程序发挥作用。

  • 内存分层体系

    根据CPU访问数据所处位置的不同,可以将内存的存储结构进行分层。

  寄存器/cache:位于CPU芯片内存,操作系统无法直接管理,速度很快,容量很小。

  主存:放置操作系统要运行的数据和代码。容量比寄存器和cache要大很多,速度相对慢一点。掉电之后,数据会消失。

  磁盘(硬盘):速度比主存慢很多,容量要比主存大很多。

  

  从内存层次结构来看,存储的容量和读取其中数据的速度是很难兼顾的,如果要保持容量,不丢失速度或者保持速度,不丢失容量,就需要操作系统的协助。为此,操作系统有一些很重要的目标需要实现:

    • 抽象:使程序运行在内存中时,由于操作系统的有效管理,不需要考虑很多的底层细节。程序不需要考虑物理内存和外设的具体位置,其访问的地址空间是连续的。这个地址空间一般被称为逻辑地址空间。
    • 保护: 在内存中可能运行多个不同的应用程序,这些程序有可能破坏其他进程的地址空间。因此,需要一种机制将进程间的地址空间隔离起来,这种机制也需要操作系统来完成。
    • 共享:除了隔离之外,进程之间也需要交互。操作系统需要保证不同进程之间,可以安全有效地传递数据。
    • 虚拟:当应用程序较多时,会出现内存不足的情况。为此,操作系统需要把最需要放到内存中的数据放入内存,将一些相对不重要的数据暂时放到磁盘上去,从而实现一种虚拟的大的内存。这一过程要对应用程序透明,且尽可能的满足应用程序的需求。
  • 在操作系统的内存管理范例

   如图所示,当前共有P1~P4四个应用程序,但是内存无法同时放下这四个应用程序,因此,暂时先将P4转移到硬盘当中去,使P1能有效执行。当P1执行结束以后,可以将控制权交给P2,P3,在内存中进一步执行。当P4得到满足它的条件以后,也会进一步执行。

在操作系统中管理内存的不同方法

  操作系统要实现上面提到的四个目标,需要一些方法进行辅助,这些方法包括:

  • 程序重定位
  • 分段
  • 分页
  • 虚拟内存
  • 按需分页虚拟内存

  在之后的文章当中,会对这些方法进行进一步讲解。

实现高度依赖于硬件

  操作系统完成上述这些功能的时候,需要和计算机硬件相配合。

  • 必须知道内存架构
  • MMU(内存管理单元):硬件组件负责处理CPU的内存访问请求

 

地址空间与地址空间

  在进一步讲解操作系统机制之前,需要对地址空间的概念有进一步的了解。这里面涉及到其中几点:

  • 地址空间定义

  地址空间分为两种,一种是物理地址空间,一种是逻辑地址空间。物理地址空间和硬件直接对应,如内存和硬盘。物理地址空间的管理由硬件来控制。逻辑地址空间是程序看到的内存空间,是一个一维的线性地址空间。应用程序在这个地址空间中,很容易去访问数据。程序访问逻辑地址空间,最终都是要落实在物理地址空间当中,操作系统需要建立两种地址空间的对应关系。

 

  • 地址生成
    • 逻辑地址的生成

  下面用一个C程序介绍逻辑地址空间是怎么生成的。在C程序中,变量,函数的名字,都是一种逻辑地址。C程序经过编译以后,得到汇编程序(.s程序)。汇编程序更接近及其语言。汇编器再将其转化为机器语言(.o程序)。在机器语言中,变量和函数的符号名会被转化为地址,这是一种从0开始的逻辑地址。因为编译过程中,可能会涉及多个程序,不同程序的地址可能会相互访问,形成一种依赖关系。这个过程需要通过链接器进行处理,将多个程序归一为一个单一的执行程序(.exe程序)。执行程序中,不同.o程序的地址已经有了单一的定义。最后,装载器将执行程序放入内存当中运行,这一步需要将逻辑地址进行相应的分配,使应用程序在内存中可以正常运行。执行程序的地址有一定的偏移量,程序的访问和执行以来这个偏移量。这个过程,就是逻辑地址的生成过程。这整个转换过程基本不需要操作系统的帮助,通过应用程序及编译器等就可以完成。

    • 逻辑地址和物理地址的对应关系

  CPU要运行一条指令,需要将其从内存中取出来。这需要知道指令的物理地址,CPU一开始是不知道的,但它知道指令的逻辑地址,这就需要查找物理地址和逻辑地址的对应关系。在CPU的内存管理单元(MMU)中,有一块区域表示了这个映射关系。这个映射关系在内存中也有相应的表示。通过查询映射关系表,就可以知道逻辑地址对应的物理地址。物理地址的生成过程具体的包括如下几个步骤:

 

 

1. 当CPU执行某条指令的时候,ALU部件需要指令的内容,此时它会发出请求,请求中包含指令的逻辑地址。

2. MMU会查映射表中,该逻辑地址是否存在对应的物理地址。如果有,则返回物理地址,如果MMU当中没有,则会产生一个处理过程,去内存中继续找。

3. 如果在主存中找到了,则CPU的控制器会向主存发出请求,来获取这个物理地址。

4. 主存会把内存的内容通过总线传给CPU,CPU拿到内容以后开始执行指令。

    逻辑地址和物理地址的映射关系需要操作系统提前建立。

  • 地址安全检查

  为了确保内存中的程序不相互干扰,因此操作系统需要确保每一个程序访问的地址空间是合法的,是限制在约束范围以内的。这种约束也是靠操作系统完成的。一个地址包含两部分,一个是起始地址,一个是长度。通过起始地址和长度可以确定一个合法访问区域,一旦超出了这个区域,访问就变成不合法的。操作系统会建立和维护一张映射表,这张表记录逻辑地址是否在合法访问区域之内。CPU在执行某条指令时,会去检测这个映射表,如果指令的逻辑地址满足区域的限制,则可以根据对应关系找到逻辑地址对应的物理地址,取回指令;如果不满足,CPU就会产生内存访问异常,让操作系统进一步处理。