Intégration d'un dispositif virtuel SystemC 2.3.1 avec QEMU-ARM

  1. Obtention et installation de SystemC 2.3.1

Pour commancer, téléchargez la version 2.3.1 de SystemC depuis le dépôt officiel et compilez-la.

wget https://www.accellera.org/images/downloads/standards/systemc/systemc-2.3.1.tgz
tar xzf systemc-2.3.1.tgz
cd systemc-2.3.1
mkdir build && cd build
export CXX=g++
../configure --prefix=/opt/systemc-2.3.1
make -j$(nproc)
sudo make install

La variable CXX définit le compilateur C++. L'option --prefix spécifie le répertoire d'installation.

  1. Compilation et exécution d'une démo SystemC

Téléchargez les fichiers d'exemple liés à la simulation et adaptez la configuraton de construction.

wget https://caslab.ee.ncku.edu.tw/dokuwiki/_media/course:ca:106a:ca_lab_attachedfiles.zip
unzip ca_lab_attachedfiles.zip
cd CA_LAB_AttachedFiles/LAB4/SystemC_Module

Modifiez le fichier Makefile pour pointer vers votre installation SystemC et le compilateur.

# Extraits du Makefile
CXX := g++ -std=c++11
SYSTEMC_DIR := /opt/systemc-2.3.1

Compilez et exécutez la démo.

make -j$(nproc)
export LD_LIBRARY_PATH=/opt/systemc-2.3.1/lib-linux64
./qsysbridge
  1. Construction de l'environnement QEMU pour ARM

Obtenez et compilez une version spécifique de QEMU ciblant l'architecture ARM.

git clone https://github.com/qemu/qemu.git
cd qemu
git checkout v9.0.0
mkdir build_arm && cd build_arm
../configure --target-list="arm-softmmu,arm-linux-user" --prefix=/opt/qemu-arm
make -j$(nproc)
sudo make install

Les cibles arm-softmmu et arm-linux-user génèrent respectivement l'émulateur système et l'émulateur en espace utilisateur.

  1. Préparation de l'environnement de compilation croisée pour ARM

Installez les outils de compilation croisée nécessaires.

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

Vérifiez l'installation en compilant un programme simple.

// fichier: hello.c
#include <stdio.h>
int main(void) {
    printf("Bonjour depuis ARM!\n");
    return 0;
}
arm-linux-gnueabi-gcc hello.c -o hello_arm
/opt/qemu-arm/bin/qemu-arm -L /usr/arm-linux-gnueabi/lib ./hello_arm

Si des erreurs de bibliothèques apparaissent, copiez les fichiers .so manquants dans un répertoire accessible et définissez LD_LIBRARY_PATH.

  1. Compilation du noyau Linux et des utilitaires BusyBox

5.1 Noyau Linux

Téléchargez les sources du noyau Linux 5.10 et utilisez une configuration de base pour ARM.

wget https://github.com/torvalds/linux/archive/refs/tags/v5.10.tar.gz
tar xzf v5.10.tar.gz
cd linux-5.10
make ARCH=arm vexpress_defconfig
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm -j$(nproc)

Les fichiers zImage et les arborescences de périphériques (.dtb) seront générés dans arch/arm/boot/.

5.2 BusyBox

Construisez BusyBox pour fournir les commandes de base du système.

wget https://busybox.net/downloads/busybox-1.36.0.tar.bz2
tar xf busybox-1.36.0.tar.bz2
cd busybox-1.36.0
make defconfig
make CROSS_COMPILE=arm-linux-gnueabi- -j$(nproc)
make install CROSS_COMPILE=arm-linux-gnueabi-

Les fichiers installés se trouvent dans le répertoire _install.

  1. Création du système de fichiers racine (rootfs)

Assemblez un système de fichiers minimal contenant BusyBox, les bibliothèques et les nœuds de périphériques.

mkdir -p rootfs/{dev,etc/init.d,lib,proc,sys,root}
cp -r busybox-1.36.0/_install/* rootfs/
cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
dd if=/dev/zero of=rootfs.ext3 bs=1M count=256
mkfs.ext3 rootfs.ext3
sudo mount -t ext3 rootfs.ext3 /mnt
sudo cp -r rootfs/* /mnt
sudo umount /mnt
  1. Lancement de QEMU avec le système Linux ARM

Démarrez l'émulateur avec le noyau, l'arborescence de périphériques et le système de fichiers racine.

/opt/qemu-arm/bin/qemu-system-arm -M vexpress-a9 -m 512M \
-kernel linux-5.10/arch/arm/boot/zImage \
-dtb linux-5.10/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd rootfs.ext3

L'option -M spécifie la machine virtuelle. Le noyau, l'initrd ou le disque racine peuvent être ajustés selon les besoins.

  1. Intégration d'un composant matériel personnalisé dans QEMU

Pour ajouter un nouveau périphérique virtuel, modifiez le code source de QEMU, reconstruisez-le et mettez à jour le noyau et le système de fichiers si nécessaire.

# Exemple de structure de commande pour reconstruire
cd qemu/build_arm
make -j$(nproc)
sudo make install
cd ../../linux-5.10
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm -j$(nproc)
# Mettre à jour le rootfs et relancer QEMU

La personnalisation implique généralement l'ajout de pilotes dans le noyau ou de modules chargeables.

Étiquettes: SystemC QEMU ARM virtual-device cross-compilation

Publié le 10 juillet à 03h23