¿Cómo funciona el proceso de arranque de Android?

el proceso de arranque de Android desde el encendido

Dado que las plataformas móviles y los sistemas integrados tienen algunas diferencias en comparación con los sistemas de escritorio en cómo se inician y arrancan inicialmente, esta publicación analizará las etapas iniciales de arranque de un teléfono Android con cierto detalle. Dado que hemos usado la placa Beagle como referencia en algunos ejemplos anteriores, cualquier detalle aquí está relacionado con un sistema similar.

1. Encender y arrancar la ejecución del código ROM

Al encenderse, la CPU estará en un estado donde no se han realizado inicializaciones. Los relojes internos no están configurados y la única memoria disponible es la RAM interna. Cuando las fuentes de alimentación son estables, la ejecución comenzará con el código ROM de arranque. Este es un pequeño fragmento de código que está cableado en el CPU ASIC. Para obtener más información sobre ROM de arranque y configuraciones, estudie el capítulo de inicialización en
el Omap 3530 TRM.

  • A. El código ROM de arranque detectará los medios de arranque utilizando un registro del sistema que se asigna a algunas bolas físicas en el ASIC. Esto es para determinar dónde encontrar la primera etapa del cargador de arranque.
  • B. Una vez que se establece la secuencia de medios de arranque, la ROM de arranque intentará cargar el cargador de arranque de la primera etapa en la RAM interna. Una vez que el cargador de arranque está en su lugar, el código ROM de arranque realizará un salto y la ejecución continúa en el cargador de arranque.
  • ** 2. El cargador de arranque
    El gestor de arranque es un programa especial separado del kernel de Linux que se utiliza para configurar memorias iniciales y cargar el kernel en la RAM. En los sistemas de escritorio, los cargadores de arranque son programas como GRUB y en Linux incorporado uBoot es a menudo el cargador de arranque de elección. Los fabricantes de dispositivos a menudo usan sus propios cargadores de arranque patentados. Los requisitos de un cargador de arranque para Linux que se ejecuta en un sistema ARM se pueden encontrar en el documento de Arranque en /Documentation/arm en el árbol de fuentes del kernel.

  • A. La primera etapa del cargador de arranque detectará y configurará la RAM externa.
  • B. Una vez que la RAM externa esté disponible y el sistema esté listo para ejecutar algo más significativo, la primera etapa cargará el cargador de arranque principal y lo colocará en la RAM externa.
  • C. La segunda etapa del cargador de arranque es el primer programa importante que se ejecutará. Esto puede contener código para configurar sistemas de archivos, memoria adicional, soporte de red y otras cosas. En un teléfono móvil, también puede ser responsable de cargar el código de la CPU del módem y de configurar protecciones de memoria de bajo nivel y opciones de seguridad.
  • D. Una vez que el gestor de arranque haya terminado con cualquier tarea especial, buscará un kernel de Linux para arrancar. Cargará esto desde el medio de arranque (o alguna otra fuente dependiendo de la configuración del sistema) y lo colocará en la RAM. También colocará algunos parámetros de arranque en la memoria para que el núcleo los lea cuando se inicie.
  • E. Una vez que el cargador de arranque esté listo, realizará un salto al kernel de Linux, generalmente alguna rutina de descompresión, y el kernel asume la responsabilidad del sistema.
  • *** 3. El kernel de Linux
    El kernel de Linux se inicia de manera similar en Android como en otros sistemas. Configurará todo lo necesario para que el sistema se ejecute. Inicialice los controladores de interrupción, configure protecciones de memoria, cachés y programación.

  • R. Una vez que las unidades de administración de memoria y las cachés se hayan inicializado, el sistema podrá usar la memoria virtual e iniciar procesos de espacio de usuario.
  • B. El núcleo buscará en el sistema de archivos raíz el proceso de inicio (que se encuentra en sistema / núcleo / inicio en el árbol de código abierto de Android) y lo iniciará como el proceso inicial de espacio de usuario.
  • **** 4 El proceso init
  • El proceso init es la “abuela” de todos los procesos del sistema. Todos los demás procesos del sistema se iniciarán desde este proceso o uno de sus descendientes.

  • R. El proceso de inicio en Android buscará un archivo llamado init.rc. Este es un script que describe los servicios del sistema, el sistema de archivos y otros parámetros que deben configurarse. El script init.rc se coloca en system / core / rootdir en el proyecto de código abierto de Android.
  • B. El proceso init analizará la secuencia de comandos init e iniciará los procesos de servicio del sistema.
  • 5. ***** Zygote y Dalvik
  • Zygote es lanzado por el proceso init y básicamente comenzará a ejecutarse e inicializará la máquina virtual Dalvik.

  • 6. ****** El servidor del sistema
  • El servidor del sistema es el primer componente de Java que se ejecuta en el sistema. Iniciará todos los servicios de Android, como el administrador de telefonía y bluetooth. El inicio de cada servicio está actualmente escrito directamente en el método de ejecución del servidor del sistema. La fuente del servidor del sistema se puede encontrar en los marcos de archivos / base / services / java / com / android / server / SystemServer.java en el proyecto de código abierto.

  • 7 ******* BOTA COMPLETADA
  • Agregué esta parte a la publicación en 20090831 ya que es muy útil y algo que no debería haber dejado de lado desde el principio. Una vez que el servidor del sistema está en funcionamiento y el arranque del sistema se ha completado, hay una acción de transmisión estándar llamada ACTION_BOOT_COMPLETED. Para iniciar su propio servicio, registre una alarma o haga que su aplicación realice alguna acción después del arranque que debe registrar para recibir esta intención de transmisión.

