1.内存单元的编址
*内存每个单元的地址在逻辑上都由两部分组成:
- 段基地址
指示存储单元在整个内存空间中处于哪个区域 - 段内偏移
指示存储单元在段中的相对位置(与段中第一个单元的距离)
段中的第一个单元称为段首,段首地址是0
内存的物理地址由16位段基地址和16位段内偏移组成,
对于段首地址,我们用4位表示段内偏移,这样就构成了一个20位地址
如上图,物理地址可以写成一个表达式
-
物理地址=段基地址*16+偏移地址
为什么 *16呢?
因为我们知道 *2就是左移一位,将段基地址左移4位,低位补4个0,就成了段首地址,2的4次方就是16,所以乘以16 -
逻辑段
我们能直接产生16位的地址,2的16次方的64k,所以管理的是64k个内存单元,1兆=16个64k,也就是我们只能把1兆的内存空间分成16个段,这叫物理上的分段
但实际没有用物理上的分段模式,而是根据需要,不断地调整段的大小,可以挨着,可以一部分重合,也可以在一个区域重复使用(分时复用),这样就不是物理分段了,变成了逻辑上的概念,所以就成了逻辑段
2.段寄存器
用于存放相应逻辑段的段基地址
虽然可有2的16次方个逻辑段存在,但是它的类型只有4个
这4个逻辑段对应着4个类型的段寄存器,所以逻辑段的数量虽然很多,但是它的段寄存器只有下面4个:
所以每个程序模块里,最多有4个逻辑段,如果你觉得你的程序太大,不够用,那你就再写一个模块,当然这两个模块要分时运行,不能同时做
例:
一个内存单元的物理地址是不可能改变的,逻辑地址可能会变,如上图,因为同样的一个内存单元可能属于不同的逻辑段
总结如下:
基地址不是由程序员控制的,而是由操作系统控制的,
- 逻辑段说明
3.堆栈段