É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
Installer QEMU
L'installation de la commande et l'installation du code source ne prennent pas en charge la plate-forme Raspberry Pi 4B
- Commande pour installer qemu :
sudo apt install qemu-system-arm
,qemu-system-aarch64 --help
- Installez qemu-5.2.0/qemu-7.2 en compilant et en installant.
- 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)
...
- 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_SCRIPTS
Activer et désactiver lors de la compilation du noyau CONFIG_DEBUG_INFO_REDUCED
. CONFIG_FRAME_POINTER
Laissez-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.
À 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
utilisation 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
vim ~/.bashrc
,Ajouter à:
export PATH=$PATH:/home/jiaming/Documents/jailhouse-rpi4/qemu-arm64/gdb-8.0/gdb-build/bin
noyau de débogage
- La commande QEMU démarre le noyau en ajoutant
-S -s
des 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.
- 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 vmlinux
et connectez-vous en utilisant le port par défaut,target remote localhost:1234
.
Après avoir quitté l'outil gdb, le noyau continue de démarrer et affiche les informations de démarrage.
post-scriptum
- 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
- La dernière version de qemu ne prend pas en charge l'émulation de plate-forme rpi4.
- 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
- boîte occupée-1.29.0
- Installez la chaîne d'outils de compilation croisée ( linaro-7.5 ) et la version 9.x par défaut ne se compile pas correctement.
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 -nographic
des paramètres :
Aucun -nographic
Paramètres :
Aucun -nographic
paramètre, ajoutez -monitor stdio
un paramètre :
Appuyez sur q
pour quitter.