Rosetta 2 บน Mac ที่มี Apple Silicon
Mac ที่มี Apple Silicon สามารถเรียกใช้โค้ดที่รวบรวมไว้สำหรับชุดคำสั่ง x86_64 ได้โดยใช้กลไกการแปลที่เรียกว่า Rosetta 2 การแปลที่มีให้ใช้แบ่งออกเป็นสองประเภท: Just In Time และ Ahead Of Time
การแปลแบบ Just In Time
ในวิธีการแปลแบบ Just In Time (JIT) วัตถุ Mach x86_64 จะมีการระบุในช่วงต้นของเส้นทางการเรียกใช้ภาพดิสก์ เมื่อพบภาพดิสก์เหล่านี้ เคอร์เนลจะถ่ายโอนการควบคุมไปยัง Stub การแปลแบบพิเศษของ Rosetta แทนที่จะไปยังตัวแก้ไขลิงก์ไดนามิก dyld(1)
จากนั้น Stub การแปลจะแปลหน้า x86_64 ในระหว่างการเรียกใช้ภาพดิสก์ การแปลทั้งหมดนี้เกิดขึ้นภายในกระบวนการ เคอร์เนลจะยังคงตรวจสอบยืนยันแฮชโค้ดของ x86_64 แต่ละหน้ากับลายเซ็นโค้ดที่แนบมากับไบนารีเนื่องจากหน้ามีข้อบกพร่อง ในกรณีที่แฮชไม่ตรงกัน เคอร์เนลจะบังคับใช้นโยบายการเยียวยาที่เหมาะสมกับกระบวนการนั้น
การแปลแบบ Ahead Of Time
ในเส้นทางการแปลแบบ Ahead Of Time (AOT) ระบบจะอ่านไบนารี x86_64 จากพื้นที่จัดเก็บข้อมูลในเวลาที่ระบบถือว่าเหมาะสมที่สุดสำหรับการตอบสนองของโค้ดนั้น สิ่งแปลกปลอมที่แปลแล้วจะถูกเขียนไปยังพื้นที่จัดเก็บข้อมูลเป็นไฟล์วัตถุ Mach ประเภทพิเศษ ไฟล์นั้นจะคล้ายกับภาพดิสก์ที่เรียกใช้ได้ แต่จะถูกทำเครื่องหมายไว้เพื่อระบุว่าเป็นผลิตภัณฑ์ที่แปลแล้วของภาพดิสก์อื่น
ในโมเดลนี้ สิ่งแปลกปลอม AOT จะรับข้อมูลประจำตัวทั้งหมดจากภาพดิสก์ x86_64 ดั้งเดิมที่เรียกใช้ได้ ในการบังคับใช้การผูกมัดนี้ เอนทิตี้พื้นที่ผู้ใช้ที่มีสิทธิ์จะลงชื่อสิ่งแปลกปลอมการแปลโดยใช้กุญแจเฉพาะอุปกรณ์ที่จัดการโดย Secure Enclave กุญแจนี้จะเผยแพร่ไปยังเอนทิตี้พื้นที่ผู้ใช้ที่มีสิทธิ์เท่านั้น ซึ่งระบุเป็นเช่นนั้นโดยใช้สิทธิ์ที่จำกัด ไดเรกทอรีโค้ดที่สร้างขึ้นสำหรับสิ่งแปลกปลอมการแปลจะมีแฮชไดเรกทอรีโค้ดของภาพดิสก์ x86_64 ดั้งเดิมที่เรียกใช้ได้ ลายเซ็นที่อยู่บนตัวสิ่งแปลกปลอมการแปลเองจะเรียกว่าลายเซ็นเสริม
วิธีการ AOT จะเริ่มต้นคล้ายกับวิธีการ JIT โดยเคอร์เนลจะถ่ายโอนการควบคุมไปยังรันไทม์ Rosetta แทนที่จะไปยังตัวแก้ไขลิงก์ไดนามิก dyld(1)
แต่หลังจากนั้น รันไทม์ Rosetta จะส่งการสอบถามการสื่อสารระหว่างกระบวนการ (IPC) ไปยังบริการระบบ Rosetta ซึ่งจะถามว่ามีการแปล AOT ให้ใช้งานสำหรับภาพดิสก์ปัจจุบันที่เรียกใช้ได้หรือไม่ ถ้าพบ บริการ Rosetta จะให้ Handle กับการแปลนั้น และจะมีการเทียบผังกับกระบวนการและเรียกใช้ ในระหว่างการเรียกใช้ เคอร์เนลจะบังคับใช้แฮชไดเรกทอรีโค้ดของสิ่งแปลกปลอมการแปล ซึ่งได้รับตรวจสอบสิทธิ์โดยลายเซ็นที่มีรากฐานมาจากกุญแจการลงชื่อเฉพาะอุปกรณ์ แฮชไดเรกทอรีโค้ดของภาพดิสก์ x86_64 ดั้งเดิมจะไม่มีส่วนร่วมในกระบวนการนี้
สิ่งแปลกปลอมที่แปลแล้วจะถูกจัดเก็บไว้ใน Data Vault ซึ่งจะไม่มีเอนทิตี้ใดที่สามารถเข้าถึงได้ในระหว่างรันไทม์ ยกเว้นบริการ Rosetta บริการ Rosetta จัดการการเข้าถึงแคชของตัวเองโดยเผยแพร่ตัวอธิบายไฟล์แบบอ่านอย่างเดียวไปยังสิ่งแปลกปลอมการแปลแต่ละรายการ การทำเช่นนี้จะจำกัดการเข้าถึงแคชสิ่งแปลกปลอม AOT การสื่อสารระหว่างกระบวนการและพื้นที่ใช้งานแบบพึ่งพาของบริการนี้มีการตั้งใจทำให้แคบอย่างมากเพื่อจำกัดพื้นหน้าของการโจมตี
ถ้าแฮชไดเรกทอรีโค้ดของภาพดิสก์ x86_64 ดั้งเดิมไม่ตรงกับรายการเดียวกันที่เข้ารหัสอยู่ในลายเซ็นของสิ่งแปลกปลอมการแปล AOT ผลลัพธ์นี้จะถือว่าเทียบเท่ากับลายเซ็นโค้ดไม่ถูกต้อง และระบบจะดำเนินการการบังคับใช้ที่เหมาะสม
ถ้ากระบวนการระยะไกลสอบถามเคอร์เนลสำหรับสิทธิ์หรือคุณสมบัติข้อมูลประจำตัวโค้ดอื่นๆ ของรายการที่เรียกใช้ได้ที่แปลแบบ AOT คุณสมบัติข้อมูลประจำตัวของภาพดิสก์ x86_64 ดั้งเดิมจะถูกส่งกลับมา
เนื้อหาแคชความเชื่อถือแบบคงที่
macOS 11 ขึ้นไป จัดส่งมาพร้อมกับไบนารี Mach แบบ “fat” ที่มีส่วนของโค้ดเครื่องที่เป็น x86_64 และ arm64 บน Mac ที่มี Apple Silicon ผู้ใช้อาจตัดสินใจที่จะเรียกใช้ส่วนที่เป็น x86_64 ของไบนารีระบบผ่านวิธีการ Rosetta ตัวอย่างเช่น เพื่อโหลดปลั๊กอินที่ไม่มีรูปแบบ arm64 ดั้งเดิม ในการรองรับวิธีการนี้ แคชความเชื่อถือแบบคงที่ซึ่งจัดส่งมาพร้อมกับ macOS โดยทั่วไปแล้ว ประกอบด้วยแฮชไดเรกเทอรีโค้ดสามรายการต่อไฟล์วัตถุ Mach หนึ่งไฟล์:
แฮชไดเรกทอรีโค้ดของส่วน arm64
แฮชไดเรกทอรีโค้ดของส่วน x86_64
แฮชไดเรกทอรีโค้ดของการแปลแบบ AOT ของส่วน x86_64
ขั้นตอนการแปล Rosetta แบบ AOT เป็นขั้นตอนที่แน่นอนในลักษณะที่ให้ข้อมูลออกที่เหมือนกันไม่ว่าจะให้ข้อมูลเข้าใดก็ตาม ทั้งนี้จะไม่คำนึงถึงเวลาที่แปลหรืออุปกรณ์ที่ใช้แปล
ในระหว่างการสร้าง macOS ไฟล์วัตถุ Mach ทุกไฟล์จะถูกเรียกใช้ผ่านวิธีการแปล Rosetta แบบ AOT ที่เชื่อมโยงกับ macOS เวอร์ชั่นที่กำลังติดตั้ง แล้วแฮชไดดเรกทอรีโค้ดผลลัพธ์จะถูกบันทึกไปยังแคชความเชื่อถือ เพื่อประสิทธิภาพที่ดี ผลิตภัณฑ์ที่แปลจริงจะไม่จัดส่งมาพร้อมกับระบบปฏิบัติการ และจะประกอบใหม่ตามความต้องการเมื่อผู้ใช้ร้องขอ
เมื่อเรียกใช้ภาพดิสก์ x86_64 บน Mac ที่มี Apple Silicon ถ้าแฮชไดเรกทอรีโค้ดของภาพดิสก์นั้นอยู่ในแคชความเชื่อถือแบบคงที่ แฮชไดเรกทอรีโค้ดของสิ่งแปลกปลอม AOT ผลลัพธ์ก็ควรจะอยู่ในแคชความเชื่อถือแบบคงที่ด้วยเช่นกัน ผลิตภัณฑ์ดังกล่าวจะไม่มีการลงชื่อโดยกุญแจเฉพาะอุปกรณ์ เนื่องจากอำนาจการลงชื่อนั้นมีรากฐานมาจากลำดับการเริ่มต้นระบบอย่างปลอดภัยของ Apple
โค้ด x86_64 ที่ไม่ได้ลงชื่อ
Mac ที่มี Apple Silicon จะไม่อนุญาตให้เรียกใช้โค้ด arm64 ดั้งเดิมนอกจากจะแนบลายเซ็นที่ถูกต้องมาด้วย ลายเซ็นนี้อาจเรียบง่ายเหมือนกับลายเซ็นโค้ดเฉพาะกิจ (cf. codesign(1)
) ที่ไม่มีข้อมูลประจำตัวจริงใดๆ จากครึ่งลับของคู่กุญแจแบบไม่สมมาตร (ซึ่งเป็นเพียงการวัดของไบนารีที่ไม่มีการตรวจสอบสิทธิ์)
เพื่อความเข้ากันได้กับไบนารี โค้ด x86_64 ที่แปลแล้วจะได้รับอนุญาตให้ทำงานผ่าน Rosetta โดยไม่มีข้อมููลลายเซ็นใดๆ ไม่มีข้อมูลประจำตัวเฉพาะที่ส่งไปยังโค้ดนี้ผ่านขั้นตอนการลงชื่อ Secure Enclave เฉพาะอุปกรณ์ และโค้ดก็ทำงานด้วยขีดจำกัดเดียวกันกับโค้ดดั้งเดิมที่ไม่ได้ลงชื่อที่ทำงานบน Mac ที่ใช้ Intel