X86-64

**x86-64**（又稱 **x64**，即英文詞 **64**-bit e**x**tended，64 位元拓展的簡寫）是一個處理器的指令集架構，基於 x86 架構的 64 位元拓展，向後相容於 16 位元及 32 位元的 x86 架構。x64 於 1999 年由 AMD 設計，AMD 首次公開 64 位元集以擴充給 x86，稱為「**AMD64**」。其後也為英特爾所採用，現時英特爾稱之為「**Intel 64**」，在之前曾使用過「Clackamas Technology」 (CT)、「IA-32e」及「EM64T」。

蘋果公司和 RPM 套件管理員以「x86-64」或「x86\_64」稱呼此 64 位元架構。甲骨文公司及 Microsoft 稱之為「x64」。BSD 家族及其他 Linux 發行版則使用「amd64」，32 位元版本則稱為「i386」（或 i486/586/686），Arch Linux 及其衍生發行版用 x86\_64 稱呼此 64 位元架構。

## AMD64

**AMD64** 指令集被應用在 Athlon 64、Athlon 64 FX、Athlon 64 X2、Turion 64、Turion 64 X2、Opteron、Sempron、Phenom、Athlon II、Phenom II、AMD APU、AMD FX、AMD Ryzen、AMD Epyc 等處理器上。

### 架構特色

在 x86-64 出現以前，英特爾與惠普聯合設計出 IA-64 架構；惟 IA-64 並不與 x86 相容，且市場反應較冷淡，同時受制於多個專利權，使其他廠商不能模仿，規模沒有很大。與 x86 相容的 AMD64 架構便應運而生，其主要特點如名稱所述，既有支援 64 位元通用暫存器、64 位元整數及邏輯運算、以及 64 位元虛擬位址，設計人員又為架構作出不少改進，部份重大改變如下：

* 新增暫存器
* 位址闊度加長
* SSE2、SSE3 指令
* NX 位元：AMD64 其中一個特色是擁有「禁止執行」（No-Execute）的位元，可在一定程度上防止蠕蟲病毒以緩衝區溢位的方式來進行攻擊。

### 市場分析

AMD64 代表 AMD 放棄了跟隨 Intel 標準的一貫作風，選擇了像把 16 位元的 Intel 8086 擴充成 32 位元的 80386 般，去把 x86 架構擴充成 64 位元版本，且相容原有標準，沒想到比 Intel 自己發表的 64 位元架構還要被認同。因為 AMD64 架構在 IA-32 上新增了 64 位元暫存器，並相容早期的 16 位元和 32 位元軟體，可使現有以 x86 為物件的編譯器容易轉為 AMD64 版本。除此之外，NX bit 也是引人注目的特色之一。

不少人認為，像 DEC Alpha 般的 64 位元 RISC 晶片，最終會取代現有過時及多變的 x86 架構。但事實上，為 x86 系統而設的應用軟體實在太龐大，成為 Alpha 不能取代 x86 的主要原因，AMD64 能有效地把 x86 架構移至 64 位元的環境，並且能相容原有的 x86 應用程式，顯然得到了多數開發者的歡迎。

## Intel 64

**Intel 64** 指令集被應用於 Pentium 4、Pentium D、Pentium Extreme Edition、Celeron、Xeon、Pentium Dual-Core、Intel Core 2、Intel Core i3、Intel Core i5、Intel Core i7 及 Intel Core i9 處理器上。

### 概要

Intel 64 計劃的歷史可謂相當長及複雜，其原因主要是因為 Intel 自身的內政問題。該計劃開始時，其代號為「Yamhill」，不過 Intel 一直對外宣稱其計劃不存在；至 2004 年初，Intel 才改口承認，並把代號改為 CT（Clackamas Technology）。在宣佈 CT 計劃的數個星期內，Intel 為計劃給予多個新名稱。在 2004 年春季的 Intel 開發者論壇後，Intel 將之命名為「IA-32E」，意即 IA-32 的延伸；在數星期後，才改稱為 EM64T。

