圖號 HS-2011-03 // 分割圖集存放庫示意圖
UPSTREAM: NotRexed/Hookshot (v2.0.11)無塵室 AOT 管線 // 10 個子系統

NotRexed/Hookshot GitHub 儲存庫架構與原始碼編譯指南

NotRexed/Hookshot 採用五層靜態重編譯管線架構,可將《薩爾達傳說:Ocarina of Time》的 Nintendo Switch 2 重製版(Title ID 0400486024DEC000 v131072)轉換為原生 x86_64 可執行檔。透過結合 nx2/ AArch64 轉 C 提升器、原生 Horizon OS SDK 22.2.8 執行階段(host/)、NVN2 API 231.40 命令串流記錄器,以及具備 Eden SM86 轉 SPIR-V 著色器降級轉換(gpu/vk/)的 Vulkan 1.3 網格著色器重放引擎,Hookshot 無需虛擬機即可直接以原生方式執行遊戲程式碼。

FIG 3.0 // MODULE CUTAWAYNotRexed/Hookshot · v2.0.14
NotRexed/Hookshot GitHub 儲存庫架構圖,展示 nx2/lift.py AArch64 提升至 C 分片、host/ Horizon OS HLE,以及 gpu/vk/ NVN2 轉 Vulkan 1.3 SPIR-V 著色器管線。
圖 3.0 — NotRexed/Hookshot 端對端 靜態重編譯 剖析圖:nx2/lift.py → work/sa/gen/*.c → hookshot.exe + hookshot_vk.dll
分割圖集 // 存放庫子系統目錄

五模組存放庫圖集與零件清單表(10 個子系統)

使用左側模組欄依架構分層(AOT Lifter、轉儲擷取、Build 與 Link System、作業系統與服務執行階段、圖形 API 前端、Vulkan 1.3 Renderer、Shader Recompiler、時間性畫質提升、Builder UI 及工具組)篩選 10 個經驗證的儲存庫子系統,或直接查閱下方的完整組件清單表。

子系統與層級儲存庫路徑語言與上游淵源產生的輸出成品工程職責與關聯
nx2/ 靜態重編譯 與 AArch64 LifterAOT Lifter
nx2/lift.py, nx2/insn.py, nx2/nso2.py, nx2/image.py
Python 3 (Capstone, Unicorn 2.1, LZ4, Zstandard)mkw-recomp (7336f0a) + Rexcomp a64-kit
work/sa/gen/*.c(約 1.4 GB,分布於 57 個 C 區塊,共 294,450 個函式)
在 0x80000000 載入含有 DT_RELR 重定位的 Switch 2 NSO 模組,解析跳躍表(1,475 個表),並將 17,668,191 條 ARMv8.2+ 指令(包含 UDOT)轉譯為 C。
nx2/nup.py 與 nx2/unpack.py 傾印擷取器傾印載入
nx2/nup.py, nx2/unpack.py, nx2/dump.py, third_party/zbic
Python 3 + C(Atmosphere ZBIC 解碼器)Hookshot / mkw-recomp
work/dump/exefs + work/dump/romfs(已解壓 26.2 GB)
驗證 0400486024DEC000 v131072 的七個 Switch 2 傾印訊號,解壓縮 .nup 封存檔,並解壓縮韌體 22.0.0+ 經 ZBIC 編碼的主要 NSO 二進位檔。
nx2/build.py 與 nx2/make_game.py Native 編譯器 DriverBuild 與 Link System
nx2/build.py, nx2/make_game.py, nx2/split_hot.py, nx2/pgo_pieces.py
Python 3 + Clang / LLD (llvm-mingw ucrt-x86_64)mkw-recomp + Hookshot split_hot PGO 管線
hookshot.exe (426 MB) / hookshot + image.bin
將作用頻繁的提昇程式碼分割至 8 個並行轉譯單元中,套用 LLVM 原始格式 11 PGO 分支設定檔,以 -O1 編譯冷分塊、以 -O2 編譯熱分塊,並連結為原生可執行檔。
host/ Native Horizon OS 與 SDK 22.2.8 HLE 執行階段OS 與服務執行時期
host/hos_main.c, host/hos_setjmp.c, host/nn_hid.c, host/nn_applet.c, host/posix/
C11 / Win32 與 POSIX Threads / Assembly經由 mkw-recomp 改編的 TOTKPort hos/
直接連結至 hookshot.exe / hookshot
在執行時期取代 485 nn:: SDK 邊界、預留 512 GB 客體虛擬位址空間、將 nn::os fiber 對應至原生 fiber,並處理檔案系統、音訊 (libopus) 及 HID 控制器。
host/nvn_native.c NVN2(API 231.40)命令記錄器圖形 API 前端
host/nvn_native.c, host/nvn2.c, gpu/render/rx_nvn.h
C11mkw-recomp NVN2 層
供 gpu/vk/ 使用的記憶體中 NVN2 操作串流
就地在客端記憶體上實作 Switch 2 NVN2 API 231.40 程序,在提交時擷取記憶體集區,並將命令緩衝區提交內容串流至 Vulkan 後端。
gpu/vk/ Vulkan 1.3 Backend 與 Queue Replay EngineVulkan 1.3 Renderer
gpu/vk/vk_main.cpp, gpu/vk/vk_replay.cpp, gpu/vk/vk_memory.cpp, gpu/vk/vk_draw.cpp, gpu/vk/vk_coopmat.cpp
C++20 (Vulkan 1.3, VMA, Dear ImGui)mkw-recomp gpu/vk + Hookshot OoT 修復
hookshot_vk.dll (Windows) / hookshot_vk.so (Linux)
以 VK_EXT_mesh_shader 在 Vulkan 1.3 上重放 NVN2 命令串流,遵循跨佇列 WaitEvent 同步,執行 HMMA f16 協同矩陣以進行 TAAU/過場動畫放大,並透過 write-back diffing 管理 VRAM 集區鏡像。
gpu/vk/eden/ Ampere SM86 轉 Maxwell 降階與 SPIR-V RecompilerShader Recompiler
gpu/vk/eden/, lower_to_maxwell.h, structured_control_flow.cpp
C++20 (Eden 著色器重編譯器 + sirit)Eden (Eglantine 組建 181) + Lichii 控制流修復
hookshot_programs.bin, hookshot_programs.idx, hookshot_pipelines.bin
將 10,154 個 Switch 2 Nin_Ounce_NVN2 Ampere SASS(SM86)著色器(含 249-GPR REGMAP_nx2 頂點/網格程式與任務著色器)降級為 Maxwell IR,並輸出 Vulkan SPIR-V。
gpu/vk/vk_dlss.cpp NVIDIA DLSS 與內建 AMD FSR 3.1 放大技術時間性放大與畫面生成
gpu/vk/vk_dlss.cpp, gpu/vk/vk_menu.cpp
C++20 (NVIDIA NGX SDK 310.9.16, AMD FidelityFX SDK 1.1.4)Hookshot 原生整合
內建 FSR 3.1 + 執行時期 nvngx_dlss.dll 載入器
攔截 OoT 的動態解析度抖動、動態向量與深度緩衝區,在所有 GPU 上驅動內建 AMD FSR 3.1,或在具備 nvngx_dlss.dll 時驅動選用的 NVIDIA DLSS 超高解析度 (Transformer 預設值 K/M/L)。
builder/ Hookshot Builder GUI (Windows WPF 與 Linux AppImage)玩家 Launcher 與 Builder UI
builder/HookshotBuilder.sln, scripts/linux/appimage.sh
C# (Windows 上為 .NET 8 WPF) / Linux 上為 Shell 與 PythonHookshot 第一方建置器
HookshotBuilder.exe / Hookshot-x86_64.AppImage
驗證使用者提供的 .nup 或 romfs+exefs 傾印檔,編排耗時 10 至 45 分鐘且不附帶受版權保護資產的單次本機 C 建置,並提供遊玩/Update 控制項目。
scripts/ 與 tests/ 存檔轉移工具、效能分析器與回歸測試套件工具鏈與驗證
scripts/oot_saves.py, scripts/prof.py, scripts/framelog.py, tests/run_all.py
Python 3 與 PowerShellHookshot 第一方工具
oot-save-backups/、CI 無遊戲資產回歸閘道
提供 Hookshot 與 Switch 2 模擬器(Lichii、Eglantine、Orchid、NX2navi)之間的雙向存檔移轉功能、1 毫秒堆疊取樣分析,以及無遊戲資產的原始碼回歸測試。
KPI-GH-01 // AOT LIFTER
17,668,191
已提昇的 ARMv8.2+ 指令數
160,641 個活躍遊戲函式(橫跨 57 個 C 區塊共計 294,450 個)
KPI-GH-02 // SHADER PIPELINE
10,154 → 8,243
NVN2 SM86 轉 SPIR-V Shaders
透過 gpu/vk/eden/ 降級(249-GPR REGMAP_nx2 + 網格/任務階段)
KPI-GH-03 // HLE BOUNDARIES
485 nn::
Horizon SDK 22.2.8 攔截點
512 GB 客體 VA 空間 + 原生 Win32/POSIX 光纖對應
KPI-GH-04 // PGO NATIVE LINK
426 MB
已編譯的 hookshot.exe 二進位檔
分割橫跨 8 個熱轉譯單元(-O2 + LLVM 格式 11 PGO)
原始碼編譯藍圖 //DEVELOPMENT.MD

如何從原始碼 Build NotRexed/Hookshot (Windows 與 Linux)

若協作者欲對提昇後的 C 區塊進行除錯,或在 gpu/vk/ 中修改 Vulkan 1.3 著色器,可直接從 git clone 執行四階段開發者建置管線。

階段 01 // DUMP 解包與 ZBIC 解碼

載入並驗證 Switch 2 傾印檔案(nx2/unpack.py)

驗證 Title ID 0400486024DEC000 v131072 (ExeFS main NSO SHA-1 字首 e0f3ccfa) 的七項傾印完整性訊號,解包 26.2 GB 的 RomFS 封存檔,並透過 third_party/zbic 解壓縮韌體 22.0.0+ 經 ZBIC 編碼的 NSO 區段。

python nx2/unpack.py --input <path-to-0400486024DEC000-v131072> --out work/dump
階段 02 // AArch64 至 C 靜態提昇

提昇 1766 萬條 ARMv8.2+ 指令(nx2/lift.py)

將 Switch 2 NSO 映像檔對應至客體基底 0x80000000,套用 DT_RELR 相對重定位,解析 1,475 個跳躍表,並在 57 個區塊中產生約 1.4 GB 的 C 程式碼 (拆分為 399 個帶有冷/熱 PGO 分離的編譯分片)。

python nx2/lift.py --dump work/dump --out work/sa/gen
階段 03 // 原生 CLANG 與 PGO 編譯

編譯提昇分片與 Link 主機執行階段 (nx2/make_game.py)

以 -O1 編譯冷 C 分片,並以帶有 LLVM raw 格式 11 分支設定檔權重的 -O2 編譯 8 個 split_hot.py 轉譯單元,接著使用 LLD 將它們與 host/hos_main.c 連結以產生 hookshot.exe (426 MB) 及 image.bin。

python nx2/make_game.py --jobs 8 --pgo
階段 04 // VULKAN 1.3 後端與迴歸測試套件

Build hookshot_vk 並執行無遊戲依賴測試 (tests/run_all.py)

將 gpu/vk/ (包含 Eden SM86 轉 Maxwell 著色器降階器、sirit SPIR-V 發射器、VMA 記憶體集區以及 FSR 3.1 / DLSS 掛鉤) 編譯至 hookshot_vk.dll / hookshot_vk.so,並驗證所有原始碼迴歸關卡。

cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release && cmake --build build && python tests/run_all.py
技術規範 // 提升器、HLE 執行階段與著色器重編譯

深入 nx2/ AArch64 Lifter 與 host/ Horizon OS SDK 22.2.8 執行階段

NotRexed/Hookshot 提昇器衍生自 mkw-recomp (commit 7336f0a) 與 Rexcomp 的 a64-kit,並專門針對依 Nintendo SDK 22.2.8 及韌體 22.0.0+ 編譯的 Switch 2 Ocarina of Time 重製版二進位檔進行擴充。由於韌體 22.0.0+ 會使用 ZBIC 壓縮 NSO 區段,因此 nx2/unpack.py 在客體位址 0x80000000 載入映像前會先整合 Atmosphere 的 ZBIC 解碼器。此提昇器會將 17,668,191 條 ARMv8.2+ 指令 (包括像 UDOT 這樣的 SIMD 點積指令) 轉譯為 C 函式,同時 nx2/split_hot.py 利用 LLVM 格式 11 PGO 設定檔將最熱門的執行路徑隔離至 8 個 -O2 轉譯單元,讓完整多核心建置可在 10 至 45 分鐘內完成。

在執行時期,host/hos_main.c 會保留一塊連續的 512 GB 虛擬位址區域,讓客體 64 位元指標可以最低額外負荷進行解參照。Hookshot 並未模擬 Horizon OS 核心,而是直接攔截 485 nn:: SDK 符號邊界——將 nn::os fiber 對應至原生 Win32 fiber 或 POSIX setjmp/ucontext 協程、將 nn::fs 讀取路徑導向解包後的 work/dump/romfs 目錄、透過 libopus 解碼環境與過場動畫音訊串流,並將 SDL3 遊戲手把/陀螺儀事件轉譯為 nn::hid 控制器狀態。

NVN2 (API 231.40) 命令 Replay 與 Eden SM86 轉 SPIR-V Shader 降階

Switch 2 遊戲透過目標為 NVIDIA Ampere SM86 硬體的 NVN2 (API 版本 231.40) 進行繪圖,具備專有的 Nin_Ounce_NVN2 著色器標頭與 249-GPR REGMAP_nx2 暫存器檔案。Hookshot 的 host/nvn_native.c 針對客體記憶體直接實作 NVN2 命令錄製,並將提交內容串流傳送至 hookshot_vk.dll / hookshot_vk.so。在 gpu/vk/eden/ 內部,Hookshot 採用 Eden 著色器重編譯器 (Eglantine 組建 181 搭配 Lichii 結構化控制流修復),將 10,154 個 Ampere SM86 SASS 二進位檔 (包含 task 與 mesh 著色器階段) 降階為 Maxwell IR,並發射標準 Vulkan 1.3 SPIR-V 模組 (在 hookshot_programs.bin 中快取了 8,243 個作用中的執行階段管線程式)。

此外,該重製版引擎在計算著色器中依賴 Ampere HMMA.1688.F16 張量指令進行時間性反鋸齒升採樣 (TAAU) 與預先渲染過場動畫解碼。當主機 GPU 支援時,Hookshot 的 gpu/vk/vk_coopmat.cpp 會將這些操作轉譯為 VK_KHR_cooperative_matrix,並在 gpu/vk/vk_dlss.cpp 中攔截引擎的抖動與動態向量,以驅動內建 AMD FSR 3.1 (FidelityFX SDK 1.1.4) 或選用的 NVIDIA DLSS 超高解析度 (NGX SDK 310.9.16)。

技術問答 // 常見技術解答

GitHub 架構與原始碼 Build FAQ

NotRexed/Hookshot 的上游溯源為何?

Hookshot 靜態提昇基於 mkw-recomp (commit 7336f0a) 與 Rexcomp 的 a64-kit 將 AArch64 轉譯為 C,其 Horizon OS HLE 執行階段填充層立足於 TOTKPort 的 hos/ 層,並採用 Eden (Eglantine 組建 181) + Lichii 著色器重編譯器將 Switch 2 Ampere SM86 著色器降階至 Vulkan 1.3 SPIR-V。

沒有 Switch 2 遊戲傾印檔也能執行 NotRexed/Hookshot 測試套件嗎?

可以。執行 python tests/run_all.py 會啟動無遊戲依賴的 CI 迴歸測試套件,該套件會驗證提升器指令語意、主機標頭打包檔(#990)以及 Vulkan 後端初始化,完全無需受版權保護的 RomFS 或 ExeFS 檔案。

為何編譯時會將 C 程式碼拆分為冷 (-O1) 與熱 (-O2) 區塊?

若將所有 294,450 個提昇函式 (跨 57 個區塊約 1.4 GB 的已產生 C) 全部以 -O2 編譯,將耗費數小時並耗盡系統 RAM。Hookshot 的 nx2/split_hot.py 會將執行頻率最高的函式隔離至 8 個熱轉譯單元中,使用 LLVM PGO 權重以 -O2 編譯,其餘冷區塊則以 -O1 編譯。

第一方存放庫實證

官方架構與開發文件來源