2 điểm bởi GN⁺ 2025-04-06 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp
  • Hệ điều hành Darwin của Apple là thành phần lõi thuộc họ Unix, làm nền tảng cho các hệ điều hành hiện đại của Apple như macOS, iOS
  • Trọng tâm là nhân XNU, một nhân lai có tên viết tắt của "X is Not Unix"
  • Nó kết hợp cấu trúc của vi nhân Mach với các thành phần của BSD Unix để cân bằng giữa hiệu năng và tính mô-đun
  • Bài viết này giải thích quá trình phát triển về mặt cấu trúc của Darwin và XNU, bắt đầu từ nguồn gốc của Mach và BSD cho đến những bước tiến hóa mới nhất trên Apple Silicon
  • Phân tích các thành phần cốt lõi của nhân (IPC, lập lịch, quản lý bộ nhớ, ảo hóa, v.v.) và cách nó thích nghi với phần cứng hiện đại

Nguồn gốc của vi nhân Mach (1985–1996)

  • Mach được khởi xướng vào năm 1985 tại Carnegie Mellon University bởi Richard Rashid và Avie Tevanian
  • Nó được thiết kế như một vi nhân chỉ cung cấp các chức năng cốt lõi nhằm giảm độ phức tạp của nhân UNIX
  • Chỉ cung cấp các chức năng mức thấp như quản lý bộ nhớ, lập lịch dựa trên luồng và IPC dựa trên thông điệp; còn hệ thống tệp, mạng và các phần khác được tách thành các máy chủ ở không gian người dùng
  • Mach 2.5 chạy cùng một phần mã nhân BSD trong không gian nhân để bù đắp hiệu năng
  • Mach 3.0 chuyển sang mô hình vi nhân đúng nghĩa và cũng ảnh hưởng đến quản lý bộ nhớ của BSD
  • Mach giới thiệu khái niệm tác vụ (Task) và luồng (Thread), đồng thời triển khai mô hình bộ nhớ ảo hiệu quả
  • NeXT (do Steve Jobs thành lập năm 1985) đã phát triển hệ điều hành NeXTSTEP dựa trên Mach 2.5 + 4.3BSD
  • Nhân của NeXTSTEP kết hợp Mach và BSD trong không gian nhân để tạo thành cấu trúc lai
  • Trình điều khiển được phát triển bằng DriverKit dựa trên Objective-C, thử nghiệm cách tiếp cận hướng đối tượng
  • Apple mua lại NeXT vào năm 1996 và mang về NeXTSTEP cùng nhân XNU dựa trên Mach/BSD
  • Các phiên bản đầu của Mac OS X (Rhapsody) được phát triển dựa trên cấu trúc nhân của NeXT

Giai đoạn tiến hóa ban đầu của Mac OS X (1997–2005)

  • Apple tích hợp mã Mach 3.0 dựa trên OSFMK 7.3 vào XNU, đồng thời cập nhật lớp BSD bằng mã FreeBSD và 4.4BSD
  • Tiếp tục duy trì cấu trúc lai tích hợp chức năng của BSD và Mach nhằm cải thiện hiệu năng và mở rộng hỗ trợ phần cứng
  • Giới thiệu framework trình điều khiển mới I/O Kit: chuyển từ Objective-C sang C++ để tối ưu hiệu năng và hỗ trợ hot-plug
  • Tóm tắt đặc điểm các phiên bản chính:
    • 10.1 Puma (2001): hỗ trợ luồng thời gian thực, cải thiện hiệu năng
    • 10.2 Jaguar (2002): giới thiệu IPv6, IPSec, Bonjour, ghi nhật ký HFS+
    • 10.3 Panther (2003): cải tiến nhân dựa trên FreeBSD 5, bổ sung fine-grained locking để hỗ trợ đa lõi
  • XNU hỗ trợ PowerPC làm nền tảng chính, đồng thời vẫn giữ mã hỗ trợ x86 để chuẩn bị cho việc chuyển đổi sau này
  • 10.4 Tiger (2005): đạt chứng nhận UNIX 03, đặt nền móng cho chuyển đổi sang Intel, giới thiệu hệ thống sự kiện kqueue/kevent

