Entenda como o Android para iPhone foi possível [Parte 2 de 2]

Postado em abr 25, 2010 nas categorias Blog, Destaque, iPhone

Entenda como o Android para iPhone foi possível [Parte 2 de 2]
closeEste post foi publicado há 1 ano e 9 meses 21 dias atrás. Caso esteja buscando por métodos de jailbreak e unlock (desbloqueio) modernos, recomendamos que volte para a página inicial. Dito isso, não somos responsáveis pela má utilização deste conteúdo. Verifique sempre a versão do seu firmware para checar a compatibilidade com a postagem em Ajustes - Geral - Sobre - Versão. Firmwares atuais: iPhone 3.1.3, iPhone 3G 3.1.3, iPhone 3GS 3.1.3, iPad 3.2. Só atualize o firmware após verificar a existência de um método de jailbreak/unlock disponível.

Na primeira parte da história, falei sobre o início do projeto Linux on the iPhone, que tem o hacker planetbeing como protagonista. Nos primeiros meses, de Junho a Outubro de 2008, planetbeing, com a ajuda de outros hackers, conseguiu os seguintes feitos:

  • patchear a memória NOR do aparelho,
  • fazer o driver do LCD funcionar,
  • desenvolver a primeira versão do modo gráfico do openiboot,
  • iniciar o iPhone em modo command line.

Mesmo com esses avanços, ainda estava longe de conseguir uma versão compilada e funcional de um novo sistema operacional.

Uma das limitações iniciais de trabalhar com o iPhone utilizando o iBoot no recovery mode era que ele impedia a recarga do aparelho enquanto plugado. Chegava um momento que a bateria simplesmente acabava. Ao reescrever o código do PMU, o openiboot começou a carregar a bateria, ajudando muito o processo. Agora o planetbeing podia ficar o tempo que quisesse ligado ao console do aparelho.

A conduta de programação era direcionar todo o conhecimento de ler e modificar arquivos img3 que ele tinha adquirido trabalhando com o iPhone Dev Team nos jailbreaks para o projeto Linux on the iPhone. O processo era carregar o img3 customizado com o openiboot através do iBoot do iPhone. Nesse processo ele conseguiu rodar o comando install do console e deixar o openiboot em um estágio permanente no bootloader chain. Ele iniciava como demonstrado na figura 1, dando as opções de iniciar no iPhone OS ou iniciar o openiboot no modo command-line. Como o planetbeing mesmo falou, “(…) instalar o openiboot não é muito útil, exceto para os hackers querendo hackear o openiboot”.

Figura 1: primeira versão do modo gráfico do openiboot.

Depois disso, foi descoberta uma forma de analisar e modificar os bancos da NVRAM (que guardam variáveis do ambiente como “auto-boot”, dentre outras). Tudo isso ainda era bastante complicado e um passo errado poderia dar uma merda muito grande, se não tiver uma cópia da memória NOR original, como expliquei no primeiro post sobre o assunto. No início de novembro de 2008, planetbeing e CPICH estavam tentando fazer a memória NAND funcionar. Essa é a memória de armazenamento dos iPhones, com capacidades que hoje variam de 8gb a 32gb. O objetivo era ganhar muito mais espaço para trabalhar nos outros drivers e testar outras rotinas. Eles precisavam conseguir um dump da memória via USB, pois, sem isso, seria impossível ter os dois sistemas rodando simultaneamente na memória NAND. Enquanto isso, um novo menu foi criado pelo poorland e, dentre outras alternativas, ele acabou sendo o oficial desde então.

Figura 2: segunda versão do openiboot

O próximo passo veio com a ajuda do pumpkin, membro do iPhone Dev Team, que trabalhou pesadamente para derrubar o _FLTRestore, função mais complicada que ele tinha visto até então (iBoot 1.1.4). Pelas palavras do planetbeing, “pumpkin vai fazer com que a tarefa deixe de ser ‘completamente impossível’ para virar ‘razoavelmente difícil’”. Com isso, planetbeing conseguiu escrever um arquivo chamado FTL_Open, enquanto o CPICH trabalhou no FTL_Read, que usava a estrutura de arquivos populada pelo FTL_Open. O FTL_Read foi responsável por fazer com que os arquivos na memória NAND fossem finalmente lidos. Com isso, o sistema de arquivos do firmware da Apple foi foi finalmente lido pelo pelo openiboot.

Figura 3: openiboot listando arquivos da partição do iTunes e depois extraindo o Kernel do iPhone

