内存的分段表示法

内存分段表示法

1.什么是内存?

内存(Memeory)是计算机中最重要的部件之一,它是程序与 CPU 进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存对计算机的影响非常大,内存又被称为主存,其作用是存放 CPU 中的运算数据,以及与硬盘等外部存储设备交换的数据。只要计算机在运行中,CPU 就会把需要运算的数据调到主存中进行运算,当运算完成后 CPU 再将结果传送出来,主存的运行也决定了计算机的稳定运行。

2.内存的物理结构

内存的内部是由各种 IC 电路组成的,它的种类很庞大,但是其主要分为三种存储器:

随机存储器(RAM):内存中最重要的一种,表示既可以从中读取数据,也可以写入数据。当机器关闭时,内存中的信息会 丢失。
只读存储器(ROM):ROM 一般只能用于数据的读取,不能写入数据,但是当机器停电时,这些数据不会丢失。
高速缓存(Cache):Cache 也是我们经常见到的,它分为一级缓存(L1 Cache)、二级缓存(L2 Cache)、三级缓存(L3 Cache)这些数据,它位于内存和 CPU 之间,是一个读写速度比内存更快的存储器。当 CPU 向内存写入数据时,这些数据也会被写入高速缓存中。当 CPU 需要读取数据时,会直接从高速缓存中直接读取,当然,如需要的数据在 Cache 中没有,CPU 会再去读取内存中的数据。

内存 IC 是一个完整的结构,它内部也有电源、地址信号、数据信号、控制信号和用于寻址的 IC 引脚来进行数据的读写。下面是一个虚拟的 IC 引脚示意图:

note:
图中 VCC 和 GND 表示电源,A0 - A9地址信号的引脚,D0 - D7 表示的是数据信号RDWR 都是控制信号,我用不同的颜色进行了区分,将电源连接到 VCC 和 GND 后,就可以对其他引脚传递 0 和 1 的信号,大多数情况下,+5V 表示 10V 表示 0

我们都知道内存是用来存储数据,那么这个内存 IC 中能存储多少数据呢?D0 - D7 表示的是数据信号,也就是说,一次可以输入输出 8 bit = 1 byte 的数据。A0 - A9 是地址信号共十个,表示可以指定 00000 00000 - 11111 11111 共 2 的 10 次方 = 1024 个地址。每个地址都会存放 1 byte 的数据,因此我们可以得出内存 IC 的容量就是 1 KB。

如果我们使用的是 512 MB 的内存,这就相当于是 512000(512 * 1000) 个内存 IC。当然,一台计算机不太可能有这么多个内存 IC ,然而,通常情况下,一个内存 IC 会有更多的引脚,也就能存储更多数据。

4. 确定物理地址的方法

  1. CPU 访问内存单元时要给出内存单元的地址。
  2. 所有内存单元构成的存储空间是一个一维的线性空间。
  3. 每一个内存单元在这个空间中有唯一的地址,这个唯一的地址称为物理地址

物理地址对应的是 5 位的 16 进制数,相当于 20 位的二进制数

4. 事实

4.1 8086 有 20 位地址总线,可传送 20 位地址,寻址能力为1M

4.2 8086 是 16 位结构 CPU
4.2.1 运算器一次最多可以处理 16 位的数据,寄存器的最大宽度为 16 位。
4.2.2 在 8086 内存处理的、传输、暂存的地址也是 16 位,寻址能力也只有64kb

问题: 8086 如何处理在寻址空间上的这个矛盾?!

5.用分段的方式管理内存

8086CPU 用”(段地址 x16)+偏移地址=物理地址”的方式给出内存单元的物理地址.

Note:
段地址 x16:相当于左移 4 位 2*2*2*2

将内存分成若干个段,内存并没有分段,段的划分来自于CPU!!!
内存是一块连续的区域,先对内存进行分段,然后具体到哪个物理地址,通过结合偏移地址来计算。

6. 用不同的段地址和偏移地址形成同一个物理地址


物理地址 段地址 偏移地址
21F60H 2000H 1F60H

Note:

21F60H

H 为 hex 的缩写. 表示十六进制
21F60H 表示为十六进制地址。

计算示例

物理地址 = 段地址 * 16 (左移 4 位) + 偏移地址
21F60H - 20000H = 1F60H

20000H 为左移 4 位,原理百度二进制与十六进制的转换.

我们把 8086 丰富的取址方式用活了,也就是把汇编语言学会了.


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!