Intel 曾長時間把該計劃保持機密，其原因有以下兩點。第一，Intel 不想給客戶混淆資訊，把未來 Itanium IA-64 處理器的展望與 x86 混為一談；但在 Intel 眼見使用 AMD64 的 Opteron 及 Athlon 64 取得成功，便需要對競爭者的威脅作出迎擊。而第二個原因，是 Intel 為了自身的面子，必然不會承認使用了對手 AMD 的技術，因此 Intel 把該技術以 EM64T 這個名字來推出，雖然核心與 AMD64 幾乎相同，猶如一對孿生兄弟，但如果 Intel 使用了 AMD64 這名字，等於在幫對手做廣告宣傳。在以往 Intel 的行銷中，Intel 總把 AMD 的產品貶為自家技術的仿製品；不過這回 AMD 率先開發民用 64 位元技術，Intel 需要反過來吸納 AMD 的技術，使 Intel 在研發 x86 處理器技術的領導地位受到重挫，因此 Intel 在造勢方面便需要使用更多的人力物力。Intel 主席 Craig Barrett 之後也承認，在保密方面，這個機密算是保護得最差的。

在 Intel 64（EM64T）的檔案中，對於其指令集的起源隻字不提；因此有媒體為它起了「iAMD64」這個別名，諷刺 Intel 在迎擊 AMD 的民用 64 位元技術上，使用了 AMD 的技術，直接把 AMD64 吸納過來，並以新名重新包裝使用。後來 Intel 索性將此技術正式命名為 **Intel 64**。

### 架構特色

Intel 64 可使處理器直接存取超過 4GB 的記憶體，容許執行更大的應用程式。而 **x86-64** 架構也加入了額外的暫存器及其他改良在指令集上。透過 64 位元的記憶體位址上限，其理論記憶體大小上限達 16,777,216TB（16EB），不過在初期的應用上並未能支援完整的 64 位元位址。

Intel 在之前已在 Itanium 處理器上使用了自家的 64 位元 IA-64 技術，雖然說 Intel 64 也是 64 位元，但兩者並不相容，即 IA-64 的軟體不能直接在 Intel 64 上執行。Intel 64 所用的 x86-64 是 IA-32 指令集的延伸，而 IA-64 則是另一款獨立的架構，沒有任何 IA-32 的影子。雖然 IA-64 可透過類比來執行 IA-32 的指令，但指令在執行前需經轉換，才能在 IA-64 上執行，導致其速度變慢。由於 x86-64 是從 IA-32 衍生而來，因此執行 IA-32 與 64 位元程式的表現也顯得綽綽有餘。

首顆使用 Intel 64 技術的處理器屬於 Xeon 型號，支援雙處理器，其核心名稱為 Nocona。由於 Xeon 是直接建基於桌上型 Pentium 4 的架構上，因此 Pentium 4 主機板也可使用 Intel 64，如使用超執行緒（Hyper-Threading）等。不過 Intel 64 在初期的 Prescott 版本尚未啟用，其原因大概是當時其尚未完善。在使用 Prescott 核心 E0 更新版本的 Pentium 4 處理器已可使用 Intel 64，被稱為 Pentium 4 F。再者，E0 更新版本加入了「禁止執行」位元，稱為 XD bit（eXecute Disable），相當於 AMD64 的 NX bit。

## VIA x86-64

VIA 在 Centaur 研發部門五年的研發後，發布了其第一款 x86-64 改進架構，微架構研發代號 "Isaiah", 而 64 位元微架構於 2008 年 1 月 24 日首次展示，並在 5 月 29 日以 VIA Nano 品牌發布產品。

