Enseñarle paso a paso: cómo usar Qemu para simular un sistema ARM


Este es el original 011 del hermano Dao.

Prefacio

Hace algún tiempo, por necesidades laborales, investigué un poco sobre el simulador ARM. El propósito de la investigación es: debido a que hay muchas personas involucradas en el proyecto, si la mano de obra es una placa de desarrollo ARM, los recursos son relativamente escasos y se espera que se pueda usar el simulador en su lugar.

Durante la investigación, dediqué mucho tiempo a verificar información, probar y verificar. Durante la verificación real, se descubrió un fenómeno: aunque muchos artículos dan pasos de operación simples o detallados, la mayoría de ellos no escriben claramente los antecedentes de la operación y la versión de cada software, lo que lleva a la necesidad de leer el artículo completo. Después de realizar todos los pasos de la operación, puede comprender qué quiere expresar el autor y cuál es el propósito de la operación .

En mi opinión, para cualquier artículo, primero debemos informar a los lectores por qué quieren leer este artículo, o qué beneficios se pueden obtener al leer este artículo .

Si se trata de un artículo altamente operable, entonces es necesario explicar claramente cuál es el trasfondo de la plataforma de trabajo, cuál es el objetivo a alcanzar y cuál es el procedimiento general . Solo de esta manera, las personas que leen el artículo primero establecen un marco macro en sus mentes y luego pasan a la operación real sobre la base de la comprensión del marco, para que sea más fácil de entender.

Por supuesto, los hábitos de aprendizaje y lectura de cada persona son diferentes, lo anterior son solo mis sentimientos personales, o me gusta un artículo más organizado, para no confundirme.

Volviendo al tema de Qemu, este artículo es principalmente para clasificar y resumir los resultados de la encuesta, incluidos los siguientes:

¿Por qué necesitamos un sistema de simulación ARM ?,
¿Qué es
Qemu ?, ¿Qué puede hacer Qemu? ¿O para qué es adecuado?
En el sistema Ubuntu 16.04, ¿cuáles son los pasos para construir una máquina virtual ARM con Qemu?
Escriba un programa HelloWorld y colóquelo en una máquina virtual para su ejecución.

¿Por qué necesita un sistema analógico ARM?

El trabajo de desarrollo de software en la plataforma ARM se puede dividir en dos categorías:

Desarrollo del
sistema de desarrollo de aplicaciones (kernel, sistema de archivos, controlador)

Desarrollo de aplicaciones

Cuando desarrollamos proyectos integrados, generalmente desarrollamos la mayoría de las funciones en la plataforma x86 primero y luego las compilamos para obtener programas ejecutables o archivos de biblioteca en la plataforma ARM. Luego copie estos archivos en la placa ARM y ejecútelos mediante el comando scp o el montaje remoto NFS .

En términos generales, los programas de aplicación utilizan varios recursos y periféricos de productos de hardware para completar funciones específicas, como recopilación de datos, control de dispositivos externos, transmisión de red, etc. La característica principal es interactuar con varios dispositivos externos.

Desarrollo de sistemas (BSP)

El objetivo final del desarrollo del sistema es preparar un entorno de ejecución básico para la ejecución de aplicaciones, que incluyen: cargador de arranque del sistema, cargador de arranque, kernel del kernel, rootfs del sistema de archivos y controladores para todos los dispositivos del sistema . En el desarrollo del proyecto real, el desarrollo del sistema es más difícil. Una vez que se completa el desarrollo, básicamente no es fácil cambiar por una placa, y el ciclo de vida del código es más largo.

Las dos clasificaciones anteriores se dividen principalmente desde la perspectiva del contenido del trabajo de desarrollo. Como puede verse:

Desarrollo de aplicaciones: mayor flexibilidad, más cambios en los requisitos (los jefes de producto o jefes de proyecto a menudo cambian sus requisitos).
Desarrollo de software del sistema: la demanda es más estable, muchos códigos se proporcionan oficialmente o de código abierto, y el contenido del trabajo es personalización y adaptación.