Los pasos de arranque separados y los posibles lugares para agregar su propia funcionalidad se cubren con más detalle en publicaciones separadas.

fuente del artículo: -El proceso de arranque de Android desde el encendido

GRACIAS POR LEER EL ARTÍCULO.

ESPERO QUE ESTA EXPLICACIÓN PROPORCIONE LECTORES SUFICIENTES CONOCIMIENTOS SOBRE EL PROCESO DE ARRANQUE DE ANDROID

Paso 1: encendido y arranque del sistema

Cuando presionamos el botón de encendido, el código de ROM de arranque comienza a ejecutarse desde una ubicación predefinida que está cableada en la ROM. Carga el cargador de arranque en la RAM y comienza a ejecutarse.

Paso 2: gestor de arranque

El gestor de arranque es un pequeño programa que se ejecuta antes que Android. Esto NO es parte del sistema operativo Android. El gestor de arranque es el lugar donde el fabricante pone sus bloqueos y restricciones.

El gestor de arranque se ejecuta en dos etapas. En la primera etapa, detecta RAM externa y carga un programa que ayuda en la segunda etapa.

En la segunda etapa, el gestor de arranque configura la red, la memoria, etc., que requiere ejecutar el núcleo. El gestor de arranque puede proporcionar parámetros de configuración o entradas al núcleo para fines específicos.

El gestor de arranque se puede encontrar en:

/ bootable / bootloader / legacy / usbloader

Este cargador heredado contiene 2 archivos importantes:

  1. 1- Init.s :: Inicializa pilas, pone a cero los segmentos BSS y call_main () en main.c
  2. 2- Main.c :: Inicializa hardware (relojes, placa, teclado, consola) y crea etiquetas de Linux.

Paso 3: Kernel

El kernel de Android se inicia de manera similar al kernel de Linux. Cuando se inicia el kernel, comienza a configurar la memoria caché, la memoria protegida, la programación y carga los controladores. Cuando el núcleo finaliza la configuración del sistema, busca “init” en los archivos del sistema.

¿Cuál es la diferencia entre los núcleos de Linux y Android ?, aquí hay una lista de cambios / complementos que el Proyecto Android realizó en el kernel de Linux:

  • Binder: es un mecanismo de comunicación entre procesos específico de Android y un sistema de invocación de métodos remotos.
  • ashmem: “Memoria compartida de Android”. Es un nuevo asignador de memoria compartida, similar a POSIX SHM pero con un comportamiento diferente y con una API más simple basada en archivos.
  • pmem: “asignador de memoria de proceso”: se utiliza para gestionar grandes (1-16 + MB) regiones físicamente juntas de memoria compartidas entre el espacio de usuario y los controladores del núcleo.
  • registrador: este es el soporte del núcleo para el comando logcat.
  • wakelocks: se utiliza para archivos de administración de energía. Mantiene la máquina despierta por evento hasta que se libera wakelock.
  • Manejo de OOM: mata los procesos a medida que la memoria disponible se vuelve baja.
  • administrador de alarmas: permite que el espacio del usuario le diga al kernel cuándo le gustaría despertarse.
  • RAM_CONSOLE: permite guardar los mensajes del kernel printk en un búfer en la RAM, de modo que después de un pánico del kernel puedan verse en la próxima invocación del kernel.
  • Controlador de dispositivo USB para ADB
  • sistema de archivos flash yaffs2

Paso 4: proceso de inicio

Init es el primer proceso, podemos decir que es un proceso raíz, o el abuelo de todos los procesos. El proceso init tiene dos responsabilidades.

1- Monta directorios como / sys, / dev o / proc

2- Ejecuta el script init.rc

  • – El proceso de inicio se puede encontrar en / init :: / system / core / init
  • – El archivo Init.rc se puede encontrar en :: / system / core / rootdir /

Android tiene un formato y reglas específicos para los archivos init.rc. Puede encontrar más información sobre estas reglas en: Qué hay dentro de init.rc y para qué se utiliza.

En esta etapa, finalmente puede ver el logotipo de Android en su pantalla.

Paso 5: cigoto y Dalvik

