
Un projet pour faire fonctionner un shell Linux sur iOS, en utilisant l'émulation x86 en mode utilisateur et la traduction d'appels système.
Pour l'état actuel du projet, consultez l'onglet des issues et les journaux de commits.
Ce projet a un sous-module git, assurez-vous de cloner avec --recurse-submodules ou d'exécuter git submodule update --init après le clonage.
Vous aurez besoin de ces éléments pour construire le projet :
pip3 install meson)brew install llvm, sur linux, sudo apt install clang lld ou sudo pacman -S clang lld ou autre)sudo apt install libsqlite3-dev)brew install libarchive, sudo port install libarchive, sudo apt install libarchive-dev) TODO: empaqueter cette dépendanceOuvrez le projet dans Xcode, ouvrez iSH.xcconfig, et modifiez ROOT_BUNDLE_IDENTIFIER en quelque chose d'unique. Vous devrez également mettre à jour l'ID de l'équipe de développement dans les paramètres de construction du projet (pas de la cible !). Ensuite, cliquez sur Run. Il y a des scripts qui devraient faire tout le reste automatiquement. Si vous rencontrez des problèmes, ouvrez une issue et j'essaierai de vous aider.
Pour configurer votre environnement, placez-vous dans le projet et exécutez meson build pour créer un répertoire de construction dans build. Ensuite, allez dans ce répertoire et exécutez ninja.
Pour configurer un système de fichiers Alpine Linux autonome, téléchargez l'archive minirootfs Alpine pour i386 depuis le site d'Alpine et exécutez ./tools/fakefsify, avec l'archive minirootfs comme premier argument et le nom du répertoire de sortie comme second argument. Ensuite, vous pouvez exécuter des choses dans le système de fichiers Alpine avec ./ish -f alpine /bin/sh, en supposant que le répertoire de sortie s'appelle alpine. Si tools/fakefsify n'existe pas dans votre répertoire de construction, cela peut être dû au fait qu'il n'a pas trouvé libarchive sur votre système (voir ci-dessus pour les moyens de l'installer).
Vous pouvez remplacer ish par tools/ptraceomatic pour exécuter le programme dans un vrai processus et exécuter pas à pas et comparer les registres à chaque étape. Je l'utilise pour le débogage. Nécessite Linux 64 bits 4.11 ou plus.
iSH dispose de plusieurs canaux de journalisation qui peuvent être activés lors de la construction. Par défaut, tous sont désactivés. Pour les activer :
ISH_LOG dans iSH.xcconfig sur une liste de canaux de journalisation séparés par des espaces.meson configure -Dlog="<liste de canaux de journalisation séparés par des espaces>".Canaux disponibles :
strace : Le canal le plus utile, enregistre les paramètres et la valeur de retour de presque tous les appels système.instr : Enregistre chaque instruction exécutée par l'émulateur. Cela ralentit beaucoup les choses.verbose : Journaux de débogage qui ne rentrent pas dans une autre catégorie.DEFAULT_CHANNEL avec grep pour voir si d'autres canaux de journalisation ont été ajoutés depuis la mise à jour de cette liste.Probablement la chose la plus intéressante que j'ai écrite dans le cadre d'iSH est l'interpréteur. Ce n'est pas tout à fait un JIT car il ne cible pas le code machine. Au lieu de cela, il génère un tableau de pointeurs vers des fonctions appelées gadgets, et chaque gadget se termine par un tailcall vers la fonction suivante ; comme la technique de code fileté utilisée par certains interpréteurs Forth. Le résultat est une accélération d'environ 3 à 5 fois par rapport à l'émulation utilisant une simple dispatch par switch.
Malheureusement, j'ai pris la décision d'écrire presque tous les gadgets en langage assembleur. C'était probablement une bonne décision en termes de performances (même si je ne le saurai jamais avec certitude), mais une horrible décision en termes de lisibilité, de maintenabilité et de ma santé mentale. La quantité de conneries que j'ai dû supporter de la part du compilateur/assembleur/éditeur de liens est insensée. C'est comme s'il y avait un démon là-dedans qui s'assure que mon code est suffisamment déformé, et sinon, invente des raisons stupides pour qu'il ne compile pas. Pour rester sain d'esprit en écrivant ce code, j'ai dû ignorer les bonnes pratiques en matière de structure et de nommage. Vous trouverez des macros et des variables avec des noms aussi descriptifs que ss et s et a. Des macros assembleur imbriquées à un degré incroyable. Et pour couronner le tout, il n'y a presque aucun commentaire.
Donc un avertissement : Une exposition à long terme à ce code peut entraîner une perte de santé mentale, des cauchemars à propos des macros GAS et des erreurs de l'éditeur de liens, ou tout autre nombre d'effets secondaires débilitants. Ce code est connu par l'État de Californie pour causer le cancer, des malformations congénitales et des dommages à la reproduction.