Use QEMU (x86) para simular la ejecución de la arquitectura ARM64 y realizar la depuración del kernel

Emule y depure ARM64 en x86 usando la máquina virtual QEMU.
Referencia: Use QEMU para construir un entorno ARM64 en una máquina virtual ubuntu

Preparación

  • Alojamiento gratuito 20.04, Linux 5.16.0
  • Emulador QEMU versión 7.2.92 (v8.0.0-rc2-23-gefcd0ec14b) :qemu-7.2.29
  • Fuente de kernel ARM64 adecuada: linux-4.14.221.tar.gz
  • Instale la herramienta de compilación cruzada:sudo apt-get install gcc-aarch64-linux-gnu

inserte la descripción de la imagen aquí

Instalar QEMU

Tanto la instalación de comandos como la instalación del código fuente no son compatibles con la plataforma Raspberry Pi 4B

  1. Comando para instalar qemu: sudo apt install qemu-system-arm,qemu-system-aarch64 --help
  2. Instale qemu-5.2.0/qemu-7.2 compilando e instalando.
  3. Tenga en cuenta las variables de entorno:export ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

Sin embargo, la instalación de comandos no es compatible con Raspberry Pi 4.

jiaming@jiaming-pc:~/Documents/jailhouse-rpi4$ qemu-system-aarch64 -M ?
Supported machines are:
...
raspi2               Raspberry Pi 2
raspi3               Raspberry Pi 3
realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
...
  1. Instale qemu-5.2.0/qemu-7.2 compilando e instalando.

Instalar ninja.

git clone https://github.com/ninja-build/ninja.git && cd ninja
./configure.py --bootstrap
cp ninja /usr/bin/
./configure --target-list=aarch64-softmmu,aarch64-linux-user --enable-debug
make -j4
make install

Use debootstrap para hacer un sistema de archivos raíz

paquete de instalación

$ sudo apt-get install bison flex bc build-essential libncurses* libssl-dev
$ sudo apt-get install  qemu-user-static binfmt-support debootstrap

Inicializar el sistema de archivos raíz

$ sudo su - root
$ debootstrap --arch=arm64 --foreign buster linux_rootfs http://mirrors.ustc.edu.cn/debian/ # linux_rootfs:本地目录,最后制作好的文件系统会在此目录
$sudo cp /usr/bin/qemu-aarch64-static ./linux_rootfs/usr/bin/
$ sudo chroot linux_rootfs/ debootstrap/debootstrap --second-stage

Ingrese al sistema de archivos raíz

$ chroot linux_rootfs/

Configurar contraseña de usuario raíz

passwd root

Agregar usuario y establecer contraseña

useradd -G sudo -m -s /bin/bash XXX
passwd XXX

establecer nombre de host

echo XXX-PC > /etc/hostname

establecer red

$ echo "auto lo" > /etc/network/interfaces
$ echo "iface lo inet loopback" >> /etc/network/interfaces
$ echo "allow-hotplug enp0s1" > /etc/network/interfaces
$ echo "iface enp0s1 inet dhcp" >> /etc/network/interfaces

instalar dependencias

$ apt update
$ apt install net-tools build-essential

Hacer sistema de archivos ext4

$ dd if=/dev/zero of=linux_rootfs.ext4 bs=1M count=2048

Formatee con el comando mkfs.ext4:

$ mkfs.ext4 linux_rootfs.ext4

Montar y copiar contenido:

