Utilisez QEMU (x86) pour simuler l'exécution de l'architecture ARM64 et effectuer le débogage du noyau

Émulez et déboguez ARM64 sur x86 à l'aide de la machine virtuelle QEMU.
Référence : Utiliser QEMU pour créer un environnement ARM64 dans une machine virtuelle Ubuntu

Préparation

  • Hôte gratuit 20.04, Linux 5.16.0
  • Émulateur QEMU version 7.2.92 (v8.0.0-rc2-23-gefcd0ec14b) :qemu-7.2.29
  • Source de noyau ARM64 appropriée : linux-4.14.221.tar.gz
  • Installez l'outil de compilation croisée :sudo apt-get install gcc-aarch64-linux-gnu

insérez la description de l'image ici

Installer QEMU

L'installation de la commande et l'installation du code source ne prennent pas en charge la plate-forme Raspberry Pi 4B

  1. Commande pour installer qemu : sudo apt install qemu-system-arm,qemu-system-aarch64 --help
  2. Installez qemu-5.2.0/qemu-7.2 en compilant et en installant.
  3. Notez les variables d'environnement :export ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

Cependant, l'installation de la commande ne prend pas en charge 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. Installez qemu-5.2.0/qemu-7.2 en compilant et en installant.

Installez 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

Utilisez debootstrap pour créer un système de fichiers racine

installer le paquet

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

Initialiser le système de fichiers racine

$ 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

Entrez dans le système de fichiers racine

$ chroot linux_rootfs/

Configurer le mot de passe de l'utilisateur root

passwd root

Ajouter un utilisateur et définir un mot de passe

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

définir le nom d'hôte

echo XXX-PC > /etc/hostname

définir le réseau

$ 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

installer les dépendances

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

Créer un système de fichiers ext4

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

Formatez avec la commande mkfs.ext4 :

$ mkfs.ext4 linux_rootfs.ext4

Monter et copier du contenu :

$ 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

compilation du noyau

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

CONFIG_GDB_SCRIPTSActiver et désactiver lors de la compilation du noyau CONFIG_DEBUG_INFO_REDUCED. CONFIG_FRAME_POINTERLaissez-le activé si l'architecture le prend en charge .

Une fois la compilation réussie, arch/arm64/boot/un fichier image sera généré sous le répertoire.

QEMU simule le démarrage de l'architecture ARM64

Commande de démarrage :

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: commande QEMU, utilisée pour démarrer une machine virtuelle AARCH64.
  • -m 1024: Définissez la taille de la mémoire de la machine virtuelle sur 1 Go.
  • -cpu cortex-a57: modèle de CPU A57 utilisé pour exécuter la machine virtuelle.
  • -M virt -nographic: Définissez QEMU en mode virtualisation sans afficher d'interface graphique.
  • -smp 4: Définissez le nombre maximal de threads pris en charge par la machine virtuelle sur 4.
  • -kernel linux-4.14.221/arch/arm64/boot/Image: spécifie le fichier du noyau Linux à charger.
  • -append "noinintrd sched_debug root=/dev/vda rootfstype=ext4 rw crashkernel=256M loglevel=8": ajoutez des paramètres de noyau pour activer les options de débogage noinintrd sched_debug et définissez le répertoire racine sur /dev/vda dans le VDA.
  • if=none,file=linux_rootfs.ext4,id=hd0: Spécifie que le périphérique de stockage à utiliser est le périphérique HD0 sur le contrôleur IDE et que le nom du fichier est linux_rootfs.ext4.
  • -device virtio-blk-device,drive=hd0 : spécifie le périphérique virtio blk à utiliser pour les périphériques de stockage.

Veuillez ajouter une description de l'imageÀ ce stade, l'environnement de simulation est configuré !

débogage

Compilation croisée strace et installation

Générer un fichier de guide de compilation

./bootstrap

compilation croisée arm64

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

compiler

make LDFLAGS+="-static -pthread"

Ajouter au système de fichiers racine

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

insérez la description de l'image iciutilisation de strace : commande linux strace

Compilation croisée de gdb et installation

Les interfaces graphiques ne sont pas prises en charge.

  • 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/

Erreurs de compilation et solutions : https://blog.csdn.net/weixin_44602409/article/details/115716913

insérez la description de l'image ici
vim ~/.bashrc,Ajouter à:

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

noyau de débogage

  1. La commande QEMU démarre le noyau en ajoutant -S -sdes paramètres.
  • -S est de suspendre le gdbserver et de permettre à l'outil gdb de se connecter à distance.
  • -s utilise le port 1234 pour le débogage à distance par défaut

Le démarrage du noyau se bloque, attendant que gdb se connecte.

insérez la description de l'image ici

  1. Dans une nouvelle fenêtre de commande, lancez la commande gdb jiaming@jiaming-pc:~/Documents/jailhouse-rpi4/qemu-arm64/linux-4.14.221$ aarch64-linux-gdb vmlinuxet connectez-vous en utilisant le port par défaut, target remote localhost:1234.

insérez la description de l'image iciAprès avoir quitté l'outil gdb, le noyau continue de démarrer et affiche les informations de démarrage.

post-scriptum

  1. Lorsqu'une erreur ld se produit lors de la compilation, envisagez de remplacer la version du compilateur. make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- LD=/home/jiaming/gnu/aarch64/lin/aarch64-linux/bin/aarch64-linux-gnu-ld
    Ou, spécifiez tout :
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 dernière version de qemu ne prend pas en charge l'émulation de plate-forme rpi4.
  2. Dans l'outil gparted, on constate que les disques sont tous gris, indiquant que les disques ont été montés et n'ont en fait pas besoin d'être montés.

utiliser la boîte occupée

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

Commande de démarrage 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

Pour monter /dev/vda en tant que système de fichiers racine, les options suivantes doivent être configurées dans le noyau

CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_PCI=y
CONFIG_EXT4_FS=y

Sinon cette erreur se produit :

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

Une nouvelle fenêtre apparaît au démarrage de QEMU

installer sdl

Installez sdl : https://blog.csdn.net/qq_22948593/article/details/109740372, aucune compilation croisée n'est requise.
https://www.libsdl.org/release/SDL2-2.0.14.tar.gz

Réinstaller QEMU

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

Il y a -nographicdes paramètres :

insérez la description de l'image ici

Aucun -nographicParamètres :

insérez la description de l'image ici
Aucun -nographicparamètre, ajoutez -monitor stdioun paramètre :

insérez la description de l'image iciAppuyez sur qpour quitter.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_39541632/article/details/129910433
conseillé
Classement