Red de conocimiento informático - Problemas con los teléfonos móviles - Paquete de archivos fuente de Uboot

Paquete de archivos fuente de Uboot

La diferencia entre la imagen de arranque uboot de Linux y zImage y uImage

Uboot inicia el análisis de zImage (go) y uImage (bootm).

1. Bootm carga la imagen de Linux cargando uIamge, lo cual se realiza mediante mkimage. La diferencia con zIamge es que uIamge está comprimido por zIamge. bootm necesita descomprimir uIamge primero y la dirección de descompresión es la dirección de entrada del kernel. Una vez completada la descompresión, uIamge y zIamge son casi iguales. Se pueden discutir las diferencias específicas. Actualmente, Uboot solo admite el inicio de uImage, pero no admite el inicio de zImage.

2.Proceso de descompresión de bootm

-

##Arrancar la imagen en 08808000...

Nombre de la imagen: Linux-2.6 .14.7

Tipo de imagen: imagen del kernel ARM Linux (sin comprimir)

Tamaño de datos: 989172 bytes = 966 kB

Dirección de carga: 08008000

Punto de entrada: 08008000

Verificar suma de comprobación... OK

¿Está bien? ? Usar el comando uboot bootm para descomprimir uIamge

-

¿Iniciar el kernel...? ?

Pasar los parámetros del kernel da control a arch\arm\boot\compressed]head.s.

-

Por ejemplo, la dirección inicial de la memoria del equipo mx1ADS es 0x0000_0000 y se descarga a 0x 0800_800offset a través de tftp. El desplazamiento es mayor que 0x80_0000, que es. tftp 0x0880_8000, luego bootm 0x0880_8000 descomprime uIamge en 0x0080_8000 y la dirección de descompresión es MK.

La diferencia entre zImage y uImage 1. vmlinuzvmlinuz es un kernel comprimido de arranque. "vm" significa "memoria virtual". Linux admite memoria virtual, a diferencia de los sistemas operativos antiguos como DOS, que tienen un límite de memoria de 640 KB. Linux puede utilizar el espacio del disco duro como memoria virtual, de ahí el nombre "vm". ?

Hay dos formas de crear vmlinuz. Primero cree el kernel mediante "make zImage" en el momento de la compilación y luego generelo mediante "CP/usr/src/Linux-2.4/arch/i386/Linux/boot/zImage/boot/vmlinuz". ZImage es adecuado para núcleos pequeños y existe para compatibilidad con versiones anteriores. ?

En segundo lugar, el kernel se crea usando el comando make bzImage al compilar y luego se genera usando "CP/USR/SRC/Linux-2.4/ARCH/I386/Linux/boot/bzImage/boot/vmlinuz". . BzImage es una imagen del kernel comprimida. Cabe señalar que bzImage no está comprimido por bzip2. El bz en bzImage se malinterpreta fácilmente y bz significa "big zImage". La b en bzImage significa "grande". Tanto ZImage(vmlinuz) como bzImage(vmlinuz) están comprimidos con gzip. No sólo son un archivo comprimido, sino que el código de descompresión gzip también está incrustado al principio de ambos archivos. Por lo tanto, no puede usar gunzip o gzip -dc para descomprimir vmlinuz. ?

2.initrd-x.x.x.img?

Initrd es la abreviatura de "disco ram inicial". Initiatrd se utiliza normalmente para iniciar temporalmente el hardware en un estado en el que el kernel vmlinuz real pueda tomar el control y continuar con el inicio. ?

El archivo de imagen initrd se crea usando mkinitrd. La utilidad mkinitrd crea un archivo de imagen initrd. Este comando es propiedad de RedHat.

Otras distribuciones de Linux pueden tener comandos correspondientes. Esta es una utilidad muy útil. Para obtener más información, consulte ayuda: man mkinitrd Utilice el siguiente comando para crear un archivo de imagen initrd. ?

Finalmente se generaron dos imágenes del kernel: zImage y uImage. Después de descargar zImage en la placa de destino, puede usar directamente el comando uboot para saltar. En este momento, el kernel se descomprime e inicia directamente. Sin embargo, el sistema de archivos no se puede montar porque el comando go no pasa los parámetros de inicio relevantes requeridos por el kernel al kernel. Para pasar los parámetros de arranque, debemos usar el comando bootm para saltar. El salto del comando Bootm solo procesa imágenes de uImage. ?

Existe la herramienta mkimage en el directorio tools/ del código fuente de uboot, que se puede utilizar para crear varios archivos de imagen de arranque comprimidos o sin comprimir. ?

