
GDTRGlobal Descriptor Table Register全局描述符表寄存器是 x86 處理器內(nèi)部的一個專用寄存器它的唯一職責(zé)就是告訴 CPU 全局描述符表GDT在哪里。形象地理解GDTR 相當(dāng)于存儲了 GDT 的“定位信息”讓 CPU 在任何時候都能根據(jù)其中的數(shù)據(jù)找到并訪問 GDT。核心功能存儲 GDT 的位置與大小GDTR 存儲了 GDT 兩個最關(guān)鍵的信息字段大小描述基地址Base Address32位保護模式/ 64位長模式GDT 在線性地址空間中的起始地址。界限Limit16位GDT 的字節(jié)大小減 1即 GDT 的最大有效偏移。如何加載和讀取 GDTRGDTR 的內(nèi)容由兩個專用指令控制指令功能特權(quán)級lgdt將內(nèi)存中的一個 6/10 字節(jié)數(shù)據(jù)加載到 GDTR從而設(shè)置 GDT 的基地址和界限。特權(quán)指令Ring 0sgdt將 GDTR 的當(dāng)前值存儲到內(nèi)存中用于讀取當(dāng)前的 GDT 信息??稍谌魏翁貦?quán)級下使用常用于調(diào)試與段選擇子Segment Selector的聯(lián)動當(dāng)執(zhí)行一條訪問內(nèi)存的指令時CPU 會這樣使用 GDTR查看段寄存器從CS、DS等段寄存器中讀取段選擇子一個 16 位的索引。計算偏移根據(jù)段選擇子中的索引值×8得到在 GDT 中的偏移量。獲取描述符將GDTR 中的基地址加上這個偏移量從 GDT 中讀取對應(yīng)的 8 字節(jié)段描述符。執(zhí)行檢查CPU 檢查描述符中的權(quán)限、段界限等確認無誤后才進行后續(xù)的內(nèi)存訪問。例如當(dāng)執(zhí)行mov ax, [0x1234]時如果DS寄存器指向 GDT 中的某個數(shù)據(jù)段CPU 就會依據(jù) GDTR 定位到該段描述符從而知道這個數(shù)據(jù)段的基地址、大小和權(quán)限。與 IDTR 的對比GDTR 和另一個寄存器IDTR中斷描述符表寄存器結(jié)構(gòu)非常相似但用途不同寄存器指向的表用途GDTRGDT全局描述符表管理內(nèi)存段分段機制IDTRIDT中斷描述符表管理中斷和異常處理程序它們都存儲一個“基地址界限”對lgdt/sgdt與lidt/sidt指令也一一對應(yīng)。重要注意事項無法直接訪問GDTR 不能像通用寄存器如rax那樣被指令直接讀寫只能通過lgdt和sgdt間接操作。特權(quán)級限制lgdt只能在最高特權(quán)級Ring 0執(zhí)行這是操作系統(tǒng)內(nèi)核的領(lǐng)地。普通應(yīng)用程序無權(quán)修改 GDTR。系統(tǒng)初始化在 x86 處理器上電后GDTR 有一個默認值但操作系統(tǒng)在進入保護模式前必須用lgdt加載自己定義的 GDT??偠灾瓽DTR 是 CPU 內(nèi)部的一個指針寄存器它存儲了 GDT 的內(nèi)存地址和大小是 x86 分段機制得以運行的基礎(chǔ)設(shè)施。