該處理器支援一類 VIA 專為提高低功率應用情景下的效率而研發的 x86 擴充指令集。
Isaiah 微架構預計與前一代架構 Esther 相比，同時脈頻率下，在整數運算表現上會有兩倍提效能提升升， 浮點運算上會有四倍效能提升。而在功耗上，處理器 TDP 設定為 5 W 到 25 W。
此外，對於前代產品 VIA C7 系列尚不支援的 x86 虛擬化技術，該架構也作了支援，同時也保留了加密擴充。

## 虛擬位址空間的細節

儘管虛擬位址有 64 位元的寬度，但目前的實現機制（以及任何已知處在計劃階段的晶片）並不允許整個 16EB 的虛擬位址空間都被使用。大多數的作業系統和應用程式在可見的未來都用不到如此巨大的位址空間（比如，Windows 在 AMD64 上的實現僅應用了 256TB，即 48 位元的寬度），所以實現如此巨大的位址寬度只會增加系統的複雜度和位址轉換的成本，帶不來任何好處。AMD 因此決定，在對這一架構的首次實現中，只有虛擬位址的最低 48 位元才會在位址轉換（頁表查詢）時被使用。但是，任何虛擬位址的 48 位元至 63 位必須與 47 位一致（按照符號位擴展的方式），否則處理器將會報告一個異常。符合這一規則的位址被稱作「傳統格式」。傳統格式將從 0 至 00007FFF`FFFFFFFF，以及從 FFFF8000`00000000 至 FFFFFFFF`FFFFFFFF 總計 256TB 的位址範圍作為可以使用的虛擬位址空間。

這種「古怪」的規則為日後擴展到真正的 64 位元尋址保留了一個重要的特性：很多的作業系統（包括但不限於 Windows NT 系列）將位址空間的高半部分（被稱作核心空間）留給自己，將低半部分（使用者空間）留給應用程式碼、使用者態棧、堆和其他數據區。這種「傳統位址」的設計保證了每一個符合 AMD64 的實現都擁有兩個記憶體片段：低半段從 00000000`00000000 開始，隨著更多的虛擬位址位元變得可用而「向上生長」；高半部分被「懸掛」在位址空間的頂部而「向下生長」。同樣，將未被使用的位址位元內容固定下來防止被作業系統用作標誌位、特權級標號等其他用途，是爲了避免當架構擴展至 52, 56, 60 和 64 位元的時候出現問題。

64 位元尋址模式（長模式），是實體位址擴展（PAE）的超集；因此，記憶體分頁大小可以是 4KB，2MB，或 1GB。但是，與系統在 PAE 模式下使用的三級分頁表機制不同，長模式下系統使用四級分頁表：PAE 的頁目錄指針表的表項從 4 個擴展到了 512 個，而且附加了一個第四級頁面對映表（Page-Map Level 4 Table，PML4 Table），包含 512 個採用 48 位元實現的表項。整個 48 位元位址空間的 4KB 頁面完整對映層級將會占據略多於 512GB 的記憶體（256TB 虛擬位址空間的 0.196%）。在提供更大虛擬位址的實現中，這個表被一個更高的對映層級所對映，即第五級頁面對映表（PML5），可以提供 52 位實體位址（4PiB）和 57 位虛擬位址（128PiB）的實現。

## 執行模式

## 作業系統支援

以下作業系統均支援長模式（long mode）的 x86-64 架構。

### DOS

在 DOS 環境下可透過 DOS Extender（例如 DOS4GW）來進入保護模式。

### FreeBSD

FreeBSD 在 5.1 正式版曾為 x86-64 作試驗，至 6.0 正式版解決了在 x86-64 執行 32 位元程式出現的一些問題，以及能支援不少驅動程式。

### Linux

Linux 在 2.6 版本的核心開始加入長模式，支援 x86-64，能相容 32 位元程式及類比 32 位元系統，容許在 32 位元的環境下，把程式編譯為 64 位元版本。

### macOS

