1. 程式人生 > >8086的記憶體分段機制 記憶體定址

8086的記憶體分段機制 記憶體定址

如圖,8086內部有8個16位暫存器,AX BX CX DX SI DI BP SP

為了加快指令執行速度,8086內部有一個6位元組的指令預取佇列,當處理器執行不需要訪問記憶體的指令時,指令預取部件訪問記憶體預取指令。

這裡寫圖片描述

8086有4個段暫存器 CS DS ES IP,當一段程式碼開始執行時,CS指向程式碼段的起始地址,IP指向段內偏移。CS:IP共同形成邏輯地址,並由匯流排介面部件來變換為實體地址來取得指令。

如果指令執行過程中需要訪問記憶體單元,處理器將用DS的值和指令中提供的偏移地址相加來形成記憶體所需的實體地址。

8086的段暫存器和IP暫存器都是16位的,定址空間 64KB,但是8086提供了20位地址線。1M記憶體,8086在形成實體地址時,先將段暫存器的內容左移4位,再同 16位的偏移地址相加。

保護模式下定址

  • 邏輯地址 :
    段識別符號:段內偏移量
  • 線性地址:
    是邏輯地址到實體地址變換之間的中間層。程式程式碼會產生邏輯地址,或說是段中的偏移地址,加上相應段的基地址就生成了一個線性地址。如果啟用了分頁機制,那麼線性地址能再經變換以產生一個實體地址。若沒有啟用分頁機制,那麼線性地址直接就是實體地址。Intel 80386的線性地址空間容量為4G(2的32次方即32根地址匯流排定址)。

  • 實體地址:
    是指出目前CPU外部地址總線上的定址實體記憶體的地址訊號,是地址變換的最終結果地址。如果啟用了分頁機制,那麼線性地址會使用頁目錄和頁表中的項變換成實體地址。如果沒有啟用分頁機制,那麼線性地址就直接成為實體地址了,比如在真實模式下。

段機制例項分析

CPU的段機制提供一種手段可以將系統的記憶體空間劃分為一個個較小的受保護的區域,每個區域為一個段。相對32位系統,也就是把4G的邏輯地址空間換分成不同的段。每個段都有自己的起始地址(基地址),邊界和訪問許可權等屬性。實現段機制的一個重要資料結構就是段描述符。

這裡寫圖片描述

從圖中可知,邏輯地址到線性地址的轉換,先是通過段選擇符從描述符表中找到段描述符,把段描述符和偏移地址相加得到線性地址。也就是說要想得到段描述符需要三個條件:

1. 得到段選擇符。
2. 得到段描述符表
3. 從段描述符表中找到段描述符的索引定位段描述符。

前面我們提到了段描述符 + 偏移地址,並沒有提段選擇符和段描述符表。所以我們要弄清楚這幾個觀念段選擇符,段描述符表,段描述符,以及如何才能得到這幾個描述符?
這裡寫圖片描述