【轉(zhuǎn)】蘋果的 Rosetta 2 的實現(xiàn)原理大概是怎樣的?
蘋果的 Rosetta 2 的實現(xiàn)原理大概是怎樣的?
是從x86匯編編譯到arm匯編嗎?
還是有其他的黑科技?
2 個回答

宋子明
不負責(zé)修電腦
沒有內(nèi)幕消息,也沒用過蘋果
設(shè)備,以下都是從網(wǎng)上搜索來的,結(jié)合了一些自己的分析。
Rosetta 2 可以將 x86 指令翻譯成 ARM 指令,支持 JIT(Just-In-Time)和 AOT(Ahead-Of-Time)兩種模式。JIT 在程序運行的時候動態(tài)翻譯指令,類似于 JVM。AOT 在軟件安裝的時候直接翻譯成 ARM 指令,Android 也有類似的技術(shù)。
x86 指令集
雖然復(fù)雜,但 Rosetta 2 只需要支持其中的子集,也就是用戶態(tài)指令。特權(quán)指令、虛擬化擴展則不支持,我猜測 SSE、AVX 這類指令也不支持。M1 是一個 64 位的處理器,翻譯的也是 64 位的 x86_64 指令,相似度很高。
Rosetta 2 的目的是運行 MacOS 軟件,操作系統(tǒng)
已經(jīng)有了 ARM 版,還需要轉(zhuǎn)換系統(tǒng)調(diào)用。畢竟轉(zhuǎn)換前后都是跑在 MacOS 上的,系統(tǒng)調(diào)用都一樣,只要把傳參方式從 x86 換成 ARM 就行。
其實,x86 切換 ARM 有一個重大優(yōu)勢,那就是兩套指令集都是小端法(little-endian
),翻譯指令的時候不需要做字節(jié)序反轉(zhuǎn)(byteswap)。蘋果上一次從 PowerPC 切換到 x86 就沒有這種運氣,因為 PowerPC 是大端法(big-endian),轉(zhuǎn)換起來要麻煩許多。
不過,這回遇到了一個新問題,x86 與 ARM 的內(nèi)存一致性模型(memory consistency model)不一樣,會導(dǎo)致多線程
軟件運行結(jié)果出現(xiàn)差異,這也是 ARM 模擬 x86 的最大困難。蘋果用了最暴力的辦法,直接在芯片里做了 Intel 版本的內(nèi)存模型,運行 Rosetta 2 的時候,通過一個后門開關(guān)切換到 Intel 內(nèi)存模型,運行原生 ARM 程序的時候使用正常的 ARM 內(nèi)存模型(見附圖的第4條)。估計這一點才是 Rosetta 2 性能好的最大貢獻。



編輯于 2020-12-07 20:48
真誠贊賞,手留余香
還沒有人贊賞,快來當(dāng)?shù)谝粋€贊賞的人吧!

沙洛特紹
極左極右之間反復(fù)橫跳
原理應(yīng)該和華為收購來這個在鯤鵬處理器
上面跑的ExaGear差不多,看起來是在aarch64上面直接運行了一套amd64的子系統(tǒng)

果子貍7778:菊花的動態(tài)二進制翻譯工具(Exagear)性能簡測22 贊同 · 8 評論文章

編輯于 2020-12-17 16:48