Depois de conseguir o feito no iPhone de primeira geração, ainda no início de novembro de 2008, planetbeing disse que o próximo passo seria portar o openiboot para o iPod touch de primeira geração e o iPhone 3G. Ao finalizar o processo, eles iniciaram o trabalho no kernel do Linux. No final de novembro, planetbeing anunciou que o kernel do Linux 2.6 tinha sido portado para a plataforma do iPhone, suportando as duas versões lançadas até o momento (2G e 3G), além da primeira geração do iPod touch. Apesar de pouca coisa funcionar naquele momento, já era possível afirmar que existia um sistema operacional alternativo funcionando no iPhone. No entando, eles só tinham conseguido o funcionamento do framebuffer driver, o driver serial, o driver serial através do USB e os interruptores, MMU, relógio e etc., mas ainda não tinham suporte à escrita na memória NAND, wifi, touchscreen, som, acelerômetro e suporte ao baseband. Abaixo o primeiro vídeo de demonstração do Linux em funcionamento no iPhone:


O projeto seria distribuido da mesma forma que as incontáveis distros de linux eram encontradas na net. Os sistemas operacionais consistem em duas coisas básicas: a primeira é o kernel, que é responsável por gerenciar o hardware. A segunda é o userland, que contém informações como shells e outros UIs, gerenciadores de pacotes, ou seja, o software que vai ajudar os usuários a instalar e rodar os programas. Nesse momento ele tinha algumas opções em mente para o seu userland. Começando pelo Ubuntu, por ser uma distro bem popular e a mesma que o portland rodava em seu computador pessoal. A segunda opção era o Android, mas ele estava meio fora de cogitação por causa dos patches do kernel, que aparentemente eram bem bagunçados. A terceira opção foi o Debian. Com o Debian, planetbeing conseguiu compilar programas no próprio iPhone, deixando o iPhone linux self-hosting.

Em março de 2009 pH lançou o QuickOIB. Um instalador do openiboot que funcionava no Mac OS e Linux, criando a possibilidade de ir diretamente ao ambiente Linux sem precisar se preocupar com o openiboot, pois tudo era apagado após o reboot do sistema. Um ano depois, em março de 2010, planetbeing volta a público e traz um guia para portar o openiboot para outros aparelhos, através de engenharia reversa, baseado nos passos que ele descreveu. Vou brevemente citar cada um deles, para que se tenha uma idéia dos passos nos quais os hackers estão trabalhando neste momento para o funcionamento do Android nos outros gadgets da Apple:

  1. Descobrir como reiniciar o aparelho. No iPhone ele conseguiu através do cmd_reboot no iBoot.
  2. Alterar as constantes em /includes/hardware/S5l8900.h para refletir o layout básico da memória no hardware.
  3. Confirmar se o PeripheralPort em /includes/hardware/S5l900.h está no lugar correto.
  4. Descobrir onde fica a configuração do registro do MIU e qual configuração vai ser feita no MIU para que o SDRAM seja mapeado para 0×0.
  5. Botar um comando reboot numa entrada inicial e mover ele pelo código enquanto debuga, até chegar ao código em C (OpenIBootStart). Esse é o primeiro grande passo.
  6. Portar o clock.h, power.c, timer.c, interrupt.c e o codigo de manuseio do interrupt.
  7. Portar o usb.c.
  8. Portar o driver GPIO, para o funcionamento dos botões.
  9. Portar o driver i2c, necessário para o pmu e LCD, dentre outras coisas.
  10. Portar o driver pmu, necessário para controle do backlight.
  11. Portar o driver SPI, usado pelo driver do LCD e do NOR.
  12. Portar o driver NOR.
  13. Portar o driver do LCD.
  14. Portar o controlador DMA.
  15. Portar o restante.

Exatamente um mês depois de fazer o guia para portar o openiboot em outros aparelhos, planetbeing finalmente anunciou a primeira versão funcional do Android para o iPhone 2G, que aconteceu nesta quarta, 21/04/2010.

Muitas e muitas horas de trabalho foram dedicadas para chegar nesse estágio. Agora as coisas vão acontecer de forma muito mais rápida. Quase ninguém tinha interesse em ajudar o desenvolvimento do iPod linux enquanto não enxergavam uma ferramenta funcional e de uso mainstream. Agora, com o vídeo demonstando o iPhone de primeira geração rodando o Android OS, diversos desenvolvedores ofereceram ajuda para fazer o restante do trabalho. Como várias cabeças pensam melhor do que uma (esperamos que seja assim),  veremos novas versões do iDroid em breve, muito mais estáveis do que a atual, além da iminente chegada do sistema para outros aparelhos, como o iPod touch e iPhone 3G.

Agora que já sabe como o port do Android para o iPhone foi possível, acompanhe no iBlogeek os próximos passos.

Postado por Leo Borges. Outras postagens:

2 respostas para “Entenda como o Android para iPhone foi possível [Parte 2 de 2]”