zoukankan      html  css  js  c++  java
  • 计算机中的存储器

    存储器是用来存放程序和数据的。计算机的存储系统由内存(主存储器)和外存(辅助存储器)组成。内存设在主机内部,用来暂时存放当前运行的程序和使用的数据,其特点是存取速度快,但比外存容量小,且掉电后信息全部消失。外存设在主机外部(磁盘、光盘等),属于计算机外部设备,用来存放当前不参与运行的程序和数据。其特点是能永久存放信息,存储容量大,但存取速度较低。

    一、存储器的组成

    存储器的基本单位是位,它能存储一位二进制数的 0 或 1。每 8 位组成一个字节,每相邻的 2 个字节还可组成一个字,每相邻的 4 个字节又可组成双字,依此类推。

    存储器存取的最小单位是一个字节信息,叫作一个存储单元,存储器是由若干个存储单元组成的。存储器的容量就是存储单元的个数。

    为了访问不同的存储单元,每一单元都被指定一个编号,这个编号叫作该存储单元的物理地址。8086/8088 CPU 有 20 条地址线,因此具有 1MB 的寻址能力(220=1MB),最低地址编号为 00000H,最高地址编号为 0FFFFFH,如图 8 所示。

    对存储器的一次访问可以读写一个字节或一个字,甚至可以访问一个双字。

    存储单元地址表示

    图 8 存储单元地址表示

    二、存储器的段结构

    8086/8088 CPU 有 20 条地址总线传输地址,即使用 20 位的物理地址编号,直接寻址范围为 1MB,而 CPU 内部的运算器和寄存器都是 16 位结构,只能表示和处理 16 位地址,16 位地址范围最大只能是 64KB。为了能寻址 1MB 范围的存储空间,所以采用了存储器的分段技术。

    所谓存储器分段技术,就是把 1MB 的存储空间划分成任意的一些段,每个段是一个可独立寻址的逻辑单位,其最大长度不超过 64KB,这样段内的地址就可以用 16 位表示。每个段的起始地址叫段基址,且规定,各段的起始地址都从能被 16 整除的地址开始。也就是说,段基址的最低 4 位总是 0,段基址的高 16 位放入段寄存器中。

    在 8086/8088 的程序中,需要设立几个段,每个段有多少个字节以及每个段有什么用途完全由用户自己确定。每个段中存储的代码或数据,可以存放在段内任意单元中。

    在程序中设置的段叫逻辑段,各个逻辑段在物理存储器中可以是邻接的、间隔的、部分重叠的和完全重叠的 4 种情况,如图 9 所示。所以一个物理存储单元可映像到一个或多个逻辑段中。例如图 9 中 DATA_BYTE 单元可映像到段 2、段 3 和段 4 中。

    物理存储器中的段结构

    图 9 物理存储器中的段结构

    存储器虽然可以划分成若干个段,但是在任何时刻,一个程序只能访问 4 个段中的内容,这 4 个段分别是代码段(Code Segment)、数据段(Data Segment)、堆栈段(Stack Segment)和附加段(Extra Segment)。它们分别由对应的 4 个段寄存器 CS、DS、SS、ES 指向。这 4 个段寄存器分别保存 4 个段的段基址高 16 位二进制数,即段基值。由 4 个段寄存器指向的那些段叫当前段。所以,当前段至多可容纳 64KB 的代码、64KB 堆栈和 128KB 的数据(分别由 DS、ES 指向的当前段)。如果应用规模较大,可以在程序中通过修改相应段寄存器的内容而访问其他段。如图 10 所示,由于 4 个段寄存器有段 B、F、I、K 的段基值,所以段 B、段 F、段 I、段 K 是当前段。如果程序需要访问其他段(如段 J)中的数据,那么可用程序办法修改 DS 或 ES 的内容为 J 的段基值,改变当前段。

    存储器中的当前段

    图 10 存储器中的当前段

    三、逻辑地址与物理地址

    在 8086/8088 微机中,每个存储单元有两种地址:物理地址(Physical Address)和逻辑地址(Logical Address)。在 1MB 的存储空间中,每一个存储单元(即一个字节单元)的物理地址是唯一的,就是这个单元的地址编码。物理地址由二进制的 20 位组成,它的范围是 00000H~FFFFFH。CPU 与存储器之间的任何信息交换,都使用物理地址。

    在程序设计中,使用逻辑地址而不使用物理地址,这不仅有利于程序的开发,且对存储器的动态管理也是有利的。一个逻辑地址是由段基值和偏移量两部分组成的,且都是无符号 16 位二进制数。表达形式为“段基值:偏移量”,如 2010H:0100H,或 DS:10A2H。

    段基值是一个段起始单元地址(段基址)的高 16 位,它存放在某一个段寄存器中。偏移量(偏移地址)表示某存储单元与它所在段的段基址之间的字节距离。当偏移量为 0 时,就是这个段的起始单元。当偏移量为 0FFFFH 时,就是这个段的最后一个字节单元。由于逻辑段可以重叠,因此,同一个物理地址可以得到不同的逻辑地址。例如,两个逻辑地址 2010H:1000H 和 2000H:1100H 对应同一物理地址 21100H,即它们指向同一存储单元。

    由于段基值由段寄存器指出,因此,在程序中要对某个存储单元的数据进行存取时,只需要给出偏移量。程序中给出偏移量常用符号或某种寻址表达式,然后由计算机计算出偏移量。这种由计算机根据寻址表达式计算出的偏移地址叫有效地址,用 EA 表示。

    每当 CPU 访问存储器时,总线接口单元 BIU 会把逻辑地址转换成物理地址。转换方法是:首先把逻辑地址中的段基值(在段寄存器中)左移 4 位,形成 20 位的段起始地址(段基址),然后再加上 16 位的偏移量,产生 20 位的物理地址,转换过程如图 11 所示。

    逻辑地址到物理地址的转换

    图 11 逻辑地址到物理地址的转换

    四、堆栈

    堆栈是用程序在内存中定义的一个段(段值由 SS 指示)。这个段是按照“后进先出”的规则进行数据存取的特殊存储区域,主要用于暂存数据以及在过程调用或中断处理时暂存断点信息。

    堆栈是一端固定、另一端浮动的存储区。所有信息的存取都在浮动的一端进行。这个存储区最大地址的字存储单元为堆栈底部,叫栈底(Bottom)。在堆栈中存放的数据从这里开始,逐渐向地址小的方向“堆积”。在任何时刻,存放最后一个信息的存储单元(即已存放信息的最小地址单元)为堆栈顶部,叫栈顶(Top)。栈顶是随着存放信息的多少而变的,它是这个存储区的浮动“端头”,而栈底是固定不变的,它是固定“端头”,如图 12 所示。

    8086/8088 堆栈构造

    图 12 8086/8088 堆栈构造

    由于堆栈顶部是浮动的,为了指示现在堆栈中存放数据的位置,设置了一个堆栈指针 SP(Stack Pointer)指向堆栈的顶部。这样,堆栈中数据的进出都由 SP 来“指挥”。

    在堆栈中存取数据的规则是“先进后出”。就是说最先进入堆栈的数据(在栈顶底部),最后才能取出。相反,最后送入堆栈的数据(在堆栈顶部),最先取出。

    原文:计算机中的存储器

    (完)

  • 相关阅读:
    【TIDB】2、TIDB进阶
    【TIDB】1、TiDb简介
    【Tair】淘宝分布式NOSQL框架:Tair
    【ElasticSearch】查询优化
    【高并发解决方案】9、大流量解决方案
    【高并发解决方案】8、Nginx/LVS/HAProxy负载均衡软件的优缺点详解
    【JVM】jdk1.8-jetty-swap被占满问题排查
    【JVM】记录一次线上SWAP偏高告警的故障分析过程
    【JVM】内存和SWAP问题
    【MySQL】mysql索引结构及其原理
  • 原文地址:https://www.cnblogs.com/vin-c/p/14845976.html
Copyright © 2011-2022 走看看