Para el desarrollo de software del sistema, si se compila un cargador de arranque o un kernel cada vez, se verifica en una placa de desarrollo ARM, lo cual es realmente problemático. Si puede tener un sistema de simulación ARM y simular directamente en x86, la eficiencia del trabajo mejorará mucho .

¿Qué es Qemu?

Qemu es una máquina virtual alojada de código abierto , que implementa un simulador virtual a través de software puro, que puede simular casi cualquier dispositivo de hardware . Por ejemplo: Qemu puede simular un sistema ARM: CPU, memoria, dispositivos IO, etc., y luego en esta capa de simulación, puede ejecutar una máquina virtual ARM, esta máquina virtual ARM cree que se trata del hardware, pero en realidad Qemu simula el hardware anterior .

Solo porque Qemu se implementa en software puro, todas las instrucciones deben pasar por su conversión, por lo que el rendimiento es muy bajo. Por lo tanto, en el entorno de producción, la mayoría de las prácticas son cooperar con KVM para completar el trabajo de virtualización, porque KVM es una tecnología de virtualización asistida por hardware, que es la principal responsable de la virtualización de CPU y memoria más engorrosa, mientras que Qemu es responsable de Virtualización de E / S., Los dos cooperan entre sí para jugar sus propias ventajas y complementarse entre sí. Esta parte no es el enfoque, por lo que no la presentaré en detalle.

Dos modos de Qemu

Qemu tiene dos modos de ejecución :

  1. Modo usuario: Utilizar el mecanismo de traducción de código dinámico para ejecutar códigos de diferentes arquitecturas de host, por ejemplo: Simular la ejecución de código ARM en la plataforma x86, es decir: Escribimos una instrucción ARM y la pasamos a todo el simulador. toda la instrucción se traducirá en las instrucciones de la plataforma x86 y luego se ejecutará en la CPU x86.

  1. Modo de sistema: simule todo el sistema informático y utilice otro VMM (Xen, KVM) para utilizar el soporte de virtualización proporcionado por el hardware para crear una máquina virtual con todas las funciones cerca del rendimiento del host.

¿Qué puede hacer Qemu? ¿O para qué sirve?

Debido a que Qemu usa simulación de software puro, su fortaleza es simular escenarios que no involucran dispositivos de hardware externos específicos , como:

Quiero aprender a personalizar el gestor de arranque;
quiero cortar el sistema de archivos en el sistema Arm y aprender
a montar el sistema de archivos; quiero experimentar cómo configurar y adaptar el kernel de Linux;
quiero aprender el dispositivo árbol en el sistema Linux;

En estos escenarios, es muy adecuado utilizar Qemu para simular el sistema ARM.

En el sistema Ubuntu 16.04, use Qemu para construir una máquina virtual ARM

Varias opciones para usar la máquina virtual Qemu

Usando Qemu para ejecutar la máquina virtual ARM, tiene 2 opciones :

  1. Manera simple: descargue directamente el archivo de imagen compilado por otros (incluido el kernel y el sistema de archivos raíz) y ejecútelo directamente.


    La desventaja es: alguien compilado puede no satisfacer sus necesidades y no se puede personalizar.
  2. Manera compleja: descargue el código del kernel y el código del sistema de archivos raíz (por ejemplo: busybox) usted mismo y luego compílelo.


    La ventaja es: puede adaptar los modelos del sistema de archivos raíz y del kernel de acuerdo con sus necesidades reales.

En el segundo modo complejo, hay dos opciones :

2-1. El código del kernel y el código del sistema de archivos raíz se compilan manualmente por sí mismos y, finalmente, estos resultados compilados se organizan manualmente en una carpeta para formar su propio directorio raíz;
2-2. Usando todo el marco de buildroot, solo necesita configurar manualmente (por ejemplo: la ubicación del compilador cruzado en la máquina, la ruta de salida, el corte del sistema), y luego puede compilar un sistema completo con un clic, que se puede grabar directamente en la máquina !

La elección de los distintos modos de funcionamiento anteriores se puede seleccionar de acuerdo con sus necesidades reales. Si ya está muy familiarizado con todo el proceso de construcción de un sistema, use la herramienta buildroot ; si desea aprender a construir un sistema más a fondo , compile y opere manualmente paso a paso, y practique algunas veces, y lo hará conviértete en un gran Es una vaca.

