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功能結構