$ mkdir -p tmpfs
$ sudo mount -t ext4 linux_rootfs.ext4 tmpfs/ -o loop
$ sudo cp -af linux_rootfs/* tmpfs/
$ sudo umount tmpfs
$ sudo chmod 777 linux_rootfs.ext4

compilación del núcleo

$ cd linux-4.14.221/
$ export ARCH=arm64 ROSS_COMPILE=aarch64-linux-gnu-
$ make defconfig
$ make -j4

CONFIG_GDB_SCRIPTSActivar y desactivar al compilar el kernel CONFIG_DEBUG_INFO_REDUCED. CONFIG_FRAME_POINTERDéjelo activado si la arquitectura lo admite .

Después de que la compilación sea exitosa, arch/arm64/boot/se generará un archivo de imagen en el directorio.

QEMU simula el inicio de la arquitectura ARM64

Comando de inicio:

qemu-system-aarch64 \
-m 1024 \
-cpu cortex-a57 \
-M virt -nographic \
-smp 4 \
-kernel linux-4.14.221/arch/arm64/boot/Image \
-append "noinintrd sched_debug root=/dev/vda rootfstype=ext4 rw crashkernel=256M loglevel=8" \
-drive if=none,file=linux_rootfs.ext4,id=hd0 \
-device virtio-blk-device,drive=hd0 
  • qemu-system-aarch64: Comando QEMU, utilizado para iniciar una máquina virtual AARCH64.
  • -m 1024: establezca el tamaño de la memoria de la máquina virtual en 1 GB.
  • -cpu cortex-a57: CPU modelo A57 utilizada para ejecutar la máquina virtual.
  • -M virt -nographic: establezca QEMU en modo de virtualización sin mostrar una interfaz gráfica.
  • -smp 4: establezca la cantidad máxima de subprocesos admitidos por la máquina virtual en 4.
  • -kernel linux-4.14.221/arch/arm64/boot/Image: Especifica el archivo del kernel de Linux para cargar.
  • -append "noinintrd sched_debug root=/dev/vda rootfstype=ext4 rw crashkernel=256M loglevel=8": agregue parámetros del kernel para habilitar las opciones de depuración noinintrd sched_debug y establezca el directorio raíz en /dev/vda en VDA.
  • if=none,file=linux_rootfs.ext4,id=hd0: especifica que el dispositivo de almacenamiento que se utilizará es el dispositivo HD0 en el controlador IDE y el nombre del archivo es linux_rootfs.ext4.
  • -device virtio-blk-device,drive=hd0 : especifica el dispositivo virtio blk que se utilizará para los dispositivos de almacenamiento.

Por favor agregue una descripción de la imagenEn este punto, ¡el entorno de simulación está configurado!

depuración

Traza de compilación cruzada e instalación

Generar archivo de guía de compilación

./bootstrap

arm64 compilación cruzada

./configure CC=aarch64-linux-gnu-gcc LD=aarch64-linux-gnu-ld --host=aarch64-linux --enable-mpers=no

compilar

make LDFLAGS+="-static -pthread"

Agregar al sistema de archivos raíz

sudo mount -t ext4 linux_rootfs.ext4 tmpfs/ -o loop
sudo cp -af strace/src/strace tmpfs/bin/
sudo umount tmpfs

inserte la descripción de la imagen aquíuso de strace: comando strace de linux

Compilación cruzada gdb e instalación

Las GUI no son compatibles.

  • gdb-8.0
  • sudo apt-get install g++-9-aarch64-linux-gnu
export CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++-9
cd gdb-8.0/
mkdir gdb-build
./configure --host=aarch64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux- --prefix=/home/jiaming/Documents/jailhouse-rpi4/qemu-arm64/gdb-8.0/gdb-build
make
sudo make install
sudo cp /usr/aarch64-linux-gnu/lib/* /lib/

Errores de compilación y soluciones: https://blog.csdn.net/weixin_44602409/article/details/115716913

inserte la descripción de la imagen aquí
vim ~/.bashrc,Añadir:

export PATH=$PATH:/home/jiaming/Documents/jailhouse-rpi4/qemu-arm64/gdb-8.0/gdb-build/bin

núcleo de depuración

  1. El comando QEMU inicia el kernel, agregando -S -sparámetros.
  • -S es para suspender gdbserver y permitir que la herramienta gdb se conecte de forma remota.
  • -s usa el puerto 1234 para la depuración remota de forma predeterminada

El arranque del kernel se cuelga, esperando que gdb se conecte.

inserte la descripción de la imagen aquí

  1. En una nueva ventana de comandos, inicie el comando gdb jiaming@jiaming-pc:~/Documents/jailhouse-rpi4/qemu-arm64/linux-4.14.221$ aarch64-linux-gdb vmlinuxy conéctese usando el puerto predeterminado, target remote localhost:1234.

inserte la descripción de la imagen aquíDespués de salir de la herramienta gdb, el kernel continúa iniciándose y genera la información de inicio.

posdata

  1. Cuando ocurre un error de ld durante la compilación, considere reemplazar la versión del compilador. make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- LD=/home/jiaming/gnu/aarch64/lin/aarch64-linux/bin/aarch64-linux-gnu-ld
    O, especifique todo:
make ARCH=arm64 CROSS_COMPILE=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- CC=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc LD=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld AR=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar install
  1. La última versión de qemu no admite la emulación de la plataforma rpi4.
  2. En la herramienta gparted, se encuentra que todos los discos están grises, lo que indica que los discos se han montado y, en realidad, no es necesario montarlos.

usar caja ocupada

  • busybox-1.29.0
  • Instale la cadena de herramientas de compilación cruzada ( linaro-7.5 ) y la versión 9.x predeterminada se compila incorrectamente.
wget  https://busybox.net/downloads/busybox-1.29.0.tar.bz2
tar -xjf busybox-1.29.0.tar.bz2
cd busybox-1.29.0
make ARCH=arm64 CROSS_COMPILE=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- CC=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc LD=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld AR=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar menuconfig
make ARCH=arm64 CROSS_COMPILE=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- CC=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc LD=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld AR=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar
make ARCH=arm64 CROSS_COMPILE=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- CC=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc LD=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld AR=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar install
dd if=/dev/zero of=busybox-1.29.0-rootfs_ext4.img bs=1M count=100 oflag=direct
mkfs.ext4 busybox-1.29.0-rootfs_ext4.img
mkdir rootfs
sudo mount busybox-1.29.0-rootfs_ext4.img rootfs/
sudo cp -raf busybox-1.29.0/_install/* rootfs/

cd rootfs
sudo mkdir -p proc sys tmp root var mnt dev
sudo mknod dev/tty1 c 4 1
sudo mknod dev/tty2 c 4 2
sudo mknod dev/tty3 c 4 3
sudo mknod dev/tty4 c 4 4
sudo mknod dev/console c 5 1
sudo mknod dev/null c 1 3
sudo cp -r ../busybox-1.29.0/examples/bootfloppy/etc/ .

cd ..
sudo umount rootfs

Comando de inicio de QEMU:qemu-system-aarch64 -m 1024 -cpu cortex-a57 -machine virt,gic-version=3,virtualization=on -kernel Image -append "console=ttyAMA0 root=/dev/vda init=/linuxrc rw" -hda busybox-1.29.0-rootfs_ext4.img -monitor stdio

Para montar /dev/vda como el sistema de archivos raíz, se deben configurar las siguientes opciones en el kernel

CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_PCI=y
CONFIG_EXT4_FS=y

De lo contrario, se produce este error:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(254,0)

Aparece una nueva ventana cuando se inicia QEMU

instalar sdl

Instale sdl: https://blog.csdn.net/qq_22948593/article/details/109740372, no se requiere compilación cruzada.
https://www.libsdl.org/release/SDL2-2.0.14.tar.gz

Reinstalar QEMU

./configure --target-list=aarch64-softmmu,aarch64-linux-user --enable-debug --enable-sdl
make -j4
make install

Hay -nographicparámetros:

inserte la descripción de la imagen aquí

Ninguno -nographicParámetros:

inserte la descripción de la imagen aquí
Sin -nographicparámetro, añadir -monitor stdioparámetro:

inserte la descripción de la imagen aquíPresione qpara salir.

Supongo que te gusta

Origin blog.csdn.net/weixin_39541632/article/details/129910433
Recomendado
Clasificación