Kỷ nguyên 64-bit, đa lõi và iPhone OS (2005–2010)

  • 10.5 Leopard (2007):
    • hỗ trợ x86_64 và cho phép trình điều khiển 64-bit
    • tăng cường các tính năng bảo mật và gỡ lỗi như ASLR, sandbox, DTrace
    • là phiên bản cuối cùng hỗ trợ PowerPC chính thức
  • iPhone OS 1 (2007):
    • dựa trên Darwin 9, đưa XNU lên ARM
    • giới thiệu cơ chế Jetsam để xử lý tình trạng thiếu bộ nhớ
    • bắt buộc sandbox cho toàn bộ ứng dụng và yêu cầu ký mã
  • 10.6 Snow Leopard (2009):
    • chỉ dành cho Intel, hỗ trợ đầy đủ nhân 64-bit
    • giới thiệu Grand Central Dispatch: framework song song hóa tác vụ ở không gian người dùng phối hợp với nhân
    • tích hợp OpenCL và hỗ trợ tính toán GPU
  • iOS 4 (2010):
    • giới thiệu đa nhiệm và lập lịch dựa trên mức ưu tiên (phân biệt nền/tiền cảnh)

Hiện đại hóa macOS và iOS (2011–2020)

  • 10.8~10.9 (2012–2013):
    • giới thiệu Compressed Memory để tối ưu sử dụng RAM
    • tăng cường tiết kiệm điện CPU bằng Timer Coalescing
    • phát triển cơ chế lập lịch tập trung vào hiệu quả năng lượng như App Nap, QoS
  • 10.10~10.11 (2014–2015):
    • giới thiệu SIP (System Integrity Protection): ngay cả quyền root cũng không thể sửa đổi tệp hệ thống
    • mở rộng khả năng của XNU sang nhiều thiết bị như watchOS, tvOS
    • bắt đầu hỗ trợ ARM64 và chuẩn bị loại bỏ ARM 32-bit
  • 10.12~10.14 (2016–2018):
    • chuyển sang hệ thống tệp APFS (Apple File System)
    • hỗ trợ snapshot, cloning, mã hóa
    • tăng cường bảo mật kext: yêu cầu phê duyệt của người dùng, siết chặt kiểm tra ký mã
  • 10.15 Catalina (2019):
    • giới thiệu DriverKit: chạy trình điều khiển trong không gian người dùng (quay lại triết lý vi nhân)
    • tăng cường bảo mật bằng cách tách system volume ở chế độ chỉ đọc

Kỷ nguyên Apple Silicon (2020–nay)

  • macOS 11 Big Sur (2020):

    • hỗ trợ Apple Silicon (M1) dựa trên ARM64
    • hỗ trợ lập lịch CPU big.LITTLE: phân bổ luồng vào lõi hiệu suất/lõi tiết kiệm dựa trên QoS
    • cấu trúc Mach VM phù hợp với kiến trúc bộ nhớ hợp nhất
  • Tăng cường bảo mật và ảo hóa:

    • hỗ trợ các tính năng bảo mật phần cứng ARM như PAC (xác thực con trỏ), MTE (gắn thẻ bộ nhớ)
    • giới thiệu framework ảo hóa mới dựa trên khả năng hypervisor của Apple Silicon
    • cho phép chạy VM nhẹ dành cho nhà phát triển trên macOS (điều khiển từ không gian người dùng)
  • Cấu trúc nền tảng hợp nhất:

    • XNU được dùng làm nhân cho mọi nền tảng của Apple như macOS, iOS, watchOS, tvOS, bridgeOS, visionOS
    • nhờ khả năng trừu tượng hóa nền tảng của Mach, nó có thể thích nghi dễ dàng với nhiều kiến trúc CPU khác nhau

Tóm tắt các mốc chính của XNU

  • 1989 - NeXTSTEP 1.0 - giới thiệu cấu trúc lai XNU với Mach 2.5 + BSD
  • 1996 - Apple mua lại NeXT - bắt đầu phát triển Rhapsody dựa trên Mach 3.0 + FreeBSD
  • 2001 - Mac OS X 10.0 - định hình cấu trúc nhân XNU và cải thiện hiệu năng ban đầu
  • 2005 - 10.4 Tiger - chứng nhận UNIX, chuẩn bị cho chuyển đổi sang Intel
  • 2007 - 10.5 Leopard - hỗ trợ 64-bit, tăng cường bảo mật, iPhone OS ra mắt
  • 2009 - 10.6 Snow Leopard - hoàn tất chuyển đổi sang Intel và giới thiệu GCD
  • 2011 - 10.7 Lion - bắt buộc nhân 64-bit, mở rộng sandboxing
  • 2013 - 10.9 Mavericks - giới thiệu nén bộ nhớ và lập lịch QoS
  • 2015 - 10.11 El Capitan - giới thiệu SIP, mở rộng sang các thiết bị như watchOS
  • 2017 - 10.13 High Sierra - áp dụng APFS mặc định, tăng cường bảo mật Kext
  • 2019 - 10.15 Catalina - chạy trình điều khiển trong không gian người dùng bằng DriverKit
  • 2020 - 11 Big Sur - hỗ trợ Apple Silicon, giới thiệu cấu trúc ảo hóa mới
  • 2022 - 13 Ventura - cải thiện lập lịch cho các lõi hiệu năng cao như M1 Max
  • 2024 - 14 Sonoma - tối ưu cho M2/M3 và hỗ trợ Memory Tagging

