notas de estudio Linux-uboot- (8): uboot arrancar el kernel

notas de estudio Linux-uboot- (8): uboot arrancar el kernel

Cuando uboot comenzó cuando se realiza puntero theKernel para saltar a la ejecución del kernel, que marca el final de uboot. Uboot kernel preparativos finales antes de iniciar la siguiente: desde la ubicación de despliegue de la imagen del núcleo kernel movimiento para DDR, el formato de registro de entrada del núcleo, pasan los parámetros del núcleo listos, salto a theKernel para realizar núcleo.

En primer lugar, ¿cuál es el uboot del núcleo

Kernel es esencialmente un complejo "programa de metal desnudo" grande, y uboot, y otro programa de metal desnudo y no hay diferencia esencial.
La diferencia es que el sistema operativo que se ejecuta en el software en la capa de capa de núcleo y la aplicación , las capas estratificadas de diferentes permisos , el acceso a más sofisticado de gestión de memoria y operación de equipos (kernel puede acceder fácilmente a una variedad de hardware, y única aplicación lata hardware de acceso y el límite de direcciones de memoria).
Intuitivamente: el uboot espejo esu-BOOT.bin, Linux sistema de reflejo eszImageEstas dos cosas son en realidad dos espejos de programas de metal desnudo. Comienza desde la perspectiva del sistema se refiere, el núcleo es realmente un gran punto de procedimientos complejos de metal desnudo.

uboot es incondicional inicio, empezar de cero. El núcleo no puede iniciarse automáticamente arranque desde cero, el arranque del kernel a los demás en busca de ayuda. Para ayudar a lograr la reubicación uboot del núcleo, uboot también proporcionar parámetros de arranque al kernel (desde la tarjeta SD a la DDR).

En segundo lugar, un despliegue de partición específica

Un completo software + hardware de los sistemas embebidos, estacionario (cuando no accionado) cargador de arranque, kernel, rootfs y otro software necesario se almacena en forma reflejada en el medio de partida (X210 es iNAND / tarjeta SD); Runtime se ejecuta en la memoria DDR , independientemente del medio de almacenamiento. El por encima de dos estados son estado estacionario, el tercer estado es un proceso dinámico, es decir,Durante el funcionamiento de un estado quiescente a estado, es decir, el proceso de arranque.
proceso dinámico de inicio es un movimiento gradual desde una tarjeta SD a la memoria DDR, y ejecutar el código de inicio para iniciar el establecimiento de la arquitectura de hardware y software relacionado, y en última instancia alcanzar el régimen establecido.
T-BOOT.bin rootfs zImage en la tarjeta SD, que no puede existir ninguna posición de reposo al azar de la tarjeta SD, es necesario particionar una tarjeta SD, y cada uno presente una imagen respectiva varias particiones, así que empieza uboot proceso, el núcleo y otra que saben dónde buscar. (Uboot núcleo y la tabla de particiones debe ser la misma, mientras que la partición real, y utilizar la tarjeta SD para ser coherente)

Cuando reubicación uboot en una primera etapa, la segunda etapa (imagen entera uboot) se carga en DDR 0xc3e00000 dirección, la dirección es un uboot dirección del enlace.
El núcleo también tiene un requisito similar cuando uboot arrancar la memoria del núcleo leer desde una tarjeta SD en la DDR (en realidad un proceso de reubicación), no se puede dejar sin vigilancia, se debe colocar en el centro de la dirección del enlace, o no puesta en marcha. Por ejemplo enlace kernel dirección que usamos es 0x30008000.

En tercer lugar, el proceso de arranque del kernel uboot

Paso 1. Iniciar el núcleo: el núcleo se carga en la RDA

Para iniciar el kernel uboot se divide en dos pasos: El primer paso es cargar la imagen del núcleo desde el medio para iniciar la segunda etapa de DDR es comenzar la imagen del núcleo . (Código del kernel ni siquiera consideró la reubicación, debido a que el núcleo sabe que habrá uboot como para cargar sus propios enlaces a la dirección de DDR, por lo que el núcleo es un enlace directo desde la dirección al inicio de la carrera )

Inicialmente imagen del núcleo en la tarjeta SD partición del núcleo , es necesario leer desde la partición del núcleo para tarjetas SD y un espejo (zImage-qt) y se carga en un DDR antes de núcleo.
de instrucciones Uboot ir a buscar por:movi leer kernel 30008000
Cargar mediante TFTP:TFTP 0x30008000 zImage-qt(Para zImage de QT antes de cargarlos en la carpeta tftpboot)
de carga está completa, el núcleo comienza por un comando:bootm 0x30008000

El resultado final es que la imagen del núcleo que es el DDR a una dirección específica, independientemente de cómo la imagen del núcleo de la RDA. Dos o más formas tienen ventajas y desventajas. Cuando la fábrica está configurado para iniciarse (el cliente no tiene que configurar el servidor TFTP Para utilizar ???) de la tarjeta SD; TFTP descarga Comienzan a distancia Este enfoque se utiliza generalmente para el desarrollo .

