版權聲明:您好,轉載請留下本人部落格的位址,謝謝 https://blog.csdn.net/hongbochen1223/article/details/44960383
intel 8086是16位的CPU,有着16位的寄存器,16位的資料總線和20位的位址總線。但由于其寄存器和資料總線都是16位,僅僅具有64kb的尋址能力,是以采用段+偏移的方式得到20位的即1M的尋址能力。則其計算公式為:
實體位址 = 段值 * 16 + 偏移。
也就是段值左移一位 + 偏移。 —其中,段值和偏移都是16位的
但80386開始,CPU進入32位時代,其具有32位位址線,是以尋址能力變為4G。尋址空間雖然變大了,但是依然采用“段:偏移”的形式,但是具體的政策卻發生了變化。
在實模式下,段值還可以看成是位址的一部分,段值僅僅就是左移一位,然後加上偏移位址就是實際的實體位址;但是在保護模式下,段值僅僅變成了一個索引,該索引指向一個資料結構的一個表項,表項記錄着段的基址,段界限,以及屬性等内容,該資料結構就是GDT。GDT中的一個表項就是段描述符(Descriptor)。
下面是段描述符的一個結構圖:
屬性的詳細了解:
(1):P:存在位
P=1 表示描述符對位址轉換是有效的,或者說該描述符所描述的段存在,即在記憶體中
P=0 表示描述符對位址轉換無效,即該段不存在,使用該描述符進行記憶體通路時會引起異常
(2):DPL: 描述符特權級(Descriptor privilege level).共2位。規定了描述段的特權級,用于特權檢查,以決定對該段能否通路。
(3):S: 描述符的類型
對于存儲段描述符,S=1系統段描述符和門描述符,S=0
(4):TYPE: 說明存儲段描述符所描述的存儲段的具體屬性
(5):G: 段界限粒度位(Granularity)
G=0: 表示段界限粒度位位元組
G=1: 表示段界限粒度為4k位元組
注意:界限粒度位隻對段界限有效,對段基址是無效的,段基址總是以位元組為機關。
(6): D位
D位是一個很特殊的位,在描述可執行段、向下擴充資料段或由SS寄存器尋址的段(通常是堆棧段)的三種描述符中的意義各不相同。
⑴ 在描述可執行段的描述符中,D位決定了指令使用的位址及操作數所預設的大小。
① D=1表示預設情況下指令使用32位位址及32位或8位操作數,這樣的代碼段也稱為32位代碼段;
② D=0 表示預設情況下,使用16位位址及16位或8位操作數,這樣的代碼段也稱為16位代碼段,它與80286相容。可以使用位址大小字首和操作數大小字首分别改變預設的位址或操作數的大小。
⑵ 在向下擴充資料段的描述符中,D位決定段的上部邊界。
① D=1表示段的上部界限為4G;
② D=0表示段的上部界限為64K,這是為了與80286相容。
⑶ 在描述由SS寄存器尋址的段描述符中,D位決定隐式的堆棧通路指令(如PUSH和POP指令)使用何種堆棧指針寄存器。
② D=1表示使用32位堆棧指針寄存器ESP;
② D=0表示使用16位堆棧指針寄存器SP,這與80286相容。
(7):AVL:軟體可利用位
下面學習一下段選擇子,首先段選擇子不是剛剛所說的那個索引,段選擇子為16為,其中13位為描述符索引,一位TI位,兩位RPL位。
TI:(table Indicator): 引用描述符表訓示位
TI = 0 : 訓示從全局描述符表GDT中讀取描述符
TI =1:訓示從局部描述符表LDT中讀取描述符
RPL(requested Privilege level): 請求特權級,用于特權檢查
現在使用一張圖描述一下段存儲機制的尋址過程。