Usermode x86エミュレーションとSyscall翻訳を使用して、iOSでLinuxシェルを実行するプロジェクト。
プロジェクトの現在のステータスについては、[問題]タブとコミットログを確認してください。
このプロジェクトにはGitサブモジュールがあります。 --recurse-submodulesまたはgit submodule update --init実行してください。
プロジェクトを構築するためにこれらのものが必要です。
pip3 install meson )brew install llvm 、Linux、 sudo apt install clang lldまたはsudo pacman -S clang lldなど)sudo apt install libsqlite3-devされています。brew install libarchive 、 sudo port install libarchive 、 sudo apt install libarchive-dev ):この依存関係を束ねるXcodeでプロジェクトを開き、ish.xcconfigを開き、 ROOT_BUNDLE_IDENTIFIERユニークなものに変更します。また、プロジェクトの開発チームIDを更新する必要があります(ターゲットではありません!)ビルド設定が必要です。次に、[実行]をクリックします。他のすべてを自動的に行う必要があるスクリプトがあります。問題が発生した場合は、問題を開いてください。私は助けようとします。
環境をセットアップするには、CDをプロジェクトに設定し、 meson buildを実行してBuild Directoryをbuildします。次に、ビルドディレクトリにCDを使用し、 ninjaを実行します。
自己完結型アルパインLinuxファイルシステムをセットアップするには、Alpine Webサイトからi386用のAlpine Minirootfs Tarballをダウンロードし、MiniRootfs Tarballを最初の引数として、出力ディレクトリの名前を2番目の引数として実行し./tools/fakefsify 。その後、出力ディレクトリがalpineと呼ばれると仮定して./ish -f alpine /bin/shでAlpine Files -System内で物事を実行できます。ビルドディレクトリにtools/fakefsify存在しない場合、それはシステムにLibarchiveを見つけることができなかったためかもしれません(インストールする方法については上記を参照してください。)
ishをtools/ptraceomaticに置き換えて、実際のプロセスと単一ステップでプログラムを実行し、各ステップでレジスタを比較できます。デバッグに使用します。 64ビットLinux 4.11以降が必要です。
ISHには、ビルド時に有効にできるいくつかのロギングチャネルがあります。デフォルトでは、それらはすべて無効になっています。それらを有効にするには:
ISH_LOG設定を、ログチャネルのスペース分離リストに設定します。meson configure -Dlog="<space-separated list of log channels>"を実行します。利用可能なチャネル:
strace :最も便利なチャネルは、ほぼすべてのシステム呼び出しのパラメーターと戻り値を記録します。instr :エミュレータによって実行されるすべての命令を記録します。これにより、物事は非常に遅くなります。verbose :別のカテゴリに適合しないログをデバッグします。DEFAULT_CHANNELのgrepは、このリストが更新されて以来、より多くのログチャネルが追加されているかどうかを確認します。おそらく、私がISHの一部として書いた最も興味深いことは、通訳です。マシンコードをターゲットにしていないため、JITではありません。代わりに、ガジェットと呼ばれる関数へのポインターの配列を生成し、各ガジェットは次の関数のテールコールで終了します。一部のフォース通訳者が使用するスレッドコードテクニックのように。その結果、よりシンプルなスイッチディスパッチを使用したエミュレーションと比較して、約3〜5倍のスピードアップが得られます。
残念ながら、私はアセンブリ言語でほぼすべてのガジェットを書くことを決定しました。これはおそらくパフォーマンスに関する良い決断でした(確かに私は決して知りませんが)が、読みやすさ、保守性、私の正気に関する恐ろしい決定でした。コンパイラー/アセンブラー/リンカーから我慢しなければならなかったでたらめの量は非常識です。そこには、私のコードが十分に変形していることを確認する悪魔があるようなものであり、そうでない場合は、コンパイルすべきではない愚かな理由を構成します。このコードを書く間正気を保つために、コード構造と命名のベストプラクティスを無視する必要がありました。 ssやs 、 aなどの記述名を持つマクロと変数があります。アセンブラーマクロは信じられないほどネストされています。そして、それを締めくくるために、ほとんどコメントはありません。
したがって、警告:このコードへの長期的な暴露は、正気の喪失、ガスマクロとリンカーエラーに関する悪夢、または他の衰弱性の副作用を引き起こす可能性があります。このコードは、カリフォルニア州で癌、先天性欠損、および生殖害を引き起こすことが知られています。