存储器分段

1.什么是地址?

CPU访问内存时要给出内存单元的地址(内存地址),每个内存单元都有一个唯一的地址,称之为物理地址。
另外:
CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。
每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。
另外,在80X86的范畴内:
80x86 按字节编址:每一个字节单元给予一个唯一的编号即存储器地址,称为物理地址。地址从0开始编号,顺序地每次加1,因此存储器的物理地址空间呈线性增长。
在机器里,地址也是用二进制数来表示的,无符号整数,书写格式为十六进制数

2.为什么要分段?

以80x86来举例:
因为80x86CPU提供的地址线为20根,所以寻址空间可达2的20次方个,也就是1MB的大小,用5位16进制的数码表示范围为00000H~FFFFFH。
然而,80x86CPU的地址寄存器(BX,BP,SP,SI,DI,IP,CS,DS,ES,SS)都是16位的,如果直接从这些寄存器中发出信号,那么寻址空间只能达到2的16次方,也就是64KB。
只能标识00000H~0FFFFH个地址,剩下的10000H~FFFFFH个地址是无法访问的,因此我们要对内存进行分段。

3.怎么分段?

以16位结构的CPU举例

16位结构描述了一个CPU具有以下几个方面特征:
1、运算器一次最多可以处理16位的数据。
2、寄存器的最大宽度为16位。
3、寄存器和运算器之间的通路是16位的。

  1. 将存储器划分为若干个逻辑段,每段最大64K个字节单元。逻辑段的大小可变,每段最少16个字节单元,也可以100个,1000个等等。意思就是对包间进行分组,每组最多64K个包间,最少16个包间。<br /> 这样,段内单元的地址可用416进制的数码表示,称为偏移地址。也就是说,在每组包间中,每个包间的房间门牌号用416进制数表示,该组的房间门牌号就叫做偏移地址。在这里需要注意一个问题,是该组的房间门牌号,必须是该组的房间门牌号。先记住这个,下面会详细地讲。
  2. 这里回到刚刚讲的00000HFFFFFH(包间门牌号),这些门牌号(地址)是物理地址
  • 8086/8088 CPU有20根地址线
  • 直接寻址的物理地址空间为1M字节,0-存储器分段和地址 - 图1
  • 存储单元以字节为单位
  • 范围是00000H至FFFFFH

8086/8088 CPU的寄存器都是16位
传输地址时显然一次只能传输16位有效地址,也就是只足够访问64K字节地址空间。
为了实现寻址1M字节物理空间,8086/8088引入了分段的概念。
image.png

地址加法器合成物理地址的方法:

物理地址=段地址×16+偏移地址

地址

·8086/8088的地址总线20位:
可访问的字节单元地址范围为 0 0000H~F FFFF H;
· 80286的地址总线24位:
可访问的地址范围为 00 0000H~FF FFFF H;
· 80386/80486和Pentium地址总线32位:
地址范围为 0000 0000H~FFFF FFFF H;
· Pentium Pro和PⅡ地址总线36位:
地址范围为 0 0000 0000H~F FFFF FFFF H。

一个存储单元中存放的信息称为该存储单元的内容,下图表示了存储器里存放信息的情况。
0004H号字节单元中存放的信息为78H,表示为:
(0004H)=78H
两个字节单元就构成了一个字单元,字单元的地址采用它的低地址来表示。右图中0004H字单元的内容为5678H,表示为
(0004H)= 5678H
双字单元的地址由其最低字节的地址指定,因此0004H双字单元的内容为:
(0004H)=12345678H。
image.png