x86記憶體區段
維基百科,自由的 encyclopedia
x86架構中,記憶體區段(英語:Memory Segmentation)是在不改變16位元段選擇子時,使用單個索引暫存器(儲存了段內地址偏移值)所能夠定址的的記憶體範圍部份。也指在英特爾x86指令集體系結構下記憶體區段的實現方式。
從8086開始到隨後的各款x86架構CPU,無論是真實模式還是保護模式,記憶體定址時都使用16位元段暫存器(segment register)。段暫存器預設使用情況為:
- 代碼段暫存器CS與暫存器IP相配合獲得當前線程代碼執行到的記憶體位置;
- 數據段暫存器DS與各通用暫存器配合訪問記憶體中的數據;
- 棧段暫存器SS與暫存器(E)SP、(E)BP配合訪問線程的呼叫棧(call stack);
- 擴充段暫存器ES用於特定字串指令(如MOVS或CMPS)。
- 80386引入了2個額外的段暫存器FS與GS,並無特定的硬件用途。
這些段暫存器除了有16位元的可見部分,還有不可見的隱藏部分,稱為描述符快取「descriptor cache」或隱藏暫存器「shadow register」[1]。當一個段選擇子(segment selector)裝入段暫存器的可見部分,處理器同時也把該段描述符的其它數據裝入到段暫存器的隱藏部分,這包括段開始的基地址、段長度、訪問控制資訊等。這些資訊快取到段暫存器中,避免了處理器在轉址(translate address)時花費額外的匯流排周期從段選擇子表中讀入數據。處理器指令中可以明示使用哪些段暫存器,這將替換掉預設使用的段暫存器。[2]