2. Iniciar el núcleo Segundo paso: comprobar el formato del núcleo

En primer lugar, la imagen del núcleo es, probablemente, disponible en tres versiones: Imagen y zImage uImage .

Después de compilar el kernel de Linux va a generar un programa ejecutable que formato ELF, llamado vmlinux o vmlinuz , este es el original, sin ningún tipo de tratamiento y procesamiento del archivo de núcleo original de duende; quemar al implementar sistemas integrados generalmente no son el vmlinuz / vmlinux , pero a utilizar herramientas para objcopy hecho en un formato de imagen de la quema (es decir, u-BOOT.bin esto, pero no el núcleo sufijo .bin), a través del proceso de producción en un archivo de imagen de la quema de llamaImagen(78M hacer la gran línea de corriente se convirtió en 7,5 M, por lo que el objetivo principal es hacer que los espejos incendiarios para reducir el tamaño y guardar en disco).
De hecho, los autores piensan que Linux es todavía demasiado grande para que la imagen de la imagen se comprime, y el archivo de imagen comprimida de la parte del extremo frontal del código de descompresión que se añade (esta parte de la sin comprimir) . Constituyen un formato de imagen comprimido llamadozImage.
Para iniciar uboot del núcleo de Linux, el kernel también inventó un formato llamadouImage. zImage uImage se obtiene por mecanizado, uboot con una herramienta, puede ser generado de procesamiento zImage uImage. Nota: uImage algo que ver con el núcleo Linux, Linux kernel zImage simplemente puede generar, uboot en mkimage generado por la herramienta para ir zImage uImage para iniciar el proceso de uboot . Este proceso es en realidad frente a la información del encabezado para agregar zImage uImage 64 bytes.

do_bootm función de hasta 397 líneasafter_header_checkEn este símbolo, se lleva a cabo la información de cabecera del espejo de cheques . Será diferente dependiendo del tipo de verificación en la verificación de tipo de imagen. Por lo tanto, la función principal do_bootm se pasa en distinguir qué tipo de imagen en el extremo, y en este tipo de información de cabecera para verificar el formato. Verificación por el núcleo está listo para iniciar el siguiente paso, si no pasa la comprobación cree que hay un problema con espejo, por lo que no se puede iniciar.

(1) inicio zImage

Aquí Insertar imagen Descripción
Para zImage número mágico, y si la comprobación es correcta, los iniciados por formato zImage. Por lo tanto, podemos ver el contenido zImage para ver la ubicación en la que el número mágico y el tiempo de métodos de detección corresponden.
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
image_header_tEsta estructura de datos es que empezamos uboot una estructura de datos estándar utilizado por el kernel para empezar, la información de cabecera zImage es un image_header_t, pero antes del inicio real necesita una renovación.HDR> ih_os = IH_OS_LINUX; HDR> ih_ep = ntohl (addr); estos dos está reinventando.
imágenes variable global se utiliza en el do_bootm función es utilizada para completar el proceso de arranque. zImage proceso de validación no es, de hecho, asegúrese de zImage, confirmar y luego modificar la información de cabecera zImage a la derecha, con una información de la cabecera modificada para inicializar las imágenes variables globales, y luego completar la verificación.

(2) inicio uImage

Aquí Insertar imagen Descripción
Convencionalmente uboot admite tres tipos de situaciones:
IMAGE_FORMAT_INVALID: formato de imagen no es legítimo.
IMAGE_FORMAT_LEGACY Formato uImage.
IMAGE_FORMAT_FIT: formato de árbol de dispositivos.

uImage empezar en el registro de entrada principalboot_get_kernelFunción, la tarea principal es comprobar la información de cabecera uImage, y obtener el verdadero núcleo de la posición de inicio para comenzar.
Aquí Insertar imagen Descripción
Cuando el paso de parámetros zImage misma manera, soporta ambos casos, el parámetro de dirección por defecto de menos de 2; 2 mayor que o parámetros iguales, el argv [1] pase en.
Aquí Insertar imagen Descripción
Esto se determina por la magia uImage formato de imagen digital y la información de impresión.
Aquí Insertar imagen DescripciónEsto es después de que se complete la determinación, parte de la información en la imagen impresa en el interior.

Aquí Insertar imagen Descripción
Aquí es una forma de descomprimir el uImage.
Aquí Insertar imagen Descripción
Mediante el análisis del código se puede obtener, y zImage uImage sustancialmente el mismo, se determina en primer lugar por el formato de imagen digital mágico, y después el parámetro almacenado mediante la construcción de las imágenes abajo . Las imágenes incluidas en la información del encabezado de la imagen, la información de cabecera se pueden obtener a través de estos elementos básicos de la imagen (el número mágico, la longitud del espejo, el tipo espejo, y así la entrada de dirección). Después de la participación de las masas también necesitará utilizar esta información privilegiada.