Al crear un archivo de imagen, Mkimage agrega un encabezado de 0x40 bytes delante del archivo de imagen ejecutable original, registra la información especificada por los parámetros y permite a uboot identificar qué estructura de sistema de CPU, qué sistema operativo, y qué tipo se cargan en ¿Dónde en la memoria, dónde está el punto de entrada en la memoria y cuál es el nombre de la imagen?

El uso es el siguiente:

. /mkimage -A arch -O OS -T tipo -C comp -A dirección -e EP -n nombre -d datos _ archivo[:datos _ archivo...]¿imagen?

-A == >¿Establecer edificio en 'arco'?

-O == >¿Configurar el sistema operativo en "os"?

-T == >¿Establecer tipo de imagen en 'tipo'?

-C == >¿Establecer tipo de compresión "comp"?

-a == > ¿Establecer la dirección de carga en "dirección" (hexadecimal)?

-e == >¿Establecer el punto de entrada en 'EP' (hexadecimal)?

-n == >¿Establecer el nombre de la imagen en "nombre"?

-d == >¿Usar datos de imagen del "archivo de datos"?

-x == >¿Establecer XIP (implementado en su lugar)?

Descripción del parámetro:?

-A especifica la arquitectura de la CPU:?

¿Qué estructura del sistema representa el valor?

¿Alfa Alfa?

¿Brazar un brazo?

¿x86Intel x86?

ia64 ¿IA64?

¿MIPS?

mips64 ¿MIPS de 64 bits?

ppc PowerPC?

s390 ¿IBM S390?

¿SuperH?

¿Sparc?

sparc64 bits?

m68k MC68000?

-O especifica el tipo de sistema operativo, que puede tomar los siguientes valores:?

openbsd, netbsd, freebsd, 4_4bsd, linux, svr4, esix, solaris, irix, sco, dell, ncr, lynxos, vxworks, psos, qnx, u-boot, rtems, artos?

-T especifica el tipo de mapeo, que puede tomar los siguientes valores:?

¿Una sola máquina, kernel, memoria, múltiples, firmware, script, sistema de archivos?

-C especifica la fórmula de compresión de la imagen, que puede tomar los siguientes valores:?

¿Está todo comprimido?

¿Gzip utiliza el método de compresión gzip?

¿Bzip2 utiliza la fórmula de compresión de bzip2?

-a especifica la dirección de carga de la imagen en la memoria. Cuando la imagen se descarga a la memoria, se debe descargar de acuerdo con el valor de dirección especificado por este parámetro al crear la imagen con mkimage.

-e especifica la dirección del punto de entrada de la imagen en ejecución. ¿Es el valor especificado por el parámetro -a más 0x40 (porque se agrega un encabezado de 0x40 bytes delante de mkimage)?

-n¿Especificar nombre de imagen?

-d especifica el archivo fuente para crear la imagen?

Los comandos que utilizo al compilar son los siguientes:?

# make zImage//¿Generar imagen zImage?

#/usr/local/arm/k 9 uboot/tools/mkimage-n ' Linux 2 4 .

kernel-C none-a 0x 20007 fc 0-e 0x 20008000-d zi imagen uImage?

La imagen del kernel está lista, ahora prepararemos el sistema de archivos. Debido a limitaciones de tiempo, utilizo temporalmente k9.img.gz, un sistema de archivos desarrollado por otros. Lo que debemos hacer en este momento es escribir un programa hello.c simple nosotros mismos, compilarlo y agregarlo al sistema de archivos, y luego descargarlo a la placa de destino y ejecutarlo. ?

Escribe primero hola.c;?

Compilar:?

#/usr/local/arm/2 . 95 . 3/bin/arm-Linux-gcc–o inicio-hola c?

¿Generar el archivo ejecutable start-hello después de la compilación?

A continuación debemos agregar el archivo ejecutable al sistema de archivos, los pasos son los siguientes: ?

#ganz·k9.img.gz//¿Descompresión?

# mount–olooopk9.img/mnt/new _disk//mount?

#cp start-hello /mnt/new_disk //¿Copiar archivos al sistema de archivos?

#cd /mnt/nuevo_disco?

#umount /mnt/new_disk //¿Desinstalar?

# gzip–c–v9k 9. img & gt; K9.img.gz// ¿Comprimir para generar el sistema de archivos final?

A continuación, descargaremos el kernel y prepararemos el sistema de archivos. Déjame explicarte mi asignación de memoria a continuación:

Flash:?

0x 10000000—¿arranque 0x 10020000?

0x 10020000—0x 10040000 ¿uboot?

0x 10040000—0x 10060000?

0x 10060000--0x 10200000 núcleo?

¿0x 10200000—0x 11000000 disco RAM?

Sdram:?

¿0x 20007 fc 0--0x20a 00000 núcleo?

0x20a00000 - Disco de memoria

¿Loadb descarga datos a la RAM a través del puerto serie?

Cp.b copia los datos de la ram al flash. ?

Después de descargar el kernel y el disco ram del sistema de archivos, también necesitamos configurar las variables de entorno de uboot para que uboot pueda iniciar el kernel y otras operaciones cuando esté encendido.

Las variables de entorno se establecen de la siguiente manera:?

set cpfltoram CP . b 10200000 20a 00000 18 ffff//¿Copiar el sistema de archivos a la RAM?

Configurar bootm 20007fc0//¿Iniciar el kernel?

set bootcmd run cpfltoker \; run cpfltoram \; run boot // ¿Ejecutar el comando de reinicio de uboot?

Establecer cpfltoker CP . b 10060000 20007 fc 0 f 4 fff//¿Copiar el kernel a la RAM?

set bootargs root =/dev/ram rw initrd = 0x20a 00000, 4M init=/linuxrc console=ttyS0, 11520?

0, mem = 32m//Parámetros de arranque pasados ​​al kernel por uboot.

Una vez completada la configuración, saveenv almacena las variables de entorno. ?

Experiencia de aprendizaje: ¿Son archivos de imagen del kernel ejecutables generados por zImage y uImage?

¿Cómo iniciar go addr y bootm addr por separado en u-boot para implementar el proceso de inicio?

Es decir, zImage se inicia mediante go y uImage se inicia mediante go.

¿La relación entre zImage y uImage 2 es que uImage es generado por zImage a través de mkimage (una herramienta en herramientas en u-boot)?

El resultado es que el encabezado de este último tiene 64 bytes más que el primero, y los 64 bytes adicionales se utilizan para notificar a u-boot. Informar a Uber de información relevante;

De esta manera, u-boot tendrá dos direcciones al iniciar el kernel: ¿la diferencia entre la dirección de carga y la dirección de entrada 2 es exactamente 0x40 (64 bytes)?

Cuando se usa bootm loadaddress de esta manera, u-boot se ajustará de acuerdo con la dirección de carga correspondiente. Hay dos situaciones;

1), cuando loadaddress y mkimage son iguales:

Luego, al cargar ldrpc y Entryaddress, se seleccionará la dirección de entrada de mkinage, es decir, PC = dirección de carga+4; ; luego control de PC El proceso salta a la memoria RAM inversa para su ejecución;?

2) Cuando loadaddress y mkimage son inconsistentes:

Luego, después de comparar las direcciones, u-bbot restará 64 bytes de la dirección de carga actual y reemplazará la imagen real del kernel (la kernel sin el encabezado de 64 bytes) se copia en la dirección de carga preconstruida y luego el kernel se inicia directamente desde esta dirección de carga;

En resumen, ¿cuál es la diferencia real entre las dos situaciones anteriores? De hecho, al ejecutar el código final, si la dirección no coincide con la especificada en mkinage, u-boot copiará el código del kernel, eliminará el archivo de encabezado y lo ejecutará directamente. Si no se procesa, el kernel se ejecutará con loadaddress+0x40;?

Descargar zImage o uImage a través del servicio tftp;?

Cuando tftp falla, Loadb usa el puerto serie para descargar el kernel. ¿Quieres utilizar este método?

Cp.b\. w\. ¿Terminé de copiar de la memoria a la memoria flash?

Finalmente, puede configurar la variable de entorno bootcmd para permitir que u-boot inicie automáticamente el kernel.

En cuanto a los dos métodos del sistema de archivos: ramdisk y nfs, se recomienda a los desarrolladores utilizar nfs para facilitar la modificación;

¿Cuando se utiliza ramdisk?

#ganz·k9.img.gz//¿Descomprimir?

# mount–olooopk9.img/mnt/new _disk//mount?

#umount /mnt/new_disk //¿Desinstalar?

# gzip–c–v9k 9. img & gt; K9.img.gz // Reducir para generar el sistema de archivos final.

No olvides estos cuatro comandos. ¿Qué tan poderosos son para ti?

No quiero que vuelvas a construir el sistema de archivos raíz.