使用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等描述性名称的宏和变量。汇编器宏嵌套了遥不可及。最重要的是,几乎没有评论。
因此,警告:长期接触此代码可能会导致理智,噩梦对气宏和接头错误或其他许多使人衰弱的副作用。加利福尼亚州已知该法规会导致癌症,出生缺陷和生殖危害。