Rosetta 2 di Mac dengan Apple silicon
Mac dengan Apple silicon mampu menjalankan kode yang disusun untuk kumpulan instruksi x86_64 menggunakan mekanisme penerjemahan yang disebut Rosetta 2. Terdapat dua jenis penerjemahan yang ditawarkan: langsung dan di awal.
Penerjemahan langsung
Di pipeline penerjemahan langsung (JIT), objek Mach x86_64 teridentifikasi lebih awal di jalur eksekusi image. Saat image ini ditemui, kernel mentransfer kontrol ke bagian penerjemahan Rosetta khusus alih-alih ke editor tautan dinamis, dyld(1)
. Bagian penerjemahan lalu menerjemahkan halaman x86_64 selama eksekusi image. Penerjemahan ini terjadi sepenuhnya di dalam proses. Kernel masih memverifikasi hash kode setiap halaman x86_64 terhadap tanda tangan kode yang dilampirkan ke biner saat halaman salah dimasukkan. Jika hash tidak cocok, kernel memberlakukan kebijakan pemulihan yang sesuai untuk proses tersebut.
Penerjemahan di awal
Pada jalur penerjemahan di awal (AOT), biner x86_64 dibaca dari penyimpanan saat sistem menganggap respons kode tersebut optimal. Artefak yang diterjemahkan ditulis ke penyimpanan sebagai jenis file objek Mach khusus. File tersebut serupa dengan image yang dapat dieksekusi, tapi ditandai untuk mengindikasikan bahwa artefak adalah produk terjemahan image lain.
Di model ini, artefak AOT menurunkan semua informasi identitasnya dari image yang dapat dieksekusi x86_64 asli. Untuk memberlakukan pengikatan ini, entitas userspace yang berhak menandatangani artefak terjemahan menggunakan kunci khusus perangkat yang dikelola oleh Secure Enclave. Kunci ini hanya dirilis ke entitas userspace yang berhak, yang teridentifikasi seperti menggunakan hak yang dibatasi. Direktori kode yang dibuat untuk artefak terjemahan menyertakan hash direktori kode image yang dapat dieksekusi x86_64 asli. Tanda tangan pada artefak terjemahan sendiri dikenal sebagai tanda tangan tambahan.
Pipeline AOT dimulai serupa dengan pipeline JIT, dengan kernel mentransfer kontrol ke runtime Rosetta alih-alih ke editor tautan dinamis, dyld(1)
. Namun runtime Rosetta kemudian mengirimkan permintaan komunikasi antarproses (IPC) ke layanan sistem Rosetta, yang bertanya apakah ada terjemahan AOT yang tersedia untuk image yang dapat dieksekusi saat ini. Jika ditemukan, layanan Rosetta menyediakan pengendali ke terjemahan tersebut, dan dipetakan ke proses serta dieksekusi. Selama eksekusi, kernel memberlakukan hash direktori kode dari artefak terjemahan yang disahkan oleh tanda tangan yang berdasar di kunci penandatanganan khusus perangkat. Hash direktori kode image x86_64 asli tidak terlibat di proses ini.
Artefak terjemahan disimpan di Vault Data yang tidak dapat diakses saat runtime oleh entitas apa pun kecuali layanan Rosetta. Layanan Rosetta mengelola akses ke cache-nya dengan mendistribusikan deskriptor file hanya baca ke masing-masing artefak terjemahan; hal ini membatasi akses ke cache artefak AOT. Komunikasi antarproses layanan ini dan jejak dependen layanan ini sengaja disimpan dengan sangat sempit untuk membatasi permukaan serangannya.
Jika hash direktori kode image x86_64 asli tidak sesuai dengan hash yang dikodekan ke tanda tangan artefak terjemahan AOT, hasil ini akan dianggap serupa dengan tanda tangan kode yang tidak sah, dan tindakan pemberlakuan yang sesuai akan diambil.
Jika proses jarak jauh meminta kernel memberikan hak atau properti identitas kode lainnya milik file yang diterjemahkan oleh AOT, properti identitas image x86_64 asli akan dikembalikan ke proses.
Konten cache kepercayaan statis
macOS 11 mengirimkan biner “besar” Mach yang berisi potongan kode komputer x86_64 dan arm64. Di Mac dengan Apple silicon, pengguna dapat menentukan untuk mengeksekusi potongan x86_64 pada biner sistem melalui pipeline Rosetta—misalnya untuk memuat plug-in yang tidak memiliki varian arm64 asli. Untuk mendukung pendekatan ini, cache kepercayaan statis yang dikirimkan dengan macOS, umumnya, berisi tiga hash direktori kode per file objek Mach:
Hash direktori kode potongan arm64
Hash direktori kode potongan x86_64
Hash direktori kode terjemahan AOT pada potongan x86_64
Prosedur penerjemahan AOT Rosetta bersifat telah ditentukan sebelumnya dan menghasilkan output serupa untuk input apa pun, terlepas dari kapan penerjemahan dilakukan atau di perangkat apa penerjemahan dilakukan.
Selama pembuatan macOS, semua file objek Mac dijalankan melalui pipeline penerjemahan AOT Rosetta yang terkait dengan versi macOS yang sedang dibuat, dan hasil dari hash direktori kode dicatat ke cache kepercayaan. Demi alasan efisiensi, produk terjemahan sebenarnya tidak dikirim dengan sistem operasi dan dikonstitusi ulang sesuai permintaan saat pengguna memintanya.
Saat image x86_64 sedang dieksekusi di Mac dengan Apple silicon, jika hash direktori kode image tersebut berada dalam cache kepercayaan statis, hash direktori kode artefak AOT yang dihasilkan juga diharapkan berada dalam cache kepercayaan statis. Produk seperti itu tidak ditandatangani oleh kunci khusus perangkat, karena otoritas penandatanganan berdasar di rantai boot aman Apple.
Kode x86_64 yang tidak ditandatangani
Mac dengan Apple silicon tidak mengizinkan kode arm64 asli untuk dieksekusi kecuali tanda tangan yang sah dilampirkan. Tanda tangan ini dapat sesederhana tanda tangan kode ad hoc (msl. codesign(1)
) yang tidak memiliki identitas asli dari salah satu pasangan rahasia kunci asimetris (ini hanyalah pengukuran biner yang tidak disahkan).
Untuk kompatibilitas biner, kode x86_64 yang diterjemahkan diizinkan untuk dieksekusi melalui Rosetta tanpa informasi tanda tangan sama sekali. Tidak ada identitas khusus yang diteruskan ke kode ini melalui prosedur penandatanganan Secure Enclave khusus perangkat, dan identitas dieksekusi dengan batasan yang sama seperti mengeksekusi kode yang tidak ditandatangani di Mac berbasis Intel.