Apple Silicon yongalı Mac’te Rosetta 2
Apple Silicon yongalı bir Mac, Rosetta 2 adlı bir çeviri mekanizması kullanarak x86_64 yönerge kümesi için derlenmiş kodu çalıştırabilir. İki tür çeviri sunulur: JIT (çalışma zamanında) ve AOT (oluşturma zamanında) derlemesi.
JIT (çalışma zamanında) derlemesi
JIT derlemesi çeviri komut zincirinde bir x86_64 Mach nesnesi, görüntü çalıştırma yolunun başlarında tanımlanır. Bu görüntülerle karşılaşıldığında çekirdek, dyld(1)
dinamik bağlantı düzenleyicisi yerine özel bir Rosetta çeviri biletine denetimi aktarır. Çeviri bileti de görüntünün çalıştırılması sırasında x86_64 sayfalarını çevirir. Bu çeviri tamamen işlem içinde gerçekleştirilir. Çekirdek her bir x86_64 sayfasının kod özetini kusurlu bulduğu ikili dosyaya iliştirilmiş kod imzasını kullanarak doğrulamaya devam eder. Özet uyuşmazlığı durumunda çekirdek o işlem için uygun düzeltme politikasını uygular.
AOT (oluşturma zamanında) derlemesi
AOT (oluşturma zamanında) derlemesi çeviri yolunda, sistem, kodun yanıt verebilirliği açısından uygun gördüğü zamanlarda x86_64 ikili dosyaları depolama aygıtından okunur. Çevrilen nesneler, özel bir Mach nesne dosyası türü olarak depolama alanına yazılır. Bu dosya çalıştırılabilir bir görüntüye benzerdir ama başka bir görüntünün çevrilmiş ürünü olduğunu belirtmek üzere işaretlenmiştir.
Bu modelde AOT nesnesi tüm kimlik bilgilerini özgün x86_64 çalıştırılabilir görüntüsünden türetir. Bir ayrıcalıklı kullanıcı alanı varlığı, bu bağlamayı uygulamak için Secure Enclave tarafından yönetilen, aygıta özel bir anahtar kullanarak çeviri nesnesini imzalar. Bu anahtar yalnızca ayrıcalıklı kullanıcı alanı varlığına teslim edilir; kullanıcı alanı varlığının ayrıcalıklı olup olmadığı sınırlanmış bir yetki anahtarıyla belirlenir. Çeviri nesnesi için yaratılan kod dizini, özgün x86_64 çalıştırılabilir görüntüsünün kod dizini özetini içerir. Çeviri nesnesinin imzası ek imza olarak bilinir.
AOT komut zinciri JIT komut zincirine benzer şekilde başlar ve çekirdek, denetimi dyld(1)
dinamik bağlantı düzenleyicisi yerine Rosetta çalıştırma ortamına aktarır. Ancak Rosetta çalıştırma ortamı da, Rosetta sistem servisine şu anki çalıştırılabilir görüntü için bir AOT çevirisi olup olmadığını soran bir işlemler arası iletişim (IPC) sorgusu gönderir. Varsa Rosetta servisi o çeviriyi işaret eden bir tanıtıcı sunar; bu tanıtıcı işleme eşlenir ve çalıştırılır. Çalıştırma sırasında çekirdek, çeviri nesnesinin kod dizini özetlerini uygular. Kod dizini özetlerinin kimliği, kökü aygıta özel imzalama anahtarında bulunan imzayla doğrular. Özgün x86_64 görüntüsünün kod dizini özetleri bu işlemde kullanılmaz.
Çevrilen nesneler, çalıştırma sırasında Rosetta servisi dışında hiçbir varlık tarafından erişilemeyen bir veri kasasında saklanır. Rosetta servisi, ayrı ayrı çeviri nesnelerine salt okunur dosya açıklayıcıları dağıtarak önbelleğine erişimi yönetir; bu, AOT nesne önbelleğine erişimi sınırlar. Bu servisin işlemler arası iletişimi (IPC) ve bağlantılı alanı, saldırı zeminini sınırlamak amacıyla kasıtlı olarak dar tutulur.
Özgün x86_64 görüntüsünün kod dizini özeti, AOT çeviri nesnesinin imzasına kodlanmış özetle eşleşmezse bu sonuç, geçersiz kod imzasına eşdeğer kabul edilir ve uygun uygulama eylemi gerçekleştirilir.
Uzaktaki bir işlem, AOT ile çevrilmiş bir çalıştırılabilir öğenin yetki anahtarları veya başka bir kod kimliği özellikleri için çekirdeği sorgularsa ona özgün x86_64 görüntüsünün kimlik özellikleri geri verilir.
Statik güven önbelleği içeriği
macOS 11 veya daha yenisi, x86_64 ve arm64 bilgisayar kodu parçalarını içeren Mach “fat” (çoklu mimari) ikili dosyalarıyla birlikte gelir. Apple Silicon yongalı bir Mac’te kullanıcı, bir sistem ikili dosyasının x86_64 parçasını Rosetta komut zinciri aracılığıyla çalıştırmaya karar verebilir (örneğin yerel arm64 varyantı olmayan bir yazılım ekini yüklemek için). Bu yaklaşımı desteklemek için macOS ile birlikte gelen statik güven önbelleği genellikle her Mach nesne dosyası için üç kod dizini özeti içerir:
arm64 parçasının bir kod dizini özeti
x86_64 parçasının bir kod dizini özeti
x86_64 parçasının AOT çevirisinin bir kod dizini özeti
Rosetta AOT çeviri işlemi, çevirinin ne zaman veya hangi aygıtta gerçekleştirildiğinden bağımsız olarak verilen bir girdi için aynı çıktıyı üretmesi nedeniyle belirlenimcidir.
macOS oluşturulması sırasında her Mach nesne dosyası için, oluşturulan macOS sürümüyle ilişkili Rosetta AOT çeviri komut zinciri çalıştırılır ve sonuçta oluşan kod dizini özeti güven önbelleğine kaydedilir. Verimlilik nedenlerinden dolayı gerçek çevrilen ürünler işletim sistemiyle gelmez ve kullanıcı bunları istediğinde yeniden oluşturulur.
Bir x86_64 görüntüsü Apple Silicon yongalı bir Mac’te çalıştırıldığında, o görüntünün kod dizini özeti statik güven önbelleğinde varsa sonuçta oluşan AOT nesnesinin kod dizini özetinin de statik güven önbelleğinde olması beklenir. Bu tür ürünler, imzalama otoritesinin kökü Apple güvenli başlatma zincirinde olduğu için aygıta özel anahtarla imzalanmaz.
İmzalanmamış x86_64 kodu
Apple Silicon yongalı bir Mac, geçerli bir imza iliştirilmediği sürece yerel arm64 kodunun çalıştırılmasına izin vermez. Bu imza, asimetrik anahtar çiftinin gizli yarısından gerçek herhangi bir kimlik bilgisi taşımayan özel kod imzası kadar basit olabilir (codesign(1)
ile karşılaştırıldığında) (bu sadece ikili dosyanın kimlik doğrulamasız ölçümüdür).
İkili dosya uyumluluk nedenlerinden dolayı çevrilen x86_64 kodunun hiçbir imza bilgisi olmadan Rosetta aracılığıyla çalıştırılmasına izin verilir. Bu koda, aygıta özel Secure Enclave imzalama işlemiyle belirli bir kimlik bilgisi iletilmez ve kod, Intel tabanlı bir Mac’te çalışan yerel imzalanmamış kodla tam olarak aynı sınırlamalarla çalıştırılır.