Mac OS X 10.6 _Snow Leopard_ 開始提供 64 位元核心，並可以在部分處理器上打開 64 位元核心。64 位元核心只支援 64 位元的核心擴充，反之亦然；但對於普通應用程式，無論 32 位元或 64 位元核心均可以支援兩種位寬的應用程式，但 32 位元程式只能使用 4GB 的記憶體空間 。

Mac OS X 10.5 _Leopard_ 在 Intel 與 PowerPC 上提供對 Cocoa, Quartz, OpenGL 與 X11 的 GUI 程式的 64 位元支援，並支援全部的命令列庫和程式。但核心仍只有 32 位元版本。

Mac OS X 使用通用二進位檔案格式將 32 位元和 64 位元程式和庫代碼包裝在同一檔案中，在載入時自動選擇最合適的版本。在 Mac OS X 10.6 中，核心和核心擴充也使用通用二進位格式以同時支援兩種構架。

蘋果公司於 2018 年 4 月起，在 macOS High Sierra 作業系統內執行 32 位元應用程式時，會提醒訊息。並已在 2018 年 6 月的 WWDC 上宣佈 macOS Mojave 將是最後一版支援 32 位元應用程式的 macOS。

### MenuetOS

x86-64 版本的 MenuetOS 系統於 2005 年 6 月推出，雖然原有的 32 位元版本 Menuet 以 GPL 授權，但 x86-64 版本則維持專屬，並以免費軟體方式發佈，以及提供部分元件的原始碼。

### NetBSD

x86-64 版本的 NetBSD 最早於 2001 年 6 月 19 日被提出，至 2004 年 12 月 9 日推出的 NetBSD 2.0 已能完全支援 x86-64。

### OpenBSD

OpenBSD 自 2004 年 5 月 1 日推出的 3.5 版起，已支援 x86-64。

### Solaris

昇陽的 Solaris 自版本 10 開始已支援 x86-64。

### Windows

供使用者端使用的 Windows XP Professional x64 Edition 以及供伺服器使用的 Windows Server 2003 x64 Edition 均已於 2005 年 3 月推出。Windows Vista、Windows Server 2008、Windows Server 2012、Windows Server 2012 R2、Windows Server 2016、Windows Server 2019、Windows 7、Windows 8、Windows 8.1 以及 Windows 10 均有對應的 64 位元版本。從 Windows Server 2008 R2 開始的 Windows Server 作業系統只提供 64 位元版本，從 Windows 11 開始的面向消費者的 Windows 作業系統只提供 64 位元版本。

## 業界稱謂慣例

由於 AMD64 和 Intel64 基本上一致，很多軟硬體產品都使用一種不傾向任何一方的詞彙來表明它們對兩種架構的同時相容。出於這個目的，AMD 對這種 CPU 架構的原始稱呼 ——「x86-64」被不時地使用，還有變體「x86\_64」。其他公司如微軟和昇陽電腦在行銷資料中使用「x64」作為對「x86-64」的縮寫。

許多作業系統及產品，尤其那些是在 Intel 進入這塊市場之前就引入「x86-64」支援的，使用「AMD64」或「amd64」同時指代 AMD64 和 Intel64。

* BSD 系統（如 FreeBSD、NetBSD 和 OpenBSD）和一些 Linux 發行版（如 Debian、Ubuntu、和 Gentoo）將 AMD64 和 Intel64 都稱作「amd64」。Red Hat 的 RPM 將 x86-64 稱為 x86\_64 或 x86-64，將 32 位元的 IA-32 稱為 i\*86（\* 為數字 3-6，比如 i386）。Arch Linux 將 x86-64 稱為 x86\_64。
* Fedora PackageKit 稱 64 位元架構為「x86\_64」。
* Java Development Kit（JDK）：包含 x86-64 檔案的目錄命名為「amd64」。
* Mac OS X：終端下的命令 arch 以及開發人員文件都表明蘋果稱 64 位元架構為「x86\_64」。
* Microsoft Windows：稱在 IA-32 處理器上使用 64 位元技術為「x64」，但一些相關目錄使用 AMD64 來標明。例如，Windows x64 版安裝 CD 上的系統目錄命名為「AMD64」，而 32 位元版本上用「i386」。
* Solaris：作業系統的命令 isalist 將 AMD64 和 Intel64 都定義成「amd64」。

## 應用產品

以下處理器產品使用了 x86-64 技術，截至 2018 年 9 月，幾乎等同於市場上所有消費級產品皆使用 x86-64 技術。

* AMD K8 (AMD64) 微處理器架構
  * AMD Athlon 64
  * AMD Athlon 64 X2
  * AMD Athlon 64 FX
  * AMD Opteron
  * AMD Turion 64
  * AMD Sempron（限使用 E6 步進以後的 Palermo、全數 Manila 型號和全數 Sparta 型號）
* AMD K10 微處理器架構
  * AMD Phenom
  * AMD Athlon
  * AMD Sempron
* AMD 推土機微處理器架構
  * AMD FX-Series
* AMD Fusion (APU)
  * AMD Bobcat 微處理器架構的 CPU 核心
    * AMD Ontario
    * AMD Zacate
  * AMD K10 微處理器架構的 CPU 核心
    * AMD Llano
* AMD Ryzen
* Intel NetBurst (Intel 64)
  * Intel Xeon（自 "Nocona" 起的部分型號）
  * Celeron D（自 "Prescott" 起的部分型號）
  * Pentium 4（自 "Prescott" 起的部分型號）
  * Pentium D
  * Pentium Extreme Edition
* Intel Core 微處理器架構
  * Intel Xeon ("Woodcrest")
  * Intel Core 2
  * Intel Pentium Dual-Core
  * Intel Celeron
* Intel Nehalem 微處理器架構
  * Intel Xeon
  * Intel Core i7
  * Intel Core i5
  * Intel Core i3
  * Intel Pentium
  * Intel Celeron
* Intel Sandy Bridge 微處理器架構
  * Intel Xeon
  * Intel Core i7
  * Intel Core i5
  * Intel Core i3
  * Intel Pentium
  * Intel Celeron
* Intel Ivy Bridge 微處理器架構
  * Intel Xeon
  * Intel Core i7
  * Intel Core i5
  * Intel Core i3
  * Intel Pentium
  * Intel Celeron
* Intel Haswell 微處理器架構
  * Intel Xeon
  * Intel Core i7
  * Intel Core i5
  * Intel Core i3
  * Intel Pentium
  * Intel Celeron
* Intel Broadwell 微處理器架構
  * Intel Xeon
  * Intel Core i7
  * Intel Core i5
  * Intel Core i3
* Intel Skylake 微處理器架構
  * Intel Xeon
  * Intel Core i9
  * Intel Core i7
  * Intel Core i5
  * Intel Core i3
  * Intel Pentium
  * Intel Celeron
* Intel Kaby Lake 微處理器架構
  * Intel Xeon
  * Intel Core i9
  * Intel Core i7
  * Intel Core i5
  * Intel Core i3
  * Intel Pentium
  * Intel Celeron
* Intel Coffee Lake 微處理器架構
  * Intel Xeon
  * Intel Core i9
  * Intel Core i7
  * Intel Core i5
  * Intel Core i3
  * Intel Pentium
  * Intel Celeron
* Intel Atom (部分)
* VIA / 兆芯
  * VIA Nano
  * ZX-C 系列
  * ZX-C+ 系列
  * KX-5000 系列
  * KX-6000 系列
  * KH-20000 系列
  * KH-30000 系列

## 參考文獻

## 參見

* NX bit
* AMD K8
* AMD K10（由於 K9 在英語發音上不好聽（Canine，狗類），因此 AMD 在 K8 代號後，直接使用 K10 為代號）
* IA-64
* x86

## 外部連結

* AMD Developer Guides & Manuals
* Intel 64 and IA-32 Architectures Software Developer Manuals （頁面存檔備份，存於網際網路檔案館）