
ish builds/813
Оболочка Linux для iOS
iSH
Проект, позволяющий запустить командную оболочку Linux на iOS с помощью эмуляции x86 в пользовательском режиме и трансляции системных вызовов.
Текущее состояние проекта можно узнать в разделе Issues и в логах коммитов.
- Страница в App Store
- TestFlight beta
- Сервер Discord
- Вики с помощью и руководствами
- README中文 (如若未能保持最新,请提交PR以更新)
Разработка
В проекте используется подмодуль Git; обязательно клонируйте репозиторий с ключом --recurse-submodules или выполните git submodule update --init после клонирования.
Для сборки проекта вам понадобятся:
- Python 3
- Meson (
pip3 install meson)
- Meson (
- Ninja
- Clang и LLD (на Mac:
brew install llvm, на Linux:sudo apt install clang lldилиsudo pacman -S clang lldи т.п.) - sqlite3 (настолько распространён, что на Linux, скорее всего, уже установлен, а на Mac — точно. Если нет, выполните что-то вроде
sudo apt install libsqlite3-dev) - libarchive (
brew install libarchive,sudo port install libarchive,sudo apt install libarchive-dev) TODO: избавиться от этой зависимости
Сборка для iOS
Откройте проект в Xcode, откройте iSH.xcconfig и измените ROOT_BUNDLE_IDENTIFIER на что-нибудь уникальное. Также нужно обновить идентификатор команды разработчика в настройках сборки проекта (не цели!). Затем нажмите Run. Остальное сделают скрипты автоматически. Если возникнут проблемы, создавайте Issue, я постараюсь помочь.
Сборка инструмента командной строки для тестирования
Чтобы настроить окружение, перейдите в каталог проекта и выполните meson build, чтобы создать каталог сборки build. Затем перейдите в каталог build и выполните ninja.
Чтобы создать самодостаточную файловую систему Alpine Linux, скачайте tarball Alpine minirootfs для i386 с сайта Alpine и выполните ./tools/fakefsify, передав tarball minirootfs первым аргументом, а имя выходного каталога — вторым. Затем можно запускать программы внутри файловой системы Alpine с помощью ./ish -f alpine /bin/sh, если выходной каталог называется alpine. Если tools/fakefsify отсутствует в вашем каталоге сборки, это может быть связано с тем, что он не нашёл libarchive в вашей системе (см. выше способы его установки).
Вы можете заменить ish на tools/ptraceomatic, чтобы запускать программу в реальном процессе, выполнять пошаговое выполнение и сравнивать регистры на каждом шаге. Я использую это для отладки. Требуется 64-битный Linux 4.11 или новее.
Логирование
iSH имеет несколько каналов журналирования, которые можно включить во время сборки. По умолчанию все они отключены. Чтобы их включить:
- В Xcode: установите параметр
ISH_LOGв iSH.xcconfig в список каналов журналирования, разделённых пробелами. - В Meson (инструмент командной строки для тестирования): выполните
meson configure -Dlog="<список каналов журналирования через пробел>".
Доступные каналы:
strace: наиболее полезный канал, записывает параметры и возвращаемое значение почти каждого системного вызова.instr: записывает каждую инструкцию, выполненную эмулятором. Это сильно замедляет работу.verbose: отладочные логи, не подходящие под другие категории.- Ищите
DEFAULT_CHANNEL, чтобы узнать, не были ли добавлены новые каналы журналирования после обновления этого списка.
Замечание об интерпретаторе
Пожалуй, самое интересное, что я написал для iSH, — это интерпретатор. Это не совсем JIT, поскольку он не генерирует машинный код. Вместо этого он создаёт массив указателей на функции, называемые "gadgets", и каждый gadget завершается tailcall'ом к следующей функции; это похоже на технику threaded code, используемую некоторыми интерпретаторами Forth. В результате скорость работы увеличивается примерно в 3–5 раз по сравнению с эмуляцией с помощью простого switch-диспетчера.
К сожалению, я решил написать почти все gadgets на ассемблере. Вероятно, это было хорошим решением с точки зрения производительности (хотя я никогда не узнаю наверняка), но ужасным — с точки зрения читаемости, поддерживаемости и моего душевного спокойствия. Количество глупостей, которые мне пришлось терпеть от компилятора/ассемблера/линковщика, просто безумно. Такое ощущение, что там сидит демон, который следит, чтобы мой код был достаточно уродлив, а если нет, то придумывает идиотские причины, почему он не должен компилироваться. Чтобы сохранить рассудок при написании этого кода, мне пришлось игнорировать лучшие практики структурирования кода и именования. Вы найдёте макросы и переменные с такими описательными именами, как ss, s и a. Макросы ассемблера, вложенные до невероятности. И в довершение всего — почти нет комментариев.
Так что предупреждение: длительное воздействие этого кода может привести к потере рассудка, кошмарам о макросах GAS и ошибках линковщика, а также к любым другим изнурительным побочным эффектам. Этот код признан штатом Калифорния причиняющим рак, врождённые дефекты и нарушение репродуктивной функции.