A continuación, realizaremos la operación real de la forma 2-2 . Para todas las partes de instrucciones, pego directamente el código sin tomar capturas de pantalla, lo cual es conveniente para copiar.

plataforma de prueba

Mi computadora de trabajo es Win10 e instalé la máquina virtual Ubuntu 16.04 a través de VirtualBox , sistema de 64 bits .

Las siguientes operaciones se pueden compilar con éxito en la máquina virtual Ubuntu 16.04. Por supuesto, algunas herramientas básicas (por ejemplo: build-essential, make y otras herramientas básicas no se detallan aquí).

Instalar el compilador cruzado

La función del compilador cruzado no necesita explicarse en detalle, porque estamos compilando en la plataforma x86 y la plataforma en ejecución es el sistema ARM. Los conjuntos de instrucciones de estas dos plataformas son diferentes, por lo que se necesita una compilación cruzada para obtener la ejecución en el programa del sistema ARM.

sudo apt-get install gcc-arm-linux-gnueabi 

Verificar el resultado de la instalación

dpkg -l gcc-arm-linux-gnueabi 

La pantalla es la siguiente:

Algunos artículos recomiendan descargar el compilador cruzado usted mismo y luego configurar manualmente las variables de entorno. La cadena de herramientas de compilación cruzada descargada manualmente informó un error al compilar el kernel, por lo que se recomienda instalarlo directamente con apt-get .

Compilar el kernel del kernel

El papel del kernel también es evidente, es equivalente a nuestro sistema operativo Windows, sin este sistema operativo, el hardware es un montón de chatarra. Cuando el sistema se inicia, el kernel se cargará en la memoria y luego se ejecutará desde la dirección de entrada del kernel.

  1. Descargue la
    versión del kernel : linux-4.14.212.tar.
    Al final del artículo, enumeraré todas las direcciones de descarga de paquetes de software.

  2. Utilice el archivo de configuración de la placa de desarrollo vexpress listo para usar

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig 

Esta operación guardará vexpress_defconfig como un archivo de configuración como .config . Cuando compile el kernel, compílelo de acuerdo con la configuración en esta configuración.

Si necesita adaptar el kernel, ejecute:

make menuconfig

Personalice el kernel de acuerdo con sus necesidades reales. Por ejemplo: puede configurar la red y NFS, y montar automáticamente un directorio en el host cuando se inicia el sistema.

  1. Compila el kernel
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

El archivo de kernel arch / arm / boot / zImage está compilado y este archivo de imagen debe especificarse cuando se inicia Qemu.

Hacer el sistema de archivos raíz

Una vez que se inicia el kernel y cuando llega al paso final, necesita montar el sistema de archivos raíz y luego ejecutar el programa de ejecución especificado en el sistema de archivos, por ejemplo: /etc/rc.local.

Si no hay un sistema de archivos, el kernel le preguntará: panic ... al final de la ejecución .

  1. Descarga busybox

    Versión: busybox-1.20.2.tar.bz2.

  2. Crear directorio raíz rootfs

mkdir -p rootfs/{dev,etc/init.d,lib} 
  1. Copie los archivos en busybox-1.20.2 al directorio raíz de rootfs, principalmente algunos comandos básicos
