From 423113c65659636755a3fe2db346e0e31428ee22 Mon Sep 17 00:00:00 2001 From: ChaosTong Date: Mon, 23 Mar 2020 15:08:22 +0800 Subject: [PATCH] Create README_ZH.md translate README.md to a chinese Version --- README_ZH.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 README_ZH.md diff --git a/README_ZH.md b/README_ZH.md new file mode 100644 index 0000000000..3d550b40dd --- /dev/null +++ b/README_ZH.md @@ -0,0 +1,67 @@ +# [iSH](https://ish.app) + +[![Build Status](https://travis-ci.org/tbodt/ish.svg?branch=master)](https://travis-ci.org/tbodt/ish) +[![goto counter](https://img.shields.io/github/search/tbodt/ish/goto.svg)](https://github.com/tbodt/ish/search?q=goto) +[![fuck counter](https://img.shields.io/github/search/tbodt/ish/fuck.svg)](https://github.com/tbodt/ish/search?q=fuck) + +

+ + + +

+ +这是一个使用用户模式 x86 仿真和系统调用转换, 运行在iOS上的 Linux shell项目. + +想要了解项目目前的状况, 详见 issue 和 提交记录. + +- [Testflight beta](https://testflight.apple.com/join/97i7KM8O) +- [Discord server](https://discord.gg/SndDh5y) +- [Wiki with help and tutorials](https://github.com/tbodt/ish/wiki) + +# 运行项目 + +本项目有 git 子模块, 在 clone 项目后, 确保执行 `--recurse-submodules` 或 `git 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 网站](https://alpinlinux.org/downloads/) 下载 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="` 命令. + +可用的日子通道: + +- `strace`: 最有用的类型, 记录几乎每个系统调用的参数和返回值. +- `instr`: 记录模拟器执行的每个指令, 会令让让所有执行变得很慢. +- `verbose`: 记录不属于其他类别的调试日志. +- `DEFAULT_CHANNEL` 查看更新此列表后是否添加了更多日志频道. + +# 关于 JIT + +可能我在写 iSH 中最有趣的部分就是 JIT 了. 它实际上不是真正的 JIT, 因为它不以机器代码为目标. 相反,它生成一个指向称为 gadgets 的函数的指针数组, 并且每个 gadget 都以对下一个函数的尾调用结束; 就像一些 Forth 解释器使用的线程化代码技术一样. 最终结果就是, 与纯仿真相比, 速度提高了大约3-5倍. + +不幸的是, 我决定用汇编语言编写几乎所有的 gadgets. 对于性能来说,这可能是一个很好的决定(虽然我永远也不确定), 但是对于可读性、可维护性和我的理智来说, 这是一个可怕的决定. 我不得不忍受来自编译器/汇编程序/链接器的大量的乱七八糟的东西, 这个举动是疯狂的. 就像有一个魔鬼在那里面, 让我的代码足够畸形, 如果不是这样的话, 那么请编造愚蠢的理由告诉我为什么它不能够编译. 为了在编写代码时保持理智, 我不得不忽略代码结构和命名方面的最佳实践。您将发现宏和变量具有诸如 `ss`、`s`和`a`等描述性的名称. 汇编器的宏嵌套超出传统的写法. 最重要的是, 几乎没有注释. + +所以一个警告: 长期接触此代码可能会导致你失去理智, 对 GAS 宏和链接器错误产生噩梦,或任何其他使人虚弱的副作用. 在加利福尼亚州这些代码会导致癌症、出生缺陷和生殖伤害. +