使用USERMODE X86和SYSCALL TRANSLATION,一個項目可以在iOS上運行Linux Shell。
對於項目的當前狀態,請選中“問題”選項卡和提交日誌。
該項目具有git subpodule,請確保與--recurse-submodules或在克隆後運行git submodule update --init 。
您需要這些東西來構建項目:
pip3 install meson )brew install llvm ,Linux上, sudo apt install clang lld或sudo pacman -S clang lld或erthing)sudo apt install libsqlite3-dev它可能已經安裝在Linux上,並且肯定已經安裝在Mac上。brew install libarchive , sudo port install libarchive , sudo apt install libarchive-dev )todo:捆綁此依賴關係打開XCode的項目,打開ish.xcconfig,然後將ROOT_BUNDLE_IDENTIFIER更改為獨特的東西。您還需要更新項目中的開發團隊ID(不是目標!)構建設置。然後單擊“運行”。有些腳本應該自動執行其他操作。如果您遇到任何問題,請打開一個問題,我會嘗試提供幫助。
要設置您的環境,請參考項目並運行meson build以在build中創建構建目錄。然後CD到構建目錄並運行ninja 。
要設置一個獨立的Alpine Linux文件系統,請從Alpine網站下載i386的Alpine Minirootfs Tarball,然後運行./tools/fakefsify ,將Minirootfs Tarball作為第一個參數,而輸出目錄的名稱為第二個參數。然後,假設輸出目錄稱為alpine ,則可以使用./ish -f alpine /bin/sh在高山文件系統內運行內容。如果您的構建目錄中不存在tools/fakefsify ,那可能是因為它在系統上找不到Libarchive(有關安裝它的方法,請參見上文。)
您可以用tools/ptraceomatic替換ish ,以在真實的過程中運行該程序,並單步步驟並在每個步驟中比較寄存器。我將其用於調試。需要64位Linux 4.11或更高版本。
ISH有幾個可在構建時間啟用的記錄頻道。默認情況下,所有這些都是禁用的。使他們能夠:
ISH_LOG設置設置為ish.xcconfig中的設置,以將日誌通道的空間分隔列表。meson configure -Dlog="<space-separated list of log channels>" 。可用渠道:
strace :最有用的通道,記錄幾乎每個系統調用的參數和返回值。instr :記錄仿真器執行的每個指令。這會減慢很多。verbose :不適合其他類別的調試日誌。DEFAULT_CHANNEL以查看此列表已更新以來是否添加了更多日誌通道。作為ISH的一部分,我寫的最有趣的事情可能是口譯員。這不是一個jit,因為它沒有針對機器代碼。取而代之的是,它為稱為小工具的函數生成了一系列指針,每個小工具都以尾聲結尾。就像某些第四口解釋者使用的螺紋代碼技術一樣。與使用更簡單的開關調度相比,結果是大約3-5倍的加速度約為3-5倍。
不幸的是,我決定用彙編語言編寫幾乎所有的小工具。這可能是關於績效的一個好決定(儘管我永遠無法確定),但是關於可讀性,可維護性和理智的可怕決定。我不得不從編譯器/彙編器/鏈接器中忍受的廢話數量是瘋狂的。就像那裡有一個惡魔,確保我的代碼已經足夠變形,如果沒有,則構成了愚蠢的原因,為什麼它不應該編譯。為了在編寫此代碼時保持理智,我不得不忽略代碼結構和命名方面的最佳實踐。您會發現帶有ss和s和a等描述性名稱的宏和變量。彙編器宏嵌套了遙不可及。最重要的是,幾乎沒有評論。
因此,警告:長期接觸此代碼可能會導致理智,噩夢對氣宏和接頭錯誤或其他許多使人衰弱的副作用。加利福尼亞州已知該法規會導致癌症,出生缺陷和生殖危害。