Aula 2 - Felipe Silveira
Transcrição
Aula 2 - Felipe Silveira
Android Core Felipe Silveira felipesilveira.com.br Aula 2 Inicialização Inicialização Boot ROM Boot Loader Kernel Init Zygote System Server Boot ROM Boot ROM A. O código de ROM de inicialização irá detectar a partição de inicialização que contém o bootloader. B. Uma vez que a partição de inicialização (que contém o boot) é identificada, o boot ROM irá carregar na memória RAM o código do bootloader (inteiro ou suas primeiras instruções, dependendo da arquitetura) e é feito um "salto de execução" (jump) para a posição de memória onde se encontra o bootloader. Bootloader O bootloader é um programa especial, separado do kernel do Linux, que é usado para inicializar a memória e carregar o kernel para a RAM. É análogo a softwares como o GRUB. init.s - Inicializa pilhas, coloca zero nos segmentos BSS e invoca o método _main() em main.c main.c - Inicializa hardware (relógios, placa, teclado, console) Bootloader Bootloader A. O primeiro estágio do carregador de inicialização irá detectar e configurar a memória RAM externa. B. Uma vez que a RAM externa esteja disponível e o sistema pronto a executar algo mais complexo o bootloader irá carregar o "main bootloader" e colocá-lo na memória RAM externa. Bootloader C. O segundo estágio do carregador de inicialização é o primeiro grande programa que será executado. Este estágio do bootloader pode conter código para criar sistemas de arquivos, memória adicional, suporte de rede e outras coisas. Em um telefone celular, também pode ser responsável por carregar o código para o "CPU modem" e pela criação de proteções de memória de baixo nível e opções de segurança. Bootloader D. O próximo passo é encontrar a localização do kernel na mídia de inicialização (Boot media) e colocá-lo na memória RAM. Ele também irá colocar alguns parâmetros de inicialização na memória para serem lidos pelo kernel. E. Por fim, o bootloader irá executar um salto para o kernel do Linux e o kernel assume a responsabilidade do sistema. Kernel Kernel A. Uma vez que as unidades de memory management e caches foram inicializados, o sistema será capaz de usar memória virtual e lançar processos no user space. B. O kernel irá procurar no sistema de arquivos raiz pelo código do processo init (que se encontra em em system/core/init) e lançá-lo como um processo no user space. Init Mecanismo de inicialização dos processos básicos do sistema. A implementação do init encontra-se nos fontes do Android em “system/core/init/init.c”. Tratamento do arquivo de configuração init.rc Init No init.rc está configurada grande parte do restante da inicialização do sistema, incluindo a execução dos serviços básicos do Android, dentre eles: console: inicia o shell ash. servicemanager: inicia o binder (responsável pela comunicação entre os processos). vold: volume daemon — controla a montagem de vol umes de mídia no sistema de arquivos. Init adbd: android debugger bridge daemon — servidor para comunicação com o cliente adb. media: inicia os servidores multimedia (áudio, vídeo, etc). bootsound: toca um som no boot, lendo um arquivo em /system/media/audio/ui/boot.mp3. installd: servidor de instalação de pacotes/aplicações (*. apk). Init O init.rc é escrito na linguagem "Android Init Language", que é formada pelas estruturas: Action: Actions representam sequências de comandos, que são iniciados com a ocorrência de um trigger. A sintaxe é: on <trigger> <command> <command> <command> Init Service: Services são programas inicializados pelo init e que podem ou não ser reiniciados quando , por algum motivo, são finalizados. Sintaxe: service <name> <pathname> [ <argument> ]* <option> <option> Init Options e Commands: Os options e commands são usados na declaração de Services e Actions, respectivamente. Init Init A. O processo init no Android irá procurar um arquivo chamado init.rc. Ele é um script que descreve os serviços do sistema, o sistema de arquivos e outros parâmetros que precisam ser configurados. B. O processo init irá então analisar o script de inicialização e iniciar os processos de serviço do sistema. Zygote O zygote é o pai de todos os processos Java. Tudo que roda em Java é criado por este processo, que instancia uma máquina virtual Dalvik para executar um processo ou serviço Java. Ele esta implementado em C++, e seu código-fonte encontra-se em frameworks/base/cmds/app_process/app_main.cpp. Zygote O Zygote é responsável basicamente por duas operações: 1) Prover uma infraestrutura para a execução de apli cações Java. 2) Iniciar o System Server, que gerencia a base dos serviços do sistema operacional Android. Zygote System Server O system server é o primeiro componente Java a rodar no sistema. Ele vai iniciar todos os serviços Android, como o Telephony Manager e o bluetooth. Localizado em frameworks/base/services/java/com/android/server/Syste mServer.java. System Server System Server Serviços inicializados pelo system server: ●Power Manager ●Activity Manager ●Telephony Registry ●Package Manager ●Context Manager ●System Context Providers ●Battery Service ●Alarm Manager ●Sensor Service ●Window Manager ●Bluetooth Service ●Mount Service ●... System Server Ao final da execução do system server, o Activity Man ager inicia alguns processos básicos, dentre eles o com. android.launcher, que é a aplicação responsável pela interface gráfica padrão do Android. Após a execução do System Service, a inicialização é considerada finalizada e e broadcast ACTION_BOOT_COMPLETED é lançado.