Руководство
Как всё устроено
От кнопки питания до приложения каждый шаг hakios — маленькая программа с одной задачей. Эта страница один раз проходит всю цепочку, чтобы остальное руководство читалось легко.
Цепочка загрузки на телефоне
собственный загрузчик телефона (fastboot)
└─ fastboot boot ──► HakiOS UEFI (Mu-Silicium) или HakiOS U-Boot ← в памяти, ничего не прошивается
└─ loader.efi (xnuloader)
└─ XNU (hakios-kernel) + драйверы, выбранные в .config
└─ launchd ──► пользовательское пространство Darwin, которое принесли вы
- Загрузчик телефона. Когда он разблокирован,
fastboot bootпринимает образ по USB и запускает его из памяти../xl enterделает это за вас. - HakiOS UEFI или HakiOS U-Boot. Небольшая прошивка, которая готовит экран и память. Прокладка копирует наш пакет по адресу
0xF0000000, и прошивка запускает из негоloader.efi. Если вы не собирали Silicium с драйверами производителя вашего телефона,xlвозьмёт U-Boot — ему файлы производителя не нужны. - Загрузчик (
xnuloader/). Сам говорит по протоколу fastboot (виден какproduct: xnuloader), принимает ядро, образ системы и аргументы, собирает дерево устройств, которое ждёт XNU, и запускает ядро. Когда сессия заканчивается, пишет лог вlogdumpи ждёт следующей команды. - XNU с нашими драйверами. Ядро Apple с патчем (
xnu/hakios.patch) и встроенными драйверами: тач, память, GPU, звук, Wi-Fi, модем и другие. Каждый драйвер стартует, только если включён его аргумент. - launchd и пользовательское пространство. Первый процесс. Дальше — пользовательское пространство Darwin, собранное из вашего образа восстановления, и наши небольшие программы и библиотеки в
/redwood.
Цепочка загрузки в QEMU
То же ядро и тот же загрузчик работают в машине virt QEMU (Cortex-A76, GICv3, UEFI из edk2). Вместо драйверов телефона — четыре virtio-драйвера: ввод, блочное устройство, звук и сеть. Открытому ядру ничего от Apple не нужно; полному пользовательскому пространству Darwin в QEMU нужен ваш образ восстановления, как и на телефоне.
Одна конфигурация, два результата
configs/common_defconfig ← для всех устройств
фрагмент socs/<soc> ← семейство чипа, например sc7280.config
фрагмент devices/<name> ← телефон, например redwood.config
│
▼ make redwood_defconfig
.config
┌────┴─────────────────────────────┐
CONFIG_HAKIOS_ADRENO=y CONFIG_GPU=y
→ драйвер встроен в ядро → gpu=1 в командной строке
CONFIG_HAKIOS_<NAME>=yвстраивает драйвер в ядро.- Любой другой
CONFIG_<NAME>становится аргументом загрузки:CONFIG_GPU=y— этоgpu=1,CONFIG_HAPTIC=5— этоhaptic=5. make configпроверяет файл и говорит, что не так и почему. У командной строки лимит в 607 символов, и проверка считает их за вас.tools/hakios-config.py help GPUобъясняет любой символ.
Что где лежит
| Репозиторий | Что внутри |
|---|---|
| hakios-xnu-kernel | порт ядра, все общие драйверы, загрузчик, наши программы, инструменты, xl, справочная документация |
| hakios-sm7325 | POCO X5 Pro 5G: device.conf, конфигурация, скрипт прошивок, платформа UEFI и слой чипа SC7280 |
| hakios-uefi | HakiOS UEFI: Mu-Silicium на закреплённом коммите с нашим путём загрузки, именем и логотипом |
| hakios-metal | модель команд Metal на GPU Adreno, на C++ |
| hakios-mt6768 | экспериментальный порт на MediaTek (Infinix Hot 20) со своим загрузчиком |
tools/hakios-device.py sync клонирует репозитории устройств и UEFI в основное дерево (devices/<name>/, uefi/) на ревизиях из devices/manifest.conf.
Что пишется на телефон
По умолчанию — только лог загрузчика (несколько КБ) в раздел logdump в конце каждой сессии. Ядро пишет в память, только если вы попросите ufs_write=1, и только в раздел darwin, который вы создаёте сами; всё остальное запрещено. Список всего, что может писать, проверяется в CI (tools/provenance.allow).
Исключение — установка рядом с Android. Установка рядом с Android прошивает
boot_a, уменьшаетuserdataи стирает данные Android. Это отдельная ручная процедура; ничто в этом руководстве её не выполняет.
Три слоя с точки зрения права
- Открытое ядро: порт ядра, загрузчик, драйверы и инструменты. Исходный код; собирается и работает без чего-либо от Apple и от какого-либо телефона.
- Пользовательское пространство, которое приносите вы: проект не распространяет его и ничего не расшифровывает и не патчит, чтобы его получить. Можно ли использовать его на этом железе — ваше решение и ваша ответственность.
- Сервисы Apple: не поддерживаются; изменение, которое пытается выдать устройство за iPhone для серверов Apple, отклоняется.
Лицензии: изменения XNU и драйверы — под Apple Public Source License 2.0, как сам XNU; всё остальное наше — MIT.