Windows on Arm 的 Arm64EC:舊 x64 外掛可逐步過渡
3C 產品

Windows on Arm 的 Arm64EC:舊 x64 外掛可逐步過渡

TechLab 編輯部(譯)·

Windows on Arm 的相容性不只在於把整個 x64 app 交給模擬器執行。Microsoft 的 Arm64EC 機制容許同一個 process 內,同時運行原生 Arm 程式碼及經模擬的 x64 程式碼。對正逐步移植到 Arm、但仍要載入第三方舊 DLL 的開發者而言,這是務實的過渡路徑。

最受影響的是依賴插件生態的軟件,例如 Office add-in、數碼音訊工作站的音訊外掛,以及企業內部長年沿用的 DLL。以往,主程式若要原生支援 Arm,往往要等所有會載入同一 process 的外掛一併移植;Arm64EC 則讓主程式部分改為原生 Arm,而未改寫的 x64 外掛仍可透過 Prism 模擬運行。XDA 引述 Microsoft 的說法指,64-bit Office for Arm 正是此類做法的例子。

Arm64EC 實際是甚麼

Arm64EC 的 EC 意指「Emulation Compatible」。它是一套由 Microsoft 為 Windows 設計的 ABI,即已編譯程式之間傳遞參數、安排記憶體資料結構及呼叫函式的規則。

Arm64EC 指令本身是原生 Arm64 指令,由 Arm CPU 直接執行;但它在資料結構與部分軟件慣例上配合 x64。這令既有 x64 元件較容易與已移植的程式碼共存。系統層面知道其真實架構,工作管理員會顯示為「ARM64(x64 compatible)」;但部分舊有架構偵測會把 Arm64EC 視為 x64,開發者不應只憑單一架構檢查結果判斷相容性。

這個安排只針對 64-bit x64。32-bit x86 app 仍要走既有的 WOW64 模擬層,不能因為採用 Arm64EC 而自動取得同樣的混合能力。

為何可減少「全部重寫」壓力

不同架構對函式參數放在哪些 CPU register 有不同規則。當 Arm64EC 程式碼與 x64 程式碼互相呼叫時,Windows 以稱為 thunk 的小段轉接程式重新排列參數;如呼叫目標要到執行時才知道,系統還會經過 call checker 判斷應直接以 Arm 執行,還是轉交 x64 模擬器。

因此,程式可先把自己能控制的核心模組編譯成 Arm64EC,保留無法即時替換的 x64 外掛。這不代表外掛已原生化,但可把移植工作拆開處理,降低插件供應商同步更新的壓力。對採購 Windows on Arm PC、但工作流程綁定舊插件的機構,評估重點便由「軟件有沒有 Arm 版」延伸至「插件是否必須在同一 process 載入」。

相容性有成本,也有邊界

Arm64EC 並非零成本。為維持與 x64 的執行狀態及資料配置兼容,它不能使用所有 Arm64 register;間接呼叫亦要先做架構檢查。兩端都是 Arm64EC 時,直接呼叫可按一般 Arm 方式執行;若跨到 x64 元件,則要經轉接與模擬,性能表現會取決於實際呼叫頻率和工作負載。

另一個限制是它屬於 Microsoft 的 Windows 設計,並非 Arm 通用標準。XDA 指出,LLVM 已支援相關目標,Rust 提供 Tier 2 target,但 GCC 似乎仍未有 Arm64EC 支援。這表示工具鏈選擇本身,可能成為企業舊有建置流程的限制。

Microsoft 另有 Arm64X 檔案格式,可把一般 Arm64 與 Arm64EC 程式碼放在同一檔案內,供不同類型的 process 載入。不過一般 app 開發者首先要釐清的,仍是主程式、每個 DLL 及其載入方式,而非只看最終 EXE 的標籤。

與 Rosetta 2 的差別在 process 邊界

XDA 報道引述 Apple 文件指出,macOS 不容許 arm64 與 x86_64 程式碼混在同一個 process;Rosetta 翻譯會套用至整個 process 及其動態載入的模組。若原生 Arm app 嘗試載入 Intel-only plugin,系統會報錯。

macOS 可用獨立 process 配合 XPC 等方式,讓不同架構的元件協作,但這與同一 process 內混合執行是兩回事。對 Windows 而言,Arm64EC 的價值正是在保留同一 process 插件模式,令歷史包袱較重的桌面軟件可逐段移植;代價則是更複雜的 ABI 與相容層。

開發者可先做的檢查

  • 列出 app 會在同一 process 載入的 DLL、add-in 與音訊外掛,分辨哪些由團隊控制、哪些屬第三方。
  • 在 Windows on Arm 測試環境中,查看工作管理員的架構標示;「ARM64(x64 compatible)」代表 Arm64EC,不應誤當成純 x64 或純 Arm64。
  • 檢查原有程式有否以架構宏或檔案標頭作硬性判斷。Arm64EC 為兼容舊軟件,可能在部分檢查中呈現為 x64。
  • 對高頻插件呼叫、間接函式呼叫及 JIT runtime 做實際測試;這些位置較可能受轉接與模擬開銷影響。

下一步值得觀察的是,更多常用第三方 DLL 會否提供原生 Arm64 或 Arm64EC 版本。只要關鍵外掛仍只有 x64,Arm64EC 仍是可行的緩衝方案;當外掛鏈逐步原生化,Windows on Arm 才能更少依賴這層兼容設計。

延伸閱讀

AI 輔助說明: 本文由 AI 協助整理,並經兩輪獨立自動品質審核;資料及連結仍以原始來源為準。


參考來源

本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。

分享:WhatsAppThreadsTelegramFacebook