Skip to content

Latest commit

 

History

History
67 lines (43 loc) · 6.83 KB

README_JP.md

File metadata and controls

67 lines (43 loc) · 6.83 KB

Build Status goto counter fuck counter

iSHは、ユーザーモードのx86エミュレーションとシステムコールの翻訳を使用して、iOS上でLinuxシェルを実行するプロジェクトです。

プロジェクトの現状については、issueタブとコミットログを確認してください。

ハッキング

このプロジェクトにはgitサブモジュールがあります。--recurse-submodulesを使用してクローンするか、クローン後にgit submodule update --initを実行してください。

プロジェクトをビルドするには、以下のものが必要です:

  • Python 3
    • Meson (pip3 install 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 libarchivesudo port install libarchivesudo apt install libarchive-devなど)

iOS用にビルドする

プロジェクトをXcodeで開き、iSH.xcconfigを開いて、ROOT_BUNDLE_IDENTIFIERを一意の値に変更します。また、プロジェクト(ターゲットではなく!)のビルド設定で開発チームIDを更新する必要があります。その後、実行をクリックします。他のすべてを自動的に行うスクリプトがあります。問題が発生した場合は、issueを開いてください。お手伝いします。

テスト用のコマンドラインツールをビルドする

環境を設定するには、プロジェクトディレクトリに移動し、meson buildを実行してbuildディレクトリを作成します。その後、buildディレクトリに移動し、ninjaを実行します。

自己完結型のAlpine linuxファイルシステムを設定するには、Alpineウェブサイトからi386用のAlpine minirootfs tarballをダウンロードし、./tools/fakefsifyを実行します。minirootfs tarballを最初の引数として、出力ディレクトリの名前を2番目の引数として指定します。その後、./ish -f alpine /bin/shを使用して、Alpineファイルシステム内でコマンドを実行できます。出力ディレクトリの名前がalpineであると仮定します。tools/fakefsifyがbuildディレクトリに存在しない場合、それはシステム上でlibarchiveを見つけられなかったためかもしれません(インストール方法については上記を参照してください)。

ishtools/ptraceomaticに置き換えることで、実際のプロセスでプログラムを実行し、各ステップでレジスタを比較しながらシングルステップ実行できます。デバッグに使用します。64ビットLinux 4.11以降が必要です。

ロギング

iSHには、ビルド時に有効にできるいくつかのロギングチャネルがあります。デフォルトでは、すべて無効になっています。有効にするには:

  • Xcodeで:iSH.xcconfigのISH_LOG設定をスペースで区切られたログチャネルのリストに設定します。
  • Meson(テスト用のコマンドラインツール)で:meson configure -Dlog="<ログチャネルのスペース区切りリスト>"を実行します。

利用可能なチャネル:

  • strace:最も有用なチャネルで、ほぼすべてのシステムコールのパラメータと戻り値をログに記録します。
  • instr:エミュレータが実行するすべての命令をログに記録します。これにより、実行速度が大幅に低下します。
  • verbose:他のカテゴリに該当しないデバッグログを記録します。
  • DEFAULT_CHANNELをgrepして、このリストが更新された後に追加されたログチャネルがあるかどうかを確認します。

JITに関する注意事項

iSHの一部として書いた中で最も興味深いものの1つはJITです。実際には、マシンコードをターゲットにしていないため、実際のJITではありません。代わりに、ガジェットと呼ばれる関数へのポインタの配列を生成し、各ガジェットは次の関数へのテールコールで終了します。これは、一部のForthインタープリタが使用するスレッド化コード技術に似ています。その結果、純粋なエミュレーションと比較して、速度が約3〜5倍向上します。

残念ながら、ほぼすべてのガジェットをアセンブリ言語で書くという決定を下しました。これは、パフォーマンスに関してはおそらく良い決定でしたが(確かではありませんが)、可読性、保守性、および私の正気に関してはひどい決定でした。コンパイラ、アセンブラ、リンカからのたくさんの問題に対処しなければなりませんでした。コードが十分に変形していることを確認し、そうでない場合は、コンパイルできない理由をでっち上げる悪魔がいるようなものです。このコードを書いている間に正気を保つために、コード構造と命名のベストプラクティスを無視しなければなりませんでした。sssaなどの説明的な名前を持つマクロや変数が見つかるでしょう。信じられないほどネストされたアセンブラマクロ。そして、ほとんどコメントがありません。

したがって、警告です:このコードに長期間さらされると、正気を失い、GASマクロやリンカエラーについての悪夢に悩まされる可能性があります。カリフォルニア州では、このコードが癌、先天性欠損症、および生殖障害を引き起こすことが知られています。