En Java, sabemos que una instancia de máquina virtual separada aparecerá en la memoria para cada aplicación, pero en el caso de Android, la máquina virtual debería ejecutarse lo más rápido posible para una aplicación. Pero, ¿qué sucede si tiene varias aplicaciones que lanzan varias instancias de Dalvik (VM) ?, consumiría una inmensa cantidad de memoria.

Para superar este problema, el sistema operativo Android tiene un sistema llamado “Zygote”. El Zygote permite compartir código en la máquina virtual Dalvik, logrando una huella de memoria más baja y un tiempo de inicio mínimo. Zygote es un proceso de máquina virtual que comienza en el arranque del sistema. El cigoto precarga e inicializa las clases principales de la biblioteca.

El proceso de carga de cigoto:

  1. Cargar la clase Init de cigoto:
    /frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
  2. registerZygoteSocket () :: Registra un socket de servidor para conexiones de comando zygote.
  3. preloadClasses () :: Es un archivo de texto simple que contiene una lista de clases que deben precargarse, puede encontrar el archivo en / framework / base
  4. preloadResources () :: Todo lo que se incluye en el archivo android.R se cargará con este método (temas y diseños).

En este momento, puede ver la animación de arranque.

Paso 6: servicio del sistema

Después de completar los pasos anteriores, Zygote inicia los servicios del sistema. Zygote bifurca un nuevo proceso para lanzar los servicios del sistema.

Servicios principales:

  • Iniciando el administrador de energía
  • Crear el administrador de actividades
  • Inicio del registro de telefonía
  • Iniciando el administrador de paquetes
  • Establecer el servicio del administrador de actividades como proceso del sistema
  • Iniciando el administrador de contexto
  • Inicio de proveedores de contacto del sistema
  • Iniciando servicio de batería
  • Iniciando el administrador de alarmas
  • Inicio del servicio del sensor
  • Iniciando el administrador de ventanas
  • Iniciando el servicio Bluetooth
  • Inicio del servicio de montaje

Otros servicios:

  • Iniciando el servicio de barra de estado
  • Iniciando servicio de hardware
  • Iniciando el servicio NetStat
  • Iniciando servicio de conectividad
  • Administrador de notificaciones de inicio
  • Inicio del servicio DeviceStorageMonitor
  • Administrador de ubicación inicial
  • Iniciando el servicio de búsqueda
  • Inicio del servicio del portapapeles
  • Iniciando el servicio de registro
  • Inicio del servicio de fondo de pantalla
  • Iniciando servicio de audio
  • Inicio del auricular Observador
  • Inicio de AdbSettingsObserver

Ahora finalmente hemos completado el proceso de arranque (el servicio del sistema está funcionando en la memoria).

¿Necesita analizar el arranque de Android?

El logcat :: Use adb para obtener los eventos del proceso de arranque desde el logcat.

‘adb logcat –d –b eventos | grep “arranque”

‘adb logcat –d | grep preload ‘

La secuencia de arranque de Android es similar a cualquier otro sistema integrado basado en Linux: de una manera muy abstracta, después del encendido, el sistema inicializa el hardware, carga el kernel y finalmente el marco de Android.

ROM interna – BIOS

Cuando presiona el botón de encendido en su dispositivo, el sistema carga una pequeña cantidad de código, almacenado dentro de una memoria ROM. Este software se encarga de configurar todos los parámetros para el reloj de la CPU y ejecutar la verificación de la memoria RAM. Después de esto, el sistema carga el gestor de arranque en la memoria y lo inicia.

Una descripción general del gestor de arranque

El gestor de arranque se encarga de cargar el núcleo del sistema en la memoria RAM y ejecutarlo, para continuar la secuencia de arranque.

El software de arranque más popular para dispositivos Android es U-Boot, el Universal Bootloader. U-Boot es ampliamente utilizado en todo tipo de sistemas integrados: enrutadores DSL, televisores inteligentes, sistemas de información y entretenimiento, por ejemplo. U-boot es un software de código abierto y su flexibilidad para personalizarse para cualquier dispositivo es definitivamente una de las razones de su popularidad. La tarea principal de U-boot es leer la imagen del núcleo de la partición de arranque, cargarla en la memoria RAM y ejecutarla. A partir de este momento, el núcleo se encarga de terminar la secuencia de arranque.

El núcleo

Después de que el gestor de arranque carga el kernel, la primera tarea del kernel es inicializar el hardware. Con todo el hardware necesario configurado correctamente, el kernel monta el ramdisk desde boot.img e inicia init .

El proceso de inicio

En un sistema Linux estándar, el proceso init se encarga de iniciar todos los servicios básicos necesarios para iniciar el sistema. El objetivo final es completar la secuencia de arranque e iniciar la interfaz gráfica o la línea de comando para que el sistema esté disponible para el usuario. Todo este proceso se basa en una secuencia específica de scripts del sistema, ejecutados en un orden riguroso para asegurar la integridad del sistema y la configuración adecuada.

Para obtener más información, puede consultar mi blog y mi video a continuación.

Proceso de arranque de Android