x86 與 x86-64 架構概觀

最後更新: 2021-10-30 22:12:19 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

x86 源自 Intel 的 16 位元 8086。80286 引入保護模式,IA-32 建立 32 位元程式設計模型與分頁,而 AMD64 將架構擴充至 64 位元執行。Intel 將合併架構稱為 Intel 64 與 IA-32;AMD 文件使用 AMD64。供應商名稱不會決定每項功能,因此軟體必須明確探索擴充功能。

位元組順序與運算元大小 #

x86 以位元組為單位定址記憶體,並以小端序儲存多位元組整數:最低有效位元組位於最低位址。對於從位址 p 開始的 32 位元值 0x12345678,記憶體內容為:

text
address    p     p+1   p+2   p+3
byte       78    56    34    12

架構術語將 16 位元值稱為字,32 位元值稱為雙字,64 位元值稱為四字,128 位元值稱為雙四字。這些名稱獨立於 C 實作的型別大小。

指令運算元大小取決於執行模式、前綴、操作碼,以及 REX、VEX 或 EVEX 欄位。在 64 位元模式中,許多整數指令仍預設使用 32 位元運算元;在支援的位置,REX.W 編碼會選取 64 位元。位址大小是獨立屬性,控制有效位址計算。

一般整數載入與儲存允許未對齊位址,但跨越快取行或頁面邊界可能增加延遲或改變錯誤行為。原子性保證取決於對齊、寬度、記憶體型別與指令,因此共用資料應符合架構的明確要求。

執行模式 #

重設後,x86 處理器會在實體位址模式啟動。韌體建立後續模式所需的表格與控制暫存器。

  • 實體位址模式使用 8086 風格的區段模型,不具備保護模式的權限強制。
  • 保護模式支援 16 或 32 位元程式碼與資料區段、描述元檢查、四個權限層級,以及可選的分頁。
  • 虛擬 8086 模式在作業系統控制下,將實模式風格的 8086 軟體作為保護模式工作執行。
  • 長模式包含 64 位元模式與相容模式。相容模式在 64 位元作業系統下執行受保護的 16 或 32 位元程式碼。
  • 系統管理模式是獨立的韌體環境,透過系統管理中斷進入,而不是應用程式執行模式。

在 64 位元模式中,一般位址產生會將 CS、DS、ES 與 SS 基底視為零,且不強制其傳統限制。FS 與 GS 保留可用基底,通常用於執行緒區域與每 CPU 狀態。即使平坦定址移除了大部分區段算術,描述元型別與權限檢查仍然重要。

邏輯、線性、虛擬與實體位址 #

Intel 術語將區段選取器加上偏移稱為邏輯位址。區段化會驗證存取並加入區段基底,產生線性位址。停用分頁時,線性位址會直接映射至實體位址,但仍受架構寬度與平台行為限制。啟用分頁時,頁表會將線性位址轉換為實體位址。

作業系統文件通常將程序可見的線性位址稱為虛擬位址。因此在分頁邊界,線性與虛擬可能指相同數值位址,但強調的是不同模型。虛擬化下的客體還可以加入從客體實體位址到主機實體記憶體的另一層轉換。

指令從基底與索引暫存器、縮放值及位移形成有效偏移。在 64 位元模式中,線性位址必須符合啟用的位址寬度之規範。非規範位址會在一般分頁轉換前引發錯誤。頁表接著套用存在、可寫、使用者/監督者、停用執行等權限。

例外、中斷與控制轉移 #

中斷描述元表將向量映射至閘道。處理器偵測的例外、軟體中斷指令與外部中斷都使用這些向量,但中斷控制器路由依平台而定。

例外慣例上分組如下:

  • 錯誤在架構完成前回報,修正後通常可重新啟動指令,例如頁面不存在錯誤。
  • 陷阱在觸發指令後回報,例如中斷點。
  • 中止回報通常無法可靠重新啟動的條件。

向量決定處理器是否推送錯誤碼,以及可用的儲存狀態。變更權限的閘道也會依工作狀態區段切換堆疊。軟體驗證目的地狀態後,使用 IRET 或系統呼叫專用回傳指令返回。

近距分支會在目前程式碼區段內變更指令指標。遠距轉移與閘道可以載入新的程式碼區段並執行額外檢查。SYSCALL/SYSRET 與 SYSENTER/SYSEXIT 提供較快速的已設定路徑,但其暫存器慣例屬於作業系統 ABI。

擴充功能與作業系統探索 #

CPUID 透過編號葉節點與子葉節點回報供應商識別、拓撲資訊、位址寬度、快取參數與功能位元。軟體必須先判定支援的最大葉節點,然後測試預計使用的每項功能。建立正確性後,家族或型號編號可以選取最佳化。

部分功能除了處理器支援外,還需要作業系統管理。對 AVX 系列狀態,軟體會檢查 CPUID 的 XSAVE 與 OSXSAVE,接著使用 XGETBV 確認作業系統已啟用所需的 XCR0 元件。AVX-512 與更新的狀態可能需要額外位元。相同原則適用於監督者功能;使用者可見的 CPUID 位元不會授予權限。

功能使用也必須考量 ABI 與部署原則。編譯器的基線目標可能不同於執行建置的機器,因此可攜式二進位檔會使用保守基線、函式多版本化或執行階段分派。

相關文章涵蓋指令編碼、指令家族、暫存器、記憶體組織與保護模式權限。

主要參考資料 #

評論

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