Ein Projekt, mit dem eine Linux -Shell auf iOS ausgeführt werden kann, wobei die Usermode x86 -Emulation und die Syskall -Übersetzung verwendet werden.
Überprüfen Sie für den aktuellen Status des Projekts die Registerkarte "Themen" und die Commit -Protokolle.
Dieses Projekt verfügt über ein Git-Submodul, vergewissern Sie sich, dass Sie nach dem Klonieren mit --recurse-submodules ausführen oder git submodule update --init ausführen.
Sie benötigen diese Dinge, um das Projekt zu erstellen:
pip3 install meson )brew install llvm , unter Linux, sudo apt install clang lld oder sudo pacman -S clang lld oder was auch immer)sudo apt install libsqlite3-dev dass es möglicherweise bereits unter Linux installiert ist und definitiv bereits auf dem Mac installiert ist.brew install libarchive , sudo port install libarchive , sudo apt install libarchive-dev ) Todo: Bündel dieser Abhängigkeit Öffnen Sie das Projekt in Xcode, öffnen Sie ish.xcconfig und ändern Sie ROOT_BUNDLE_IDENTIFIER in etwas Einzigartiges. Sie müssen auch die Entwicklungsteam -ID im Projekt (nicht Ziel!) Build -Einstellungen aktualisieren. Klicken Sie dann auf Ausführen. Es gibt Skripte, die automatisch alles andere tun sollten. Wenn Sie auf Probleme stoßen, öffnen Sie ein Problem und ich werde versuchen zu helfen.
Um Ihre Umgebung, CD an das Projekt einzurichten, und meson build ausführen, um ein Build -Verzeichnis im build zu erstellen. Dann CD zum Build -Verzeichnis und rennen Sie ninja .
Um ein in sich geschlossenes Alpine Linux-Dateisystem einzurichten, laden Sie den Alpine Minirootfs-Tarball für i386 von der Alpine-Website herunter und rennen Sie ./tools/fakefsify Anschließend können Sie Dinge im Alpine -Dateisystem mit ./ish -f alpine /bin/sh ausführen, vorausgesetzt, das Ausgabeverzeichnis wird als alpine bezeichnet. Wenn tools/fakefsify in Ihrem Build -Verzeichnis für Sie nicht vorhanden ist, könnte dies möglicherweise nicht in Ihrem System Libarchive finden (siehe oben, um es zu installieren.)
Sie können ish durch tools/ptraceomatic ersetzen, um das Programm in einem realen Prozess und einem einzelnen Schritt auszuführen und die Register bei jedem Schritt zu vergleichen. Ich benutze es zum Debuggen. Benötigt 64-Bit-Linux 4.11 oder höher.
ISH verfügt über mehrere Protokollierungskanäle, die zum Zeitpunkt der Erstellung aktiviert werden können. Standardmäßig sind alle deaktiviert. Um sie zu aktivieren:
ISH_LOG in ish.xcconfig auf eine platzgetrennte Liste von Protokollkanälen.meson configure -Dlog="<space-separated list of log channels>" .Verfügbare Kanäle:
strace : Der nützlichste Kanal, protokolliert die Parameter und den Rückgabewert fast jedem Systemaufruf.instr : protokolliert jeden vom Emulator ausgeführten Befehl. Dies verlangsamt die Dinge sehr.verbose : Debug -Protokolle, die nicht in eine andere Kategorie passen.DEFAULT_CHANNEL um festzustellen, ob seit der Aktualisierung dieser Liste weitere Protokollkanäle hinzugefügt wurden.Möglicherweise ist das Interessanteste, was ich als Teil von ISH geschrieben habe, der Dolmetscher. Es ist nicht ganz ein JIT, da es keinen Ziel -Maschinencode hat. Stattdessen generiert es eine Reihe von Zeigern auf Funktionen, die als Gadgets bezeichnet werden, und jedes Gerät endet mit einem Tailcall zur nächsten Funktion. wie die Thread -Code -Technik, die von einigen Fortin -Dolmetschern verwendet wird. Das Ergebnis ist eine Beschleunigung von ungefähr 3-5x im Vergleich zur Emulation mit einem einfacheren Schalterversand.
Leider habe ich die Entscheidung getroffen, fast alle Geräte in der Versammlungssprache zu schreiben. Dies war wahrscheinlich eine gute Entscheidung in Bezug auf die Leistung (obwohl ich es nie genau wissen werde), aber eine schreckliche Entscheidung in Bezug auf Lesbarkeit, Wartbarkeit und meine geistige Gesundheit. Die Menge an Bullshit, die ich aus dem Compiler/Assembler/Linker abfinden musste, ist verrückt. Es ist, als ob ein Dämon da drin ist, der sicherstellt, dass mein Code ausreichend deformiert ist, und wenn nicht, macht es dumme Gründe, warum er nicht kompilieren sollte. Um während des Schreibens dieses Codes gesund zu bleiben, musste ich Best Practices in der Codestruktur und -namen ignorieren. Sie finden Makros und Variablen mit so beschreibenden Namen wie ss und s und a Assembler Macros verschachtelte sich nicht an Glauben. Und um das Ganze abzurunden, gibt es fast keine Kommentare.
Eine Warnung: Langfristige Exposition gegenüber diesem Code kann zu Verlusten von Vernunft, Albträumen über Gasmakros und Linkerfehler oder eine beliebige Anzahl anderer schwächender Nebenwirkungen führen. Dieser Kodex ist dem Bundesstaat Kalifornien bekannt, Krebs, Geburtsfehler und Fortpflanzungsschaden zu verursachen.