
Гибридное ядро, объединяющее Mach, FreeBSD и IOKit для macOS и iOS. Обеспечивает основные системные службы, каркас драйверов и принудительное применение политик безопасности на x86_64 и ARM64.
Ядро XNU является частью операционной системы Darwin и используется в macOS и iOS. XNU — это аббревиатура от X is Not Unix. XNU — это гибридное ядро, объединяющее ядро Mach, разработанное в Университете Карнеги — Меллона, с компонентами из FreeBSD и написанным на C++ API для драйверов, называемым IOKit. XNU работает на архитектурах x86_64 и ARM64 как для однопроцессорных, так и для многопроцессорных конфигураций.
config — конфигурации для экспортируемых API на поддерживаемых архитектурах и платформах.SETUP — базовый набор инструментов для настройки ядра, управления версиями и управления символами kext.EXTERNAL_HEADERS — заголовки, взятые из других проектов, чтобы избежать циклов зависимости при сборке. Эти заголовки должны регулярно синхронизироваться при обновлении исходного кода.libkern — код библиотеки C++ IOKit для управления драйверами и kext.libsa — код начальной загрузки ядра для запуска.libsyscall — интерфейс системных вызовов для пользовательских программ.libkdd — исходный код пользовательской библиотеки для разбора данных ядра, например, структурированных данных ядра.makedefs — правила и определения верхнего уровня для сборки ядра.osfmk — подсистемы на основе ядра Mach.pexpert — платформозависимый код, такой как обработка прерываний, атомарные операции и т.д.security — интерфейсы политик обязательного контроля доступа и связанная реализация.bsd — код подсистем BSD.tools — набор утилит для тестирования, отладки и профилирования ядра.DEVELOPMENTСистема сборки xnu может собирать ядро на основе переменных KERNEL_CONFIGS и ARCH_CONFIGS, передаваемых в качестве аргументов.
Вот синтаксис:```text
make SDKROOT= ARCH_CONFIGS= KERNEL_CONFIGS=
Где:
* `<sdkroot>`: путь к macOS SDK на диске. (по умолчанию `/`)
* `<variant>`: может быть `debug`, `development`, `release`, `profile` и настраивает флаги компиляции и утверждения в коде ядра.
* `<arch>`: может быть допустимой архитектурой для сборки. (Например, `X86_64`)
Чтобы собрать ядро для той же архитектуры, что и работающая ОС, просто введите```text
make SDKROOT=macosx.internal
Кроме того, поддерживается настройка архитектур через ARCH_CONFIGS и конфигураций ядра с помощью KERNEL_CONFIGS.```text
make SDKROOT=macosx.internal ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=DEVELOPMENT
make SDKROOT=macosx.internal ARCH_CONFIGS=X86_64 KERNEL_CONFIGS="RELEASE DEVELOPMENT DEBUG"
> Примечание: По умолчанию архитектура устанавливается в соответствии с архитектурой сборочной машины, а конфигурация ядра по умолчанию задана для сборки в режиме `DEVELOPMENT`.
Это также создаст загрузочный образ, kernel.[config] и бинарный файл ядра с символами, kernel.[config].unstripped.
Чтобы установить ядро в DSTROOT, используйте цель `install_kernels`:```text
make install_kernels DSTROOT=/tmp/xnu-dst
Для более приятного опыта отладки ядра, с доступом ко всем локальным переменным и аргументам, но без всех дополнительных проверок ядра DEBUG, добавьте что-то вроде следующего в вашу команду make:```text CFLAGS_DEVELOPMENTARM64="-O0 -g -DKERNEL_STACK_MULTIPLIER=2" CXXFLAGS_DEVELOPMENTARM64="-O0 -g -DKERNEL_STACK_MULTIPLIER=2"
Помните заменить `DEVELOPMENT` и `ARM64` на соответствующие сборку и платформу.
> Дополнительные флаги: Вы можете передавать дополнительные флаги компилятору C в командной строке с помощью параметра сборки `EXTRA_CFLAGS`. Эти флаги добавляются к базовым `CFLAGS`, и значение по умолчанию для этого параметра — пустая строка.
>
> Этот параметр позволяет, например, выборочно включать отладочный код, защищённый макросом препроцессора. Пример использования...
>
> ```text
> make SDKROOT=macosx.internal PRODUCT_CONFIGS=j314s
> EXTRA_CFLAGS='-DKERNEL_STACK_MULTIPLIER=2'
> ```
* Для сборки с конфигурацией ядра RELEASE
```text
make KERNEL_CONFIGS=RELEASE SDKROOT=/path/to/SDK
```
### Сборка FAT-образа ядра
Укажите архитектуры в переменной окружения или при выполнении команды make.```text
make ARCH_CONFIGS="X86_64" exporthdrs all
Система сборки XNU может опционально выводить цветное форматирование вывода сборки. Чтобы включить это, вы можете либо установить переменную окружения XNU_LOGCOLORS в y, либо передать LOGCOLORS=y команде make.
Версия xnu извлекается из SDK или KDK путем чтения CFBundleVersion из файла System/Library/Extensions/System.kext/Info.plist. Это можно настроить, установив переменную RC_DARWIN_KERNEL_VERSION в окружении или в командной строке make.
Подробнее см. в doc/building/xnu_version.md.
По умолчанию во время фазы установки создается репозиторий отладочной информации DWARF; это «пакет» с именем kernel.development.<variant>.dSYM. Чтобы выбрать более старый формат отладочной информации STABS (где отладочная информация встроена в образ kernel.development.unstripped), установите переменную окружения BUILD_STABS.```sh export BUILD_STABS=1 make
## Сборка KernelCaches
Для тестирования ядра xnu необходимо собрать kernelcache, который связывает kext'ы и
ядро в единый загрузочный образ.
Для сборки kernelcache можно использовать следующие механизмы:
* Использование автоматической генерации kernelcache с помощью `kextd`.
Демон kextd отслеживает изменения в директории `/System/Library/Extensions`.
Таким образом можно установить новое ядро следующим образом:
```text
cp BUILD/obj/DEVELOPMENT/X86_64/kernel.development /System/Library/Kernels/
touch /System/Library/Extensions
ps -e | grep kextd
```
* Ручной вызов `kextcache` для сборки нового kernelcache.
```text
kextcache -q -z -a x86_64 -l -n -c /var/tmp/kernelcache.test -K /var/tmp/kernel.test /System/Library/Extensions
```
## Загрузка KernelCache на целевой машине
Разработочное ядро и iBoot поддерживают настройку аргументов загрузки, чтобы можно было безопасно загрузиться в тестовое ядро и, в случае проблем, безопасно вернуться к ранее используемому kernelcache.
Для настройки такого режима выполните следующие шаги:
1. Создайте кеш ядра с помощью команды kextcache как `/kernelcache.test`
2. Скопируйте существующие конфигурации загрузки в альтернативный файл
```sh
cp /Library/Preferences/SystemConfiguration/com.apple.Boot.plist /next_boot.plist
```
3. Обновите kernelcache и boot-args для вашей конфигурации
```sh
plutil -insert "Kernel Cache" -string "kernelcache.test" /next_boot.plist
plutil -replace "Kernel Flags" -string "debug=0x144 -v kernelsuffix=test " /next_boot.plist
```
4. Скопируйте новую конфигурацию в `/Library/Preferences/SystemConfiguration/`
```sh
cp /next_boot.plist /Library/Preferences/SystemConfiguration/boot.plist
```
5. Благословите (bless) том с новой конфигурацией.
```text
sudo -n bless --mount / --setBoot --nextonly --options "config=boot"
```
Флаг `--nextonly` указывает использовать конфигурацию `boot.plist` только для одной загрузки.
В случае паники ядра вы сможете легко перезагрузиться и вернуться к исходному ядру.
## Создание тегов и cscope
Настройте среду сборки и из корневой директории выполните: