Руководство

Как всё устроено

От кнопки питания до приложения каждый шаг hakios — маленькая программа с одной задачей. Эта страница один раз проходит всю цепочку, чтобы остальное руководство читалось легко.

Цепочка загрузки на телефоне

собственный загрузчик телефона (fastboot)
   └─ fastboot boot  ──►  HakiOS UEFI (Mu-Silicium)  или  HakiOS U-Boot      ← в памяти, ничего не прошивается
                              └─ loader.efi  (xnuloader)
                                    └─ XNU  (hakios-kernel)  + драйверы, выбранные в .config
                                          └─ launchd  ──►  пользовательское пространство Darwin, которое принесли вы
  1. Загрузчик телефона. Когда он разблокирован, fastboot boot принимает образ по USB и запускает его из памяти. ./xl enter делает это за вас.
  2. HakiOS UEFI или HakiOS U-Boot. Небольшая прошивка, которая готовит экран и память. Прокладка копирует наш пакет по адресу 0xF0000000, и прошивка запускает из него loader.efi. Если вы не собирали Silicium с драйверами производителя вашего телефона, xl возьмёт U-Boot — ему файлы производителя не нужны.
  3. Загрузчик (xnuloader/). Сам говорит по протоколу fastboot (виден как product: xnuloader), принимает ядро, образ системы и аргументы, собирает дерево устройств, которое ждёт XNU, и запускает ядро. Когда сессия заканчивается, пишет лог в logdump и ждёт следующей команды.
  4. XNU с нашими драйверами. Ядро Apple с патчем (xnu/hakios.patch) и встроенными драйверами: тач, память, GPU, звук, Wi-Fi, модем и другие. Каждый драйвер стартует, только если включён его аргумент.
  5. 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. Это отдельная ручная процедура; ничто в этом руководстве её не выполняет.

Три слоя с точки зрения права

  1. Открытое ядро: порт ядра, загрузчик, драйверы и инструменты. Исходный код; собирается и работает без чего-либо от Apple и от какого-либо телефона.
  2. Пользовательское пространство, которое приносите вы: проект не распространяет его и ничего не расшифровывает и не патчит, чтобы его получить. Можно ли использовать его на этом железе — ваше решение и ваша ответственность.
  3. Сервисы Apple: не поддерживаются; изменение, которое пытается выдать устройство за iPhone для серверов Apple, отклоняется.

Лицензии: изменения XNU и драйверы — под Apple Public Source License 2.0, как сам XNU; всё остальное наше — MIT.

Исходник этой страницы