intel 8086的内存分段管理机制

前言

intel 8086是一个16位的CPU。CPU内部结构如下图这里写图片描述
可以看到,在CPU内部的数据总线是十六位的,但是8086外部的地址总线是20位的,也就是说8086的实际物理地址是1MB。在BIU区域存在一个地址加法器,地址线经过这个加法器之后从16位变成了20位。那么这个过程是如何实现的呢?这就是这篇博客的需要讲的。

正文

为什么要分段管理?

CPU内部的数据总线和段寄存器都是16位的,用他们做地址寄存器智能寻址64KB单元,但是8086的实际物理地址有1MB,如何解决这个问题呢?采用分段技术。

什么是分段技术?

将1MB的内存空间分成若干段,每一段的第一个地址称为段首址,并且用段首址来表示这一段的内存地址。段首址必须要能被16整除,为什么呢?这样的话,段首址就可以用16位来保存,低4位全部为零,高16位可放在段寄存器中。

介绍几个概念:

逻辑地址:逻辑地址是一对,包括段首址和偏移地址,如代码段表示为CS:IP。
偏移地址:相对于段首址的偏移量,放在 IP 寄存器里面。
物理地址:实际的内存地址,用20bit表示。
段首址用段寄存器来表示,包括CS(代码段)、DS(数据段)、SS(堆栈段)和ES(附加段)。偏移地址用 IP 来表示。如上图所示。
举个例子:如果一个内存地址(物理地址)为:2304AH,段首址为2304H。那么逻辑地址为:2304H:000AH。这一段内存的实际长度可以用偏移量表示,大小为0000H ~ FFFFH,也就是64KB。

那么逻辑地址是如何变成物理地址呢?这也就是前言中提到的问题。公式如下:
物理地址 = 对应寄存器 * 10H + 段内偏移量

还是刚刚那个例子,2304H * 10H = 23040H
23040H + 0000AH = 2304AH

结论

地址加法器就是进行这样一个运算:物理地址 = 对应寄存器 * 10H + 段内偏移量
对应寄存器指的是:CS、DS、SS、ES 寄存器里面的值,段内偏移量指的是IP寄存器里面的值。如此16的CPU可以寻址1MB的内存空间。

参考资料

微机原理与接口技术
8086存储机制
8086功能结构