Skip to content

Latest commit

 

History

History
67 lines (41 loc) · 4.49 KB

README_ZH.md

File metadata and controls

67 lines (41 loc) · 4.49 KB

Build Status goto counter fuck counter

这是一个使用用户模式 x86 仿真和系统调用转换, 运行在 iOS 上的 Linux shell 项目.

想要了解项目目前的状况, 详见 issue 和 提交记录.

运行项目

本项目有 git 子模块, 在 clone 项目后, 确保执行 --recurse-submodulesgit submodule update --init.

运行此项目你需要以下内容:

  • Python 3
  • Ninja
  • Meson (pip install meson)
  • Clang and LLD (在 mac 上, brew install llvm, 在 linux 上, sudo apt install clang lld 或者 sudo pacman -S clang lld 亦或 随你便)
  • sqlite3 (这个很基础或许已经安装在 Linux 上了, 并且肯定已经安装在 Mac 上了. 如果没有你可以运行像这样的命令 sudo apt install libsqlite3-dev)

为 iOS 构建

打开 Xcode 项目, 选择 iSH.xcconfig, 并且修改 ROOT_BUNDLE_IDENTIFIER 为其他的并不一样的值. 然后点击 运行. 应该有脚本已经帮你自动执行了相关操作. 如果遇到了任何问题, 提交 issuse, 我们会帮助你解决.

为测试构建命令行工具

设置你的运行环境, cd 到项目目录并且运行命令 meson build, 在 build 中创建构建目录. 然后 cd 到构建目录并执行 ninja.

要设置自包含的 Alpine linux 文件系统, 请从 Alpine 网站 下载 Alpine minirotfs tarball for i386 并运行 tools/fakefsify.py 脚本. 将 minirotfs tarball 指定为第一个参数,将输出目录的名称指定为第二个参数. 然后可以使用 /ish-f Alpine/bin/login-f root 在 Alpine 文件系统中运行, 假设输出目录名为 alpine.

你可以使用 tools/ptraceomatic 替换 ish, 以便在实际进程和单个步骤运行程序, 并在每个步骤中比较寄存器. 我都用它来调试. 需要64位 Linux 4.11 或更高版本

日志

iSH 有几个日志类型可以在构建时期启用. 默认情况下它们都被禁用了. 想要启用它们需要:

  • 在 Xcode 里: 将 iSH.xcconfig 中的 ISH_LOG 设置, 设置为以空格分隔的日志类型列表.
  • 在 Meson(测试命令行工具) 中: 执行 meson configure -Dlog="<space-separated list of log channels> 命令.

可用的日子通道:

  • strace: 最有用的类型, 记录几乎每个系统调用的参数和返回值.
  • instr: 记录模拟器执行的每个指令, 会令让让所有执行变得很慢.
  • verbose: 记录不属于其他类别的调试日志.
  • DEFAULT_CHANNEL 查看更新此列表后是否添加了更多日志频道.

关于 JIT

可能我在写 iSH 中最有趣的部分就是 JIT 了. 它实际上不是真正的 JIT, 因为它不以机器代码为目标. 相反,它生成一个指向称为 gadgets 的函数的指针数组, 并且每个 gadget 都以对下一个函数的尾调用结束; 就像一些 Forth 解释器使用的线程化代码技术一样. 最终结果就是, 与纯仿真相比, 速度提高了大约3-5倍.

不幸的是, 我决定用汇编语言编写几乎所有的 gadgets. 对于性能来说,这可能是一个很好的决定(虽然我永远也不确定), 但是对于可读性、可维护性和我的理智来说, 这是一个可怕的决定. 我不得不忍受来自编译器/汇编程序/链接器的大量的乱七八糟的东西, 这个举动是疯狂的. 就像有一个魔鬼在那里面, 让我的代码足够畸形, 如果不是这样的话, 那么请编造愚蠢的理由告诉我为什么它不能够编译. 为了在编写代码时保持理智, 我不得不忽略代码结构和命名方面的最佳实践。您将发现宏和变量具有诸如 sssa等描述性的名称. 汇编器的宏嵌套超出传统的写法. 最重要的是, 几乎没有注释.

所以一个警告: 长期接触此代码可能会导致你失去理智, 对 GAS 宏和链接器错误产生噩梦,或任何其他使人虚弱的副作用. 在加利福尼亚州这些代码会导致癌症、出生缺陷和生殖伤害.