Cấu trúc và thiết kế của nhân XNU

Thiết kế nhân lai: tích hợp Mach + BSD

  • XNU có cấu trúc nhân lai, mang đặc tính của cả vi nhân (Mach) lẫn nhân nguyên khối (BSD)
  • Mach trừu tượng hóa và mô-đun hóa các chức năng mức thấp (luồng, bộ nhớ, IPC, v.v.), còn BSD thực thi trực tiếp toàn bộ system call và API của UNIX trong không gian nhân
  • BSD và Mach được liên kết thành một binary nhân duy nhất và chạy trong cùng một không gian địa chỉ
  • Bên trong nhân, các hàm Mach và BSD gọi trực tiếp lẫn nhau không qua thông điệp, và các system call UNIX được xử lý với hiệu năng tương đương các nhân Unix khác
  • Ví dụ: khi gọi system call read(), mã hệ thống tệp BSD sẽ được thực thi trực tiếp trong nhân

Vai trò của Mach

  • Cung cấp hạ tầng cốt lõi của nhân như quản lý luồng và tác vụ, chuyển ngữ cảnh, hàng đợi lập lịch, timer
  • Cung cấp IPC dựa trên thông điệp thông qua Mach port (hỗ trợ chia sẻ bộ nhớ giữa các tiến trình và truyền buffer lớn)
  • Triển khai các tính năng quản lý bộ nhớ ảo nâng cao như memory object, tối ưu copy-on-write, trừu tượng hóa không gian địa chỉ

Vai trò của BSD

  • Cung cấp các chức năng UNIX như tiến trình và PID, signal, user ID, POSIX API, hệ thống tệp, network stack, UNIX IPC
  • Bắt nguồn từ mã BSD dựa trên FreeBSD, đồng thời cũng bao gồm các tính năng từ OpenBSD/NetBSD
  • Triển khai các chính sách bảo mật như framework bảo mật (KAuth, MAC), sandbox, SIP, xác minh ký mã
  • Triển khai system call: fork() thực hiện nhân bản VM ở Mach, còn sao chép file descriptor ở BSD
  • Đảm nhiệm phần lớn chức năng UNIX như VFS, mạng, xử lý signal, POSIX thread

I/O Kit

  • Framework trình điều khiển hướng đối tượng chạy trong không gian nhân (sử dụng Embedded Subset của C++)
  • Định nghĩa cấu trúc phân tầng thiết bị để từng trình điều khiển kế thừa và triển khai
  • Cung cấp giao diện user client có thể truy cập từ không gian người dùng
  • Đồng bộ hóa nhân và điều khiển luồng dùng các chức năng của Mach, còn trình điều khiển hệ thống tệp và mạng kết nối với BSD
  • Trình điều khiển có thể được nạp động dưới dạng Kext và được nạp vào bộ nhớ nhân theo định dạng Mach-O

Mach IPC và truyền thông điệp

  • Mach port là cơ chế IPC chính giữa nhân và không gian người dùng, hoặc giữa các tiến trình người dùng với nhau
  • Mỗi tiến trình có thể được điều khiển thông qua Mach port; các daemon hệ thống như launchd cũng điều khiển tiến trình qua các port này
  • Các tính năng cao cấp của macOS như Grand Central Dispatch, XPC được triển khai dựa trên thông điệp Mach
  • Thông điệp Mach có hệ thống quyền port nên có tính bảo mật cao, đồng thời cho phép chuyển port và chia sẻ bộ nhớ
  • MIG (Mach Interface Generator) được dùng để tự động sinh mã RPC dựa trên thông điệp giữa nhân và người dùng
  • DriverKit triển khai giao tiếp giữa nhân và trình điều khiển không gian người dùng dựa trên Mach IPC

Bộ lập lịch và quản lý luồng

  • Tiến hóa từ bộ lập lịch round-robin dựa trên mức ưu tiên của Mach
  • Mỗi CPU có một Run Queue riêng và luồng được lập lịch dựa trên mức ưu tiên
  • Sau khi iOS ra đời, hệ thống áp dụng chính sách lập lịch theo vai trò ứng dụng (nền/tiền cảnh)
  • Lập lịch dựa trên lớp QoS (Quality of Service): điều chỉnh ưu tiên theo loại tác vụ như tương tác người dùng, nền
  • Trên Apple Silicon, luồng được gán vào lõi tiết kiệm hoặc lõi hiệu năng dựa trên QoS
  • Luồng thời gian thực (như âm thanh) được ưu tiên chạy thông qua hàng đợi thời gian thực, và từ macOS 10.4 đã hỗ trợ deadline scheduling
  • Phối hợp với quản lý điện năng: tối ưu hiệu năng trên thiết bị di động thông qua idle thread, gộp timer, chuyển sang trạng thái tiết kiệm điện