cp busybox-1.20.2/_install/* -r rootfs/ 
  1. Copie los archivos de la biblioteca en la cadena de herramientas de compilación cruzada a la carpeta lib en el directorio raíz de rootfs
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/ 
  1. Creación de un espejo del sistema de archivos raíz El espejo del sistema de archivos
    raíz es equivalente a un disco duro , que consiste en copiar todos los archivos del directorio raíz de los rootfs anteriores a este disco duro.

(1) Genere una imagen de disco de 512M

qemu-img create -f raw disk.img 512M 

(2) Formatee la imagen del disco en el sistema de archivos ext4

mkfs -t ext4 ./disk.img 

(3) Copie todos los archivos en el directorio raíz de rootfs a la imagen del disco. Los
pasos de la operación son: crear un punto de montaje-montar-copiar archivos-desmontar.

mkdir tmpfs 
sudo mount -o loop ./disk.img tmpfs/  
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs 

(4) Utilice el comando de archivo para comprobar

file disk.img

Use Qemu para iniciar la máquina virtual ARM

1. Inicie la máquina virtual

Este comando es un poco largo, se recomienda copiar y pegar directamente durante la prueba.

qemu-system-arm -M vexpress-a9 -m 512M -kernel ./linux-4.14.212/arch/arm/boot/zImage -dtb  ./linux-4.14.212/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd disk.img

2. Detenga la máquina virtual
En otra ventana de terminal de Ubuntu, use el comando killall para detenerla.

killall qemu-system-arm

Por supuesto, también puede usar el comando ps para encontrar el número de proceso de qemu-system-arm, y luego usar kill -9 para detener la máquina virtual.

Prueba la aplicación HelloWorld

  1. En cualquier directorio de Ubuntu, escriba el programa ejecutable HelloWorld hello.c:
#include <stdio.h> 
int main() 
{     
    printf("HelloWorld! \n");
    return 0; 
} 
  1. Realice una compilación cruzada de hello.c para obtener el programa ejecutable hello:
arm-linux-gnueabi-gcc hello.c -o hello 

Verifique el programa de saludo a través del comando de archivo:

file hello

  1. Detenga la máquina virtual mediante el comando kill.

  2. Copie el programa ejecutable hello en la imagen de disco disk.img. Los
    pasos de la operación son: montar-copiar archivos-desinstalar.

sudo mount -o loop ./disk.img tmpfs/  
cp hello tmpfs/ 
sudo umount tmpfs 
  1. Ejecute el programa de saludo
    y vuelva a iniciar la máquina virtual. En este momento, puede ver el archivo de saludo en el directorio raíz y ejecutarlo directamente para ver el resultado de salida.

para resumir

En los pasos de operación anteriores, compilamos y operamos manualmente todos los programas que necesita un sistema ARM antes de iniciar la aplicación . Es fácil de entender después de leerlo, y la impresión será aún más impresionante si lo maneja con sus propias manos.

Algunas de las operaciones aquí deben profundizarse aún más. Por ejemplo, después de que se inicia el sistema, se monta automáticamente una carpeta en la máquina host (sistema Ubuntu), de modo que los programas ejecutables como hello se pueden copiar en el directorio de montaje, y luego se ejecuta directamente en el sistema ARM, y no es necesario realizar la siguiente serie de operaciones (detener la máquina virtual, montar la imagen del disco, copiar el archivo, desinstalar, iniciar la máquina virtual).

¡Finalmente, espero que este resumen pueda traerle pequeñas ganancias y mejoras!

Dirección de descarga de software

  1. linux-4.14.212.tar.xz
    enlace: https://pan.baidu.com/s/1d8RxjMkYQhPtbZgiybD8Gw
    código de extracción: b6ft

  2. busybox-1.20.2.tar.bz2
    enlace: https://pan.baidu.com/s/1oPeH7juEWuFR6y1Qpna_BA
    código de extracción: 9kh6


[Declaración original]

Si cree que el artículo es bueno, reenvíelo y compártalo con sus amigos.

Voy a resumir y compartir la experiencia de combate real de los proyectos de desarrollo integrado por más de diez años , creo que usted no será decepcionado!

Mantenga presionada la imagen a continuación, cada artículo tiene productos secos.

Reimpresión: bienvenido a reimprimir, pero sin el consentimiento del autor, esta declaración debe conservarse y el enlace original debe incluirse en el artículo.




Lectura recomendada

[1] El principio de depuración subyacente de gdb es tan simple
[2] Tecnología de doble búfer en modo productor y consumidor
[3] Lenguaje de scripting LUA en profundidad, para que pueda comprender a fondo el principio de depuración
[4] Análisis paso a paso -cómo implementarlo en programación orientada a objetos C

Supongo que te gusta

Origin blog.csdn.net/u012296253/article/details/111908443
Recomendado
Clasificación