
Um projeto para obter um shell Linux rodando no iOS, usando emulação de x86 em modo de usuário e tradução de chamadas de sistema.
Para o status atual do projeto, veja a aba de issues e os logs de commits.
Este projeto possui um submódulo git, certifique-se de clonar com --recurse-submodules ou execute git submodule update --init após clonar.
Você precisará destas coisas para compilar o projeto:
pip3 install meson)brew install llvm, no linux, sudo apt install clang lld ou sudo pacman -S clang lld ou algo parecido)sudo apt install libsqlite3-dev)brew install libarchive, sudo port install libarchive, sudo apt install libarchive-dev) TODO: empacotar esta dependênciaAbra o projeto no Xcode, abra iSH.xcconfig e altere ROOT_BUNDLE_IDENTIFIER para algo único. Você também precisará atualizar o ID da equipe de desenvolvimento nas configurações de compilação do projeto (não do alvo!). Então clique em Run. Existem scripts que devem fazer todo o resto automaticamente. Se encontrar algum problema, abra uma issue e tentarei ajudar.
Para configurar seu ambiente, cd para o projeto e execute meson build para criar um diretório de compilação em build. Em seguida, cd para o diretório de compilação e execute ninja.
Para configurar um sistema de arquivos Alpine Linux autocontido, baixe o tarball Alpine minirootfs para i386 do site da Alpine e execute ./tools/fakefsify, com o tarball minirootfs como primeiro argumento e o nome do diretório de saída como segundo argumento. Então você pode executar coisas dentro do sistema de arquivos Alpine com ./ish -f alpine /bin/sh, assumindo que o diretório de saída se chama alpine. Se tools/fakefsify não existir no seu diretório de compilação, isso pode ser porque não foi possível encontrar libarchive no seu sistema (veja acima maneiras de instalá-lo.)
Você pode substituir ish por tools/ptraceomatic para executar o programa em um processo real e fazer execução passo a passo e comparar os registradores a cada passo. Eu uso isso para depuração. Requer Linux 64 bits 4.11 ou posterior.
O iSH possui vários canais de log que podem ser ativados no momento da compilação. Por padrão, todos estão desativados. Para ativá-los:
ISH_LOG no iSH.xcconfig para uma lista separada por espaços de canais de log.meson configure -Dlog="<lista separada por espaços de canais de log>".Canais disponíveis:
strace: O canal mais útil, registra os parâmetros e o valor de retorno de quase todas as chamadas de sistema.instr: Registra toda instrução executada pelo emulador. Isso diminui muito a velocidade.verbose: Logs de depuração que não se encaixam em outra categoria.DEFAULT_CHANNEL para ver se mais canais de log foram adicionados desde que esta lista foi atualizada.Possivelmente a coisa mais interessante que escrevi como parte do iSH é o interpretador. Não é exatamente um JIT, pois não tem como alvo código de máquina. Em vez disso, ele gera um array de ponteiros para funções chamadas gadgets, e cada gadget termina com uma tailcall para a próxima função; como a técnica de threaded code usada por alguns interpretadores Forth. O resultado é uma aceleração de aproximadamente 3-5x em comparação com a emulação usando um despacho switch mais simples.
Infelizmente, tomei a decisão de escrever quase todos os gadgets em linguagem assembly. Isso foi provavelmente uma boa decisão em relação ao desempenho (embora nunca saberei ao certo), mas uma péssima decisão em relação à legibilidade, manutenibilidade e minha sanidade. A quantidade de porcaria que tive que aturar do compilador/montador/linker é insana. É como se houvesse um demônio lá dentro que garante que meu código esteja suficientemente deformado e, se não, inventa razões estúpidas pelas quais não deveria compilar. Para permanecer são enquanto escrevia este código, tive que ignorar as melhores práticas de estrutura e nomenclatura de código. Você encontrará macros e variáveis com nomes tão descritivos como ss e s e a. Macros do montador aninhados além do aceitável. E para completar, quase não há comentários.
Então um aviso: Exposição prolongada a este código pode causar perda de sanidade, pesadelos sobre macros do GAS e erros do linker, ou qualquer outro número de efeitos colaterais debilitantes. Este código é conhecido pelo Estado da Califórnia por causar câncer, defeitos congênitos e danos reprodutivos.