Quản lý bộ nhớ và bộ nhớ ảo

  • Mach VM là thành phần cốt lõi của hệ thống bộ nhớ trong XNU, với thiết kế mạnh mẽ và linh hoạt
  • Không gian địa chỉ ảo dựa trên copy-on-write, cho phép sao chép bộ nhớ hiệu quả khi fork()
  • Cấu trúc memory object và pager:
    • daemon không gian người dùng dynamic_pager quản lý vùng swap
    • ánh xạ tệp được xử lý trong nhân thông qua vnode pager
  • Từ Mavericks, hệ thống giới thiệu nén bộ nhớ: khi thiếu bộ nhớ, các trang được nén để giữ lại thay vì swap ra đĩa
  • pmap: lớp phụ thuộc máy quản lý bộ nhớ vật lý và page table của từng kiến trúc
  • Nhân có không gian địa chỉ riêng, trong đó một số vùng được đặt là bộ nhớ cố định (wired)
  • macOS tăng cường bảo mật bộ nhớ thông qua guard page để gỡ lỗi, zero-fill allocation, split protection
  • Mach VM xử lý hiệu quả việc chia sẻ framework thông qua shared memory, thiết lập Inheritance, v.v.
  • Trên Apple Silicon, GPU và bộ nhớ dùng chung một không gian, nên Mach VM có thể tối ưu cấp phát dựa trên đặc tính bộ nhớ

Hỗ trợ ảo hóa

  • XNU ban đầu không có chức năng hypervisor, nhưng từ OS X 10.10 đã bắt đầu hỗ trợ ảo hóa qua Hypervisor.framework
  • Trên nền Intel, hệ thống tận dụng VT-x để chạy VM ở không gian người dùng
  • Trên Apple Silicon chạy ARM, hệ thống sử dụng tính năng ảo hóa EL2 thông qua Virtualization.framework
  • Hypervisor bên trong nhân đảm nhiệm bộ nhớ ảo, xử lý trap của vCPU, lập lịch, v.v.
  • Tận dụng cấu trúc luồng và Mach task của XNU để xử lý vCPU như các luồng của máy chủ
  • macOS cũng cung cấp tính năng giả lập x86 như Rosetta 2, cùng khả năng dịch system call và tương thích ABI
  • Từ iOS 15, iOS cũng cho phép ảo hóa ở mức hạn chế (cần chế độ nhà phát triển)

Cấu trúc tính toán bảo mật

  • Secure Enclave:
    • một hệ con bảo mật độc lập được tích hợp trong Apple SoC
    • chạy một vi nhân riêng gọi là sepOS để bảo vệ dữ liệu sinh trắc học, khóa mã hóa, v.v.
    • vẫn duy trì xử lý bảo mật tách biệt ngay cả khi nhân chính bị xâm phạm
  • Exclaves:
    • vùng cô lập mới được giới thiệu từ macOS 14.4 và iOS 17
    • tách các tài nguyên nhạy cảm như xác thực Apple ID, bộ đệm âm thanh, dữ liệu cảm biến ra khỏi vùng của nhân chính
    • được điều khiển bằng Kext và framework chuyên dụng như ExclaveKextClient.kext
    • ngay cả khi nhân bị xâm phạm, vùng exclave vẫn được bảo vệ độc lập
  • enclave phản ánh khái niệm vùng nằm bên trong hệ thống, còn exclave là vùng tách biệt được kết nối từ bên ngoài hệ thống

Kết luận

  • XNU là một nhân có cấu trúc lai thực dụng, dung hòa ưu điểm của vi nhân và nhân nguyên khối
  • Lớp trừu tượng hóa của Mach cho phép chuyển đổi giữa nhiều kiến trúc CPU và mở rộng hệ thống, còn BSD cung cấp khả năng tương thích POSIX và môi trường Unix ổn định
  • Apple dùng Mach IPC để tách chức năng sang không gian người dùng khi cần, trong khi bên trong nhân vẫn kết nối trực tiếp để đạt hiệu quả
  • Dựa trên kiến trúc nhiều lớp như trình điều khiển (User-space DriverKit), ảo hóa (Hypervisor.framework), bộ lập lịch (QoS), quản lý bộ nhớ (Compressed Memory), hệ thống có thể linh hoạt đáp ứng các yêu cầu hiện đại
  • Darwin và XNU khởi đầu từ NeXTSTEP, sau đó phát triển thành lõi của hàng trăm triệu thiết bị Apple và vẫn đang tiếp tục tiến hóa

Chưa có bình luận nào.

Chưa có bình luận nào.