3. Iniciar el núcleo Tercer paso: Preparar el paso de parámetros del kernel

(. 1) Introducción punto de entrada
Aquí Insertar imagen Descripción
ep Abreviatura es el punto de entrada, que es la entrada del programa. La realización de una parte de inicio del archivo de imagen no se reflejan en el comienzo (el comienzo de la imagen tiene n bytes de información de cabecera), la verdadera aplicación de un código de bytes del archivo de imagen en un espejo central, es equivalente a la cabeza hay un cierto desfase . Este desplazamiento se registra en la información del encabezado.
Un espejo se realiza típicamente: el primer paso, la información de cabecera de lectura, y después mirar a una información en particular encabezado de dirección MAGIC_NUM, determinando de este modo el tipo de imagen, un segundo paso de la imagen para la verificación; un tercer paso de nuevo lee la información de cabecera , conocido por la información de la dirección particular de los distintos espejo (espejo de cuerpo, tipo espejo, una dirección de entrada); una cuarta etapa comienza la ejecución espejo go punto de entrada.

(2) Comparativo código máquina
Aquí Insertar imagen Descripción

kernel uboot en el arranque, el código de máquina que se pasa al kernel. uboot pasado al núcleo del código de máquina se determina cómo? La primera alternativa es ordenar la variable de entorno machid, una segunda alternativa es la de orden GD-> BD> bi_arch_num (x210_sd.h dispuestos en hardcoded).

(3) Parámetro de etiqueta que pasa
uboot kernel parámetro que pasa a través decódigo struct, Tag es una estructura de datos , y en uboot Linux kernel se define para los medios de datos de la etiqueta, y es la misma definición.
Debido a que el kernel uboot y no puede ejecutar al mismo tiempo , uboot arrancado el núcleo por thekernel puntero. Por lo tanto, en un uboot formato específico (etiqueta) en una posición particular, entonces posición correspondiente al núcleo empieza a tomar un método correspondiente. Parámetro pasado es un futuro de una etiqueta.Aquí Insertar imagen Descripción
tag_header 和 tag_xxx. tag_header tienen el código de tipo de etiqueta y el tamaño (0x54410001), el primer análisis tag_header obtenido tipo de etiqueta (Core) y obtener un tamaño del grano de la etiqueta, y la parte de la etiqueta restante como un tag_xxx (tag_core) tratados.
Aquí Insertar imagen Descripción
TAG_START 与 TAG_END. kernel parámetros etiqueta transmisión recibida se compone de un número, que se inicia por etiqueta TAG_STARTback, a la TAG_END final.

A partir etiqueta es ATAG_CORE, la etiqueta final es ATAG_NONE, otros son ATAG_XXX etiqueta de información válida.
CONFIG_SETUP_MEMORY_TAGS, tag_mem , participación de las masas es el contenido de la información de configuración de memoria .
CONFIG_CMDLINE_TAG, tag_cmdline , participación de las masas es el contenido para iniciar los parámetros de línea de comandos , es decir, bootargs UBoot. Las variables de entorno
CONFIG_INITRD_TAG, Linux es el mecanismo INITRD.
CONFIG_MTDPARTITION, paso de parámetros contenido es la tarjeta iNAND / SD tabla de particiones.

(4) la función theKernel
etiqueta puede pasar parámetros a través de lo anterior, sabemos que cuando el núcleo se inicia, diversos parámetros de información se pueden pasar a través de una etiqueta correspondiente, entonces el kernel cómo podemos conseguir este tipo de etiqueta que?
La última llamada se pasa a la función uboot theKernel para realizar kernel de Linux, uboot llamar a esta función (en realidad un núcleo de Linux) cuando: a.3 parámetros. Uboot tres parámetros se pasa directamente a los tres parámetros del núcleo Linux, paso de parámetros se logra a través del registro. (El primer parámetro será colocado en r0, r1 en el segundo parámetro, el tercer parámetro en el r2) del primer parámetro se fija a 0, el segundo parámetro es el código de la máquina, los terceros parámetros de transmisión la primera dirección es la gran masa de la etiqueta de referencia.
Aquí Insertar imagen Descripción
theKernel = (void (*) ( int, int, uint)) ep; asignado a la ep theKernel, laEsta función puntos de entrada a puntos a la dirección de imagen del sistema operativo cargado memoria real(Ejecución de código es la primera frase del sistema operativo). Thekernel última frase de uboot parámetros pasados ​​a la función de puntero.

Publicado 72 artículos originales · 98 fue elogiado · Vistas 100.000 +

Supongo que te gusta

Origin blog.csdn.net/qq_42826337/article/details/105130631
Recomendado
Clasificación