Usermode x86 에뮬레이션 및 Syscall Translation을 사용하여 iOS에서 Linux 쉘을 실행하는 프로젝트.
프로젝트의 현재 상태에 대해서는 문제 탭과 커밋 로그를 확인하십시오.
이 프로젝트에는 git 하위 모듈이 있으며, 클로닝 후 --recurse-submodules 또는 실행 git submodule update --init 로 클론하십시오.
프로젝트를 구축하려면 이러한 것들이 필요합니다.
pip3 install meson )brew install llvm , Linux, sudo apt install clang lld 또는 sudo pacman -S clang lld 등)sudo apt install libsqlite3-dev 와 같은 작업을 수행하십시오).brew install libarchive , sudo port install libarchive , sudo apt install libarchive-dev ) todo :이 종속성을 번들로 묶습니다. Xcode에서 프로젝트를 열고 iSH.xcConfig를 열고 ROOT_BUNDLE_IDENTIFIER 독특한 것으로 변경하십시오. 또한 프로젝트에서 개발 팀 ID를 업데이트해야합니다 (대상이 아님). 그런 다음 실행을 클릭하십시오. 다른 모든 것을 자동으로 수행 해야하는 스크립트가 있습니다. 문제가 발생하면 문제를 열면 도와 드리겠습니다.
환경을 설정하려면 프로젝트에 CD를 넣고 meson build 실행하여 build 에서 빌드 디렉토리를 만듭니다. 그런 다음 빌드 디렉토리로 CD를하고 ninja 실행하십시오.
자체 포함 된 알파인 Linux 파일 시스템을 설정하려면 Alpine 웹 사이트에서 i386의 Alpine Minirootfs Tarball을 다운로드하고 ./tools/fakefsify 실행하고 Minirootfs Tarball을 첫 번째 인수와 출력 디렉토리의 이름으로 두 번째 인수로 실행하십시오. 그런 다음 출력 디렉토리를 alpine 이라고 가정하면 ./ish -f alpine /bin/sh 로 Alpine 파일 시스템 내부에서 물건을 실행할 수 있습니다. 빌드 디렉토리에 tools/fakefsify 존재하지 않는 경우 시스템에서 libarchive를 찾을 수 없기 때문일 수 있습니다 (위의 설치 방법은 위에서 참조하십시오.)
ish tools/ptraceomatic 으로 교체하여 실제 프로세스와 단일 단계에서 프로그램을 실행하고 각 단계의 레지스터를 비교할 수 있습니다. 디버깅에 사용합니다. 64 비트 Linux 4.11 이상이 필요합니다.
ISH에는 빌드 타임에 활성화 될 수있는 몇 가지 로깅 채널이 있습니다. 기본적으로 모든 것이 비활성화됩니다. 그들을 가능하게하기 위해 :
ISH_LOG 설정을 공간 분리 된 로그 채널 목록으로 설정하십시오.meson configure -Dlog="<space-separated list of log channels>" .사용 가능한 채널 :
strace : 가장 유용한 채널은 거의 모든 시스템 호출의 매개 변수와 리턴 값을 기록합니다.instr : 에뮬레이터가 실행 한 모든 명령어를 기록합니다. 이것은 물건을 많이 느리게 만듭니다.verbose : 다른 범주에 맞지 않는 디버그 로그.DEFAULT_CHANNEL 의 grep.아마도 내가 ISH의 일부로 쓴 가장 흥미로운 것은 통역사 일 것입니다. 기계 코드를 대상으로하지 않기 때문에 JIT가 아닙니다. 대신 가제트라고하는 함수에 대한 다양한 포인터를 생성하고, 각 가제트는 다음 함수의 테일 칼로 끝납니다. 일부 포스트 통역사가 사용하는 스레드 코드 기술과 마찬가지로. 결과는 더 간단한 스위치 디스패치를 사용한 에뮬레이션에 비해 약 3-5x의 속도를 높입니다.
불행히도, 나는 거의 모든 가제트를 조립 언어로 작성하기로 결정했습니다. 이것은 아마도 성과와 관련하여 좋은 결정 일 것입니다 (확실하지는 않지만). 가독성, 유지 가능성 및 내 정신과 관련하여 끔찍한 결정입니다. 컴파일러/어셈블러/링커에서 내가 견딜 수있는 헛소리의 양은 미쳤다. 내 코드가 충분히 변형되었는지 확인하는 악마가있는 것과 같습니다. 이 코드를 작성하는 동안 제정신을 유지하려면 코드 구조 및 이름 지정의 모범 사례를 무시해야했습니다. ss 및 s 및 a 와 같은 설명 이름을 가진 매크로 및 변수를 찾을 수 있습니다. 어셈블러 매크로는 믿음을 넘어 섰습니다. 그리고 그것을 끝내려면 거의 의견이 없습니다.
따라서 경고 :이 코드에 장기 노출되면 정신력 상실, 가스 매크로에 대한 악몽 및 링커 오류 또는 기타 여러 가지 쇠약 한 부작용이 발생할 수 있습니다. 이 코드는 암, 선천적 결함 및 생식 피해를 유발하는 캘리포니아 주에 알려져 있습니다.