創用 CC 授權


<aside> ©️ Creative Commons License

This work by kdotwei January 1, 2026 is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

</aside>

<aside> <img src="/icons/chat_lightgray.svg" alt="/icons/chat_lightgray.svg" width="40px" />

筆者補充 - 閱前宣導

當章節內容大部分來自參考源,本教材就不會撰寫內容,而會直接附上參考源。尤其是參考教科書內容,以免版權糾紛。

</aside>

目錄


模擬(Emulation)


模擬(Emulation)是一種在軟體中模擬電腦硬體的技術。當程式或作業系統是為了某個平台製作的,卻需要在另一個完全不同的平台上執行時,就需要透過模擬來執行。例如,在 x86 的電腦上跑 ARM 架構的 Android 等。


指令集模擬(Instruction-Set Emulation)

指令集模擬主要在指令集的翻譯(Translate),模擬器需要將系統想要執行的每一個機器指令,翻譯成目標指令集上的等效指令,相當於用軟體寫出一個完整的 CPU。


指令翻譯通常會付出巨大的效能代價,來源系統的一條指令,可能需要目標系統的數十條指令來完成。一個最直觀的例子,就是 x86 翻譯到 ARM 上,在上個篇章中我們提過 CISC 架構通常可以用一條指令完成許多任務,反之 RISC 架構的指令能完成的事情相當精簡,可以想像翻譯後指令數量會變多。不過在當今的模擬技術也有許多突破,使得翻譯過程的損失下降,我們稍後進行介紹。


模擬的使用場景

在現實世界中,大部分的選擇都是權衡,模擬技術的選擇也不例外。由於模擬技術的跨架構相容性,使得即使效能損失巨大,仍有使用的必要。最經典的例子就是 Apple 在將桌上型電腦從 IBM Power CPU 轉換到 Intel x86 CPU 時,製作了 Rosetta(I) 模擬器,讓編譯給 IBM Power CPU 的程式也能在 Intel CPU 上執行$^{\tiny\textbf{[5]}}$。


現代模擬技術

Apple 在推出 Apple Silicon M Series 時,再次推出了 Rosetta(這次叫做 Rosetta 2),讓原本編譯給 x86 的程式,也能在 M 系列 CPU(ARM)執行。Rosetta 2 相較於 Rosetta 有相當多的效能提升,讓我們來認識 Rosetta2 使用的主要技術 Just-in-Time(JIT)與 Ahead-of-Time(AOT)翻譯。


Ahead-of-Time, AOT

AOT 作為 Rosetta 2 的主要模式,大部分都是自動的,當 Rosetta 2 認為當前最合適的時候,就會進行翻譯,通常是安裝程式時,或首次啟動程式前。


Rosetta 2 會讀取已經編譯好的 x86 二進位檔(Binary/Executable File),將其翻譯成可執行的 ARM 指令,並將翻譯後的產物(Translated Artefacts)寫入儲存裝置。當程式執行時,Rosetta 2 Runtime 會查詢是否有可用的 AOT 翻譯。若有,會直接映射並執行已經翻譯的檔案$^{\tiny\textbf{[4]}}$。


Just-in-Time, JIT (輔助模式)

JIT 是 Rosetta 2 的輔助模式,發生在執行階段(Runtime)。當程式執行過程中動態產生程式碼,或系統在執行路徑(Execution Path)中發現 x86 物件(Object)時,控制權會交給 Rosetta,即時翻譯記憶體中 x86 的資料。