La diferencia entre zImage y uImage
vmlinuz es un kernel comprimido de arranque. vm "significa "memoria virtual". Linux admite memoria virtual, a diferencia de los sistemas operativos más 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".
Vmlinuz se crea de dos maneras: una es a través de "make zImage" al compilar el kernel, y la otra es a través de .NET: "cp /usr/src/linux-2.4/arch/i386/linux. /boot /zImage/boot/vmlinuz".zImage es generado por "cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz"."zImage es adecuado para núcleos pequeños y tiene compatibilidad con versiones anteriores.
El segundo es usar el comando make bzImage para crear el kernel al compilar el kernel y luego usar "cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot /vmlinuz" para generar . Tenga en cuenta que bzImage no utiliza compresión bzip2 y bz en bzImage es engañoso porque bz significa "zImage grande". La b en bzImage significa "grande". Tanto zImage(vmlinuz) como bzImage(vmlinuz) se comprimen con gzip. No sólo son archivos comprimidos, sino que ambos archivos tienen un código de descompresión gzip incrustado al principio. Por lo tanto, no puede utilizar gunzip o gzip -dc para descomprimir vmlinuz.
II.initrd-x.x.x.img
initrd es la abreviatura de "disco ram inicial". Initrd se utiliza normalmente para iniciar temporalmente el hardware hasta un estado en el que el kernel real (es decir, vmlinuz) pueda tomar el control y continuar con el inicio.
El archivo de imagen initrd se crea usando mkinitrd, una utilidad que crea imágenes initrd. Este comando es propiedad de RedHat. Otras distribuciones de Linux pueden tener comandos similares. Esta es una utilidad muy útil. Para obtener más información sobre cómo crear un archivo de imagen initrd usando el siguiente comando, consulte Ayuda: man mkinitrd.
El archivo de imagen final del kernel se genera de dos maneras: zImage y uImage. La zImage se descarga en la placa de destino y puede saltar directamente a ella usando el comando uboot go. En este punto, 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 al kernel. Para pasar los parámetros de arranque tenemos que usar el comando bootm.
El directorio tools/ del código fuente de uboot contiene la herramienta mkimage, que se puede utilizar para crear una variedad de archivos de imagen de arranque comprimidos o sin comprimir.
mkimage crea un archivo de imagen agregando un encabezado de 0x40 bytes al archivo de imagen ejecutable original para registrar la información especificada en los parámetros, de modo que uboot pueda identificar qué arquitectura de CPU, qué sistema operativo, qué tipo, en qué memoria se carga, en qué memoria está el punto de entrada y cuál es el nombre de la imagen
La herramienta mkimage se puede utilizar para crear una variedad de imágenes de arranque comprimidas o sin comprimir.
nombre
El uso es el siguiente:
./mkimage -A arch -O os -T tipo -C comp -a addr -e ep -n nombre -d data_file[: data_file..] imagen
-A ==gt; Establece la arquitectura en 'arch'
-O ==gt; >
-T ==gt; Establece el tipo de imagen en 'tipo'
-C ==gt; Establece el tipo de compresión en 'comp'
-a == gt; Establezca la dirección de carga en 'addr' (hexadecimal)
-e ==gt; Establezca el punto de entrada en 'ep' (hexadecimal)
-n ==gt; nombre de la imagen a 'nombre'
-d ==gt; Usar datos de imagen del 'archivo de datos'
-x ==gt; Establecer XIP (ejecución en su lugar)
Descripción del parámetro:
-A especifica la arquitectura de la CPU:
El valor indica la arquitectura
alfa Alfa
brazo A RM
x86 Intel x86
ia64 IA64
mips MIPS
mips64MIPS 64 bits
ppc PowerPC
s390 IBM S390
sh SuperH
sparc SPARC
sparc64 SPARC 64 bits
m68k MC68000 p >
-O especifica el tipo de sistema operativo, se pueden utilizar 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 imagen. Su rango de valores es el siguiente:
Independiente, kernel, disco de memoria, múltiple, firmware, script, sistema de archivos
-C especifica el método de compresión de la imagen, su rango de valores es de la siguiente manera:
ninguno no comprime
gzip usa gzip para comprimir la imagen
bzip2 usa bzip2 para comprimir la imagen
- a especifica el método para cargar la imagen en la dirección de memoria. Cuando se utiliza mkimage para crear una imagen, la imagen se descargará a la memoria de acuerdo con el valor de este parámetro
-e especifica la dirección del punto de entrada de la ejecución de la imagen, es decir, el valor especificado por -un parámetro más 0x40 (porque mkimage agregará un encabezado de 0x40 bytes)
-n especifica el nombre de la imagen
-d especifica el archivo fuente para crear la imagen
El comando que uso al compilar es el siguiente:
p>
# make zImage //generar una imagen zImage
#/usr/ local/arm/k9uboot/ tools/mkimage -n 'Linux 2.4.27' -A arm -O linux -T
kernel -C none -a 0x20007fc0 -e 0x20008000 -d zImage uImage
La imagen del kernel está listo.
Como el tiempo es limitado, usaré el sistema de archivos k9.img.gz que ya está implementado, lo que vamos a hacer es escribir un programa hello.c simple, compilarlo y agregarlo al sistema de archivos y luego descargarlo. al tablero de destino y corriendo.
Primero escribe hello.c;
Compila:
#/usr/local/arm/2.95.3/bin/arm-linux-gcc -o start-hello hello.c
Compile y genere el archivo ejecutable start-hello hello
Ahora debemos agregar el archivo ejecutable al sistema de archivos. Los pasos específicos son los siguientes:
#gunzip k9.img.gz //descomprimir
#mount -o loop k9.img /mnt/new_disk //montar
# cp start-hello /mnt/ new_disk //copiar archivo al sistema de archivos
#cd /mnt/new_disk
#umount /mnt/new_disk //desmontar
#gzip -c -v9 k9 .img gt; k9.img.gz // la compresión genera el sistema de archivos final
A continuación, necesitamos descargar el kernel y preparar el sistema de archivos. Aquí primero explicaré mi asignación de memoria de la siguiente manera. :
Flash:
0x10000000 --- 0x10020000 arranque
0x10020000 --- 0x10040000 uboot
0x10040000 --- 0x10060000 uboot env
0x10060000 --- 0x10200000 kernel
0x10200000 --- 0x11000000 ramdisk
Sdram:
0x20007fc0 --- 0x20a00000 kernel p>
0x20a00000 --- ramdisk
Loadb Descarga datos a la RAM a través del puerto serie
cp.b Copia datos de la RAM a la flash.
Después de descargar el kernel y el disco ram del sistema de archivos, necesitamos configurar las variables de entorno de uboot para que uboot pueda iniciar el kernel y otras operaciones al arrancar.
Las variables de entorno se configuran de la siguiente manera:
Establecer cpfltoram cp.b 10200000 20a00000 18ffff //Copiar el sistema de archivos en la RAM
Establecer boot bootm 20007fc0 //Iniciar el kernel
Establecer bootcmd ejecutar cpfltoker\;ejecutar cpfltoram\;ejecutar boot //Restablecer el comando de ejecución uboot
Establecer cpfltoker cp.b 10060000 20007fc0 f4fff //copiar el kernel a la RAM
Establecer bootargs root =/dev/ ram rw initrd=0x20a00000, 4M init=/linuxrc console=ttyS0, 11520
0, mem=32m //los bootargs se pasan al kernel a través de uboot
Para el kernel de Linux, la compilación puede generar archivos de imagen en diferentes formatos, por ejemplo:
# make zImage
# make uImage
zImage es un archivo comprimido Archivo de imagen comúnmente utilizado en ARM Linux, y uImage es un archivo de imagen específico de U-boot, que tiene un "archivo de encabezado" con una longitud de 0x40 antes de zImage. Antes de zImage, agrega un "encabezado" de longitud 0x40 que describe el tipo de archivo de imagen, la ubicación de carga, el tiempo de compilación, el tamaño y otra información. En otras palabras, si la ejecución comienza directamente desde la posición 0x40 de uImage, no hay diferencia entre zImage y uImage. Además, el kernel de Linux 2.4 no es compatible con uImage, mientras que el kernel de Linux 2.6 agrega mucho soporte para sistemas integrados, pero también es necesario configurar la generación de uImage.
vmlinux compila archivos del kernel sin comprimir.
zImage es una versión comprimida con gzip de vmlinux.
bzImage bz significa "big zImage" y no utiliza compresión bzip2. La diferencia entre los dos es que zImage descomprimirá el kernel hasta el extremo inferior de la memoria (los primeros 640 K), mientras que bzImage descomprimirá el kernel hasta el extremo superior de la memoria (1 M o más). Si el kernel es más pequeño, puede usar zImage o bzImage; si el kernel es más grande, se debe usar bzImage.
uImage Archivo de imagen especial U-boot, es una marca con una longitud de 0x40 antes de zImage.
vmlinuz es un archivo bzImage/zImage, o un enlace a un archivo bzImage/zImage.
initrd es la abreviatura de "disco ram inicial". Por lo general, se utiliza para iniciar temporalmente el hardware hasta un estado en el que el kernel real (vmlinuz) pueda tomar el control y continuar con el inicio.
vmlinux es el archivo del kernel,
zImage es el archivo de imagen del kernel comprimido predeterminado, que comprime vmlinux y descomprime el código de inicio para que solo se ejecute desde la dirección 0X0.
bzImage rara vez aparece en uClinux.
uImage es un formato de archivo de imagen del kernel comprimido de Linux que arranca mediante u-boot mediante el comando bootm.
Utilice la herramienta mkimage para procesar archivos de imagen del kernel comprimidos normales (zImage).
El kernel se puede extraer e iniciar desde cualquier dirección mediante el comando bootm.
Dado que el gestor de arranque suele ocupar la dirección 0X0, la ventaja de uImage sobre zImage es que se puede almacenar junto con el gestor de arranque.
El software mkimage que produce uImage generalmente se coloca en el directorio de herramientas de uClinux-dist (si uClinux-dist tiene uno).