Selon la distribution que vous souhaitez utiliser, il existe différentes manières de créer une image de système de fichiers, par ex. cet article vous guide à travers le chemin laborieux vers un "Linux from Scratch" système.
En général , vous feriez soit créer une image QEMU en utilisant qemu-img
, récupérez le support d'installation de certaines distributions et utilisez QEMU avec le support d'installation pour préparer l'image (cette page explique le processus pour Debian GNU/Linux) ou utiliser une image préparée par quelqu'un d'autre.
Cette section du Wikibook QEMU contient toutes les informations dont vous avez besoin.
Modifier : Comme le suggère la réponse de Gilles à la question liée, vous n'avez pas besoin d'un système de fichiers racine complet pour les tests, vous pouvez simplement utiliser un initrd
image (par exemple, l'initrd d'Arch Linux comme ici)
Procédure étape par étape QEMU + GDB testée sur l'hôte Ubuntu 16.10
Pour démarrer rapidement à partir de zéro, j'ai créé un exemple minimal de QEMU + Buildroot entièrement automatisé à l'adresse :https://github.com/cirosantilli/linux-kernel-module-cheat Les principales étapes sont décrites ci-dessous.
Obtenez d'abord un système de fichiers racine rootfs.cpio.gz
. Si vous en avez besoin, pensez à :
- un minimum de
init
-seule image exécutable :distribution Linux personnalisée qui exécute un seul programme, rien d'autre | Échange de pile Unix et Linux - un système interactif Busybox :quelle est la plus petite implémentation Linux possible ? | Échange de pile Unix et Linux
Puis sur le noyau Linux :
git checkout v4.9
make mrproper
make x86_64_defconfig
cat <<EOF >.config-fragment
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_KERNEL=y
CONFIG_GDB_SCRIPTS=y
EOF
./scripts/kconfig/merge_config.sh .config .config-fragment
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage \
-initrd rootfs.cpio.gz -S -s
Sur un autre terminal, supposons que vous souhaitiez commencer le débogage à partir de start_kernel
:
gdb \
-ex "add-auto-load-safe-path $(pwd)" \
-ex "file vmlinux" \
-ex 'set arch i386:x86-64:intel' \
-ex 'target remote localhost:1234' \
-ex 'break start_kernel' \
-ex 'continue' \
-ex 'disconnect' \
-ex 'set arch i386:x86-64' \
-ex 'target remote localhost:1234'
et nous avons terminé !!
Pour les modules du noyau, voir :Comment déboguer les modules du noyau Linux avec QEMU ? | Débordement de pile
Pour Ubuntu 14.04, GDB 7.7.1, hbreak
était nécessaire, break
les points d'arrêt logiciels ont été ignorés. Ce n'est plus le cas en 16.10. Voir aussi :https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944
Le désordre disconnect
et ce qui vient après pour contourner l'erreur :
Remote 'g' packet reply is too long: 000000000000000017d11000008ef4810120008000000000fdfb8b07000000000d352828000000004040010000000000903fe081ffffffff883fe081ffffffff00000000000e0000ffffffffffe0ffffffffffff07ffffffffffffffff9fffff17d11000008ef4810000000000800000fffffffff8ffffffffff0000ffffffff2ddbf481ffffffff4600000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000
Discussions associées :
- https://sourceware.org/bugzilla/show_bug.cgi?id=13984 pourrait être un bogue GDB
- gdb - La réponse du paquet distant 'g' est trop longue | Débordement de pile
- http://wiki.osdev.org/QEMU_and_GDB_in_long_mode osdev.org est comme d'habitude une source géniale pour ces problèmes
- https://lists.nongnu.org/archive/html/qemu-discuss/2014-10/msg00069.html
Voir aussi :
- https://github.com/torvalds/linux/blob/v4.9/Documentation/dev-tools/gdb-kernel-debugging.rst "documentation" officielle du noyau Linux
- Comment déboguer le noyau Linux avec GDB et QEMU ? | Débordement de pile
Limitations connues :
- le noyau Linux ne prend pas en charge (et ne compile même pas sans correctifs) avec
-O0
:Comment désoptimiser le noyau Linux et le compiler avec -O0 ? | Débordement de pile - GDB 7.11 vous explosera la mémoire sur certains types de complétion de tabulation, même après le
max-completions
correctif :Interruption de fin de tabulation pour les fichiers binaires volumineux | Stack Overflow Probablement un cas particulier qui n'était pas couvert par ce patch. Donc unulimit -Sv 500000
est une action sage avant le débogage. A explosé spécifiquement lorsque j'ai terminé l'ongletfile<tab>
pour lefilename
argument desys_execve
comme dans :L'appel système sys_execve() dans le noyau Linux peut-il recevoir à la fois des chemins absolus ou relatifs ? | Débordement de pile