x86 架構暫存器

最後更新: 2024-07-28 09:42:04 +0800 +0800
tags: X86 | X86-64 | Assembly
原文以英文撰寫。您正在閱讀AI翻譯版本。

x86 架構暫存器保存程式設計師可見的整數、控制、狀態、位址轉譯、偵錯、浮點與向量狀態。寬度與可用性取決於執行模式與啟用的擴充功能。呼叫慣例會將軟體角色指派給其中一部分暫存器,但不會改變其架構行為。

通用暫存器與子暫存器 #

IA-32 暴露 EAX、EBX、ECX、EDX、ESI、EDI、EBP 與 ESP。x86-64 將它們擴展為 RAX 至 RSP,並新增 R8 至 R15。子暫存器命名同一架構暫存器的部分:

  • RAX 是 64 位元,EAX 是其低 32 位元,AX 是低 16 位元,而 AL 與 AH 命名 AX 的低與高位元組。
  • 在 64 位元模式寫入 32 位元目的地會清除高 32 位元。
  • 寫入 16 位元或 8 位元目的地會保留其他位元。
  • REX 前綴會讓 SPL、BPL、SIL 與 DIL 可用,但會阻止指令編碼 AH、BH、CH 或 DH。

RIP 是 64 位元指令指標,而 32 位元程式碼使用 EIP。一般 MOV 無法寫入它;分支、呼叫、返回、例外與中斷返回會改變控制流程。RSP 是目前堆疊指標。

函式邊界的暫存器用途來自 ABI。System V AMD64 使用 RDI、RSI、RDX、RCX、R8 與 R9 傳遞初始整數引數,而 Microsoft x64 使用 RCX、RDX、R8 與 R9。RBP 可以作為框架指標,但當 ABI 與 unwind 資訊允許時,也可以作為通用暫存器。Linux 系統呼叫使用另一套暫存器慣例,因此不得混淆函式呼叫與核心進入角色。

RFLAGS #

RFLAGS 擴展較舊的 EFLAGS 與 FLAGS 暫存器。常見算術狀態位元如下:

旗標意義
CF無號進位或借位
PF結果低位元組的偶數同位
AF傳統十進位操作的輔助進位
ZF結果為零
SF結果的符號位元
OF有號溢位

控制與系統位元包括:

  • DF,選擇字串指令的索引遞增或遞減。
  • IF,依權限與虛擬化規則控制可遮罩中斷的傳遞。
  • TF,要求在指令後觸發偵錯陷阱。
  • IOPL,參與連接埠 I/O 與選定的中斷控制檢查。
  • NT,在傳統保護模式中記錄巢狀硬體工作狀態。
  • RF、VM、AC、VIF、VIP 與 ID,其意義取決於模式與啟用的功能。

指令會定義它們寫入、保留或保持未定義的旗標。PUSHF/POPF、中斷進入與返回操作也會套用權限限制;軟體不能假設目前 CPL 可變更每個可見位元。

區段暫存器與隱藏描述元快取 #

CS、SS、DS、ES、FS 與 GS 具有可見選取器與隱藏描述元狀態。在保護模式中載入選取器會擷取描述元,並快取其基底、限制、型別與存取權。編輯描述元表不會更新已載入的快取。

在 64 位元模式中,一般位址產生會忽略 CS、SS、DS 與 ES 的基底與限制。FS 與 GS 保留透過模型特定暫存器或支援指令設定的 64 位元基底,作業系統使用它們處理執行緒本地與每 CPU 資料。選取器與描述元規則仍適用於架構指定的情況。

GDTR 與 IDTR 保存全域描述元表與中斷描述元表的線性基底及位元組限制。LDTR 與 TR 保存區域描述元表與工作狀態區段的選取器及快取描述元。LGDT、LIDT、LLDT 與 LTR 會在權限檢查下建立這些值。x86 保護模式與權限說明表格格式與轉換。

控制與系統暫存器 #

控制暫存器設定執行與位址轉譯:

  • CR0 包含保護模式、分頁、寫入保護、快取與選定數值狀態控制。
  • CR2 接收與分頁錯誤相關的線性位址。
  • CR3 選取分頁結構根,啟用 PCID 時也可以攜帶程序上下文識別碼。
  • CR4 啟用 PAE、全域頁面、作業系統管理的 SIMD 狀態、SMEP、SMAP 與支援時的保護金鑰等架構功能。
  • CR8 在 64 位元模式中控制外部中斷的工作優先級門檻。

模型特定暫存器(MSR)提供更多控制,包括用於長模式與不可執行啟用的 EFER、系統呼叫目標、FS/GS 基底、記憶體型別與效能監控。確切的 MSR 集合取決於模型,必須從廠商文件探索或選取。RDMSR 與 WRMSR 具特權。

偵錯暫存器 #

DR0 至 DR3 保存線性中斷點位址。DR7 啟用中斷點,並以支援的長度選取執行、寫入或資料存取條件。DR6 回報發生偵錯例外的原因。保留編碼與一般偵測行為取決於架構,因此偵錯器或核心必須在還原不受信任的偵錯狀態前清理值。

軟體中斷點會以 INT3 取代指令位元組。硬體偵錯暫存器避免變更程式碼,但只提供少量槽。偵錯例外會與單步執行、工作切換、虛擬化及交易式執行互動。

x87、MMX、SIMD 與遮罩暫存器 #

x87 浮點單元暴露八項暫存器堆疊,以及控制、狀態、標籤、指令指標與資料指標狀態。MMX 別名對應 x87 暫存器的低 64 位元儲存空間,因此傳統 MMX 程式碼在返回 x87 操作前會執行 EMMS。

SSE 引入 XMM 暫存器。AVX 將其低位儲存擴展為 YMM;AVX-512 將它擴展為 ZMM,並新增 K0 至 K7 的 opmask 暫存器。架構與模式決定可見暫存器數量。寫入傳統 SSE 目的地可能保留高位向量狀態,而 VEX 與 EVEX 編碼操作會套用其指定的高位清除行為。因此,在特定處理器上混合形式可能建立相依性或轉換成本。

MXCSR 控制 SIMD 浮點捨入、例外遮罩、狀態與非規範值處理。Opmask 暫存器控制 AVX-512 每 lane 的合併或歸零。其他擴充功能可以新增原始浮點儲存格式未表示的 tile 或其他狀態。

擴充狀態管理 #

FXSAVE 與 FXRSTOR 涵蓋 x87、MMX、SSE 與相關控制狀態。XSAVE 系列使用 XCR0、CPUID 列舉與元件點陣圖管理可擴充狀態區域。監督者元件可以使用額外的控制與儲存機制。

作業系統只能啟用它能安全初始化、儲存、還原與暴露的狀態元件。使用者軟體在執行 AVX 或後續指令前,會同時檢查處理器支援與作業系統啟用。上下文切換政策可以積極儲存狀態,或使用支援的最佳化,但每個執行緒可見的架構狀態必須保持隔離。

評論

在 GitHub 上閱讀或評論(發表評論需要登入)