Введение

Ядро операционной системы XNU ("X is Not Unix") — это ядро операционной системы (ОС), разрабатываемое компанией Apple Inc. с декабря 1996 года для использования в операционной системе Mac OS X (теперь macOS) и распространяемое как свободное и открытое программное обеспечение в составе Darwin OS, которая, помимо macOS, также является основой для операционных систем Apple TV Software, iOS, iPadOS, watchOS, visionOS и tvOS. Изначально XNU было разработано компанией NeXT для операционной системы NeXTSTEP. Это гибридное ядро, производное от версии 2.5 ядра Mach, разработанного в Университете Карнеги — Меллона, которое включало в себя большую часть ядра 4.3BSD, модифицированного для работы на основе примитивов Mach, а также интерфейс прикладного программирования (API) на языке Objective-C для написания драйверов под названием Driver Kit. После приобретения NeXT компанией Apple, ядро было обновлено кодом, полученным из OSFMK 7.3 от OSF и проекта FreeBSD, а Driver Kit был заменен новым API, основанным на ограниченном подмножестве C++ (на базе Embedded C++), под названием I/O Kit.

Конструкция ядра

XNU — это гибридное ядро, сочетающее в себе характеристики монолитных и микроядер, стремящееся наилучшим образом использовать преимущества обеих технологий, такие как возможность передачи сообщений в микроядрах, обеспечивающая большую модульность и защиту памяти для значительных частей ОС, и сохранение скорости монолитных ядер для выполнения некоторых критически важных задач. По состоянию на 2021 год XNU работает на процессорах ARM64 и x86-64, как в однопроцессорных, так и в симметричных многопроцессорных (SMP) конфигурациях. Поддержка PowerPC была удалена, начиная с версии Mac OS X Snow Leopard. Поддержка IA-32 была удалена, начиная с версии Mac OS X Lion; поддержка 32-битных ARM была удалена, начиная с версии iOS 11.

Маха

Основой ядра XNU является сильно модифицированное (гибридное) ядро Open Software Foundation Mach (OSFMK) 7.3, включающее в себя применимый код из ядра Mach 4 Университета Юты и множества вариантов Mach 3.0, ответвленных от оригинального микроядра Mach 3.0 Университета Карнеги-Меллона. OSFMK 7.3 способно запускать ядро операционной системы как отдельные процессы, что обеспечивает высокую гибкость (возможность параллельного запуска нескольких операционных систем поверх ядра Mach), но часто приводит к снижению производительности из-за затратных по времени переключений контекста между режимами ядра и пользователя, а также накладных расходов, связанных с отображением или копированием сообщений между адресными пространствами ядра и сервисных демонов. Компания Apple лицензировала OSFMK 7.3 у OSF и попыталась оптимизировать некоторые задачи, интегрировав функции BSD непосредственно в ядро вместе с кодом Mach. Результатом является сильно модифицированное (гибридное) ядро OSFMK 7.3.

БСД

Часть ядра Berkeley Software Distribution (BSD) предоставляет интерфейс программирования приложений Portable Operating System Interface (POSIX) (API, системные вызовы BSD), модель процессов Unix, основанную на задачах Mach, базовые политики безопасности, идентификаторы пользователей и групп, права доступа, стек сетевых протоколов (протоколы), код виртуальной файловой системы (включая файлосистеменно-независимый слой журналирования), несколько локальных файловых систем, таких как Иерархическая файловая система (HFS, HFS Plus (HFS+)) и Apple File System (APFS), клиент и сервер Network File System (NFS), криптографический фреймворк, межпроцессное взаимодействие UNIX System V (IPC), подсистему аудита, обязательный контроль доступа и некоторые примитивы блокировки. Код BSD, присутствующий в XNU, был в последний раз синхронизирован с кодом ядра FreeBSD. Несмотря на то, что большая его часть была значительно модифицирована, обмен кодом между Apple и проектом FreeBSD продолжается по состоянию на 2009 год.

К32/К64

XNU в Mac OS X Snow Leopard, v10.6, (Darwin версия 10) выпускается в двух вариантах: 32-битная версия под названием K32 и 64-битная версия под названием K64. K32 может запускать 64-битные приложения в пользовательском пространстве. Новым в Mac OS X 10.6 была возможность запуска XNU в 64-битном адресном пространстве ядра. K32 был ядром по умолчанию для 10.6 Server при использовании на всех машинах, кроме моделей Mac Pro и Xserve, выпущенных начиная с 2008 года, и может запускать 64-битные приложения. K64 имеет несколько преимуществ по сравнению с K32:

Он может управлять более 32 ГБ оперативной памяти, поскольку карта памяти заняла бы непропорционально большую область 32-битного адресного пространства ядра. Размеры буферов кэша могут быть больше, чем позволяет 32-битное адресное пространство ядра, что потенциально повышает производительность ввода-вывода. Производительность увеличивается при использовании высокопроизводительных сетевых устройств или нескольких графических процессоров (GPU), поскольку ядро может отображать все устройства в 64-битном адресном пространстве, даже если у нескольких из них очень большие буферы прямого доступа к памяти (DMA). Загрузка с удержанием клавиш 6 и 4 принудительно загружает K64 на машинах, поддерживающих 64-битные ядра. K64 будет запускать 32-битные приложения, но не будет запускать 32-битные расширения ядра (KEXT), поэтому их необходимо портировать на K64 для загрузки. XNU в OS X Mountain Lion (10.8) и более поздних версиях предоставляет только 64-битное ядро.

Комплект ввода-вывода

I/O Kit — это фреймворк драйверов устройств, написанный на подмножестве C++ на основе Embedded C++. Благодаря объектно-ориентированному дизайну, фреймворк предоставляет функции, общие для любого класса драйверов, что позволяет разрабатывать драйверы устройств быстрее и с меньшим объемом кода. I/O Kit является многопоточным, безопасным для симметричной многопроцессорной обработки (SMP) и поддерживает устройства с возможностью горячего подключения и автоматическую динамическую конфигурацию. Многие драйверы могут быть разработаны для работы из пользовательского пространства, что дополнительно повышает стабильность системы. Сбой драйвера пользовательского пространства не приведет к сбою ядра, однако сбой драйвера ядра приведет к сбою ядра. Примеры драйверов ядра включают драйверы дисковых и сетевых адаптеров, графические драйверы, драйверы для хост-контроллеров Universal Serial Bus (USB) и FireWire, а также драйверы для программного обеспечения виртуальных машин, такого как VirtualBox, Parallels Desktop for Mac и VMware Fusion.