A seconda della distribuzione che desideri utilizzare, esistono vari modi per creare un'immagine del file system, ad es. questo articolo ti guida attraverso il laborioso percorso verso un "Linux from Scratch" sistema.
In generale , lo faresti o crea un'immagine QEMU usando qemu-img
, recupera i supporti di installazione di alcune distribuzioni e usa QEMU con il supporto di installazione per preparare l'immagine (questa pagina spiega il processo per Debian GNU/Linux) oppure usa un'immagine preparata da qualcun altro.
Questa sezione del QEMU Wikibook contiene tutte le informazioni di cui hai bisogno.
Modifica: Come suggerisce la risposta di Gilles alla domanda collegata, non hai bisogno di un file system root completo per il test, potresti semplicemente usare un initrd
image (diciamo, initrd di Arch Linux come qui)
Procedura dettagliata QEMU + GDB testata su host Ubuntu 16.10
Per iniziare rapidamente da zero, ho creato un esempio minimo di QEMU + Buildroot completamente automatizzato su:https://github.com/cirosantilli/linux-kernel-module-cheat I passaggi principali sono descritti di seguito.
Per prima cosa prendi un filesystem root rootfs.cpio.gz
. Se ne hai bisogno, considera:
- un
init
minimo -sola immagine eseguibile:Distro Linux personalizzata che esegue un solo programma, nient'altro | Scambio stack Unix e Linux - un sistema interattivo Busybox:qual è l'implementazione Linux più piccola possibile? | Scambio stack Unix e Linux
Quindi sul kernel 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
Su un altro terminale, supponendo di voler avviare il debug da 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'
e abbiamo finito!!
Per i moduli del kernel vedere:Come eseguire il debug dei moduli del kernel Linux con QEMU? | Overflow dello stack
Per Ubuntu 14.04, GDB 7.7.1, hbreak
era necessario, break
i punti di interruzione del software sono stati ignorati. Non è più il caso in 16.10. Vedi anche:https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944
Il disordinato disconnect
e ciò che viene dopo è per aggirare l'errore:
Remote 'g' packet reply is too long: 000000000000000017d11000008ef4810120008000000000fdfb8b07000000000d352828000000004040010000000000903fe081ffffffff883fe081ffffffff00000000000e0000ffffffffffe0ffffffffffff07ffffffffffffffff9fffff17d11000008ef4810000000000800000fffffffff8ffffffffff0000ffffffff2ddbf481ffffffff4600000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000
Discussioni correlate:
- https://sourceware.org/bugzilla/show_bug.cgi?id=13984 potrebbe essere un bug di GDB
- gdb - La risposta del pacchetto 'g' remoto è troppo lunga | Overflow dello stack
- http://wiki.osdev.org/QEMU_and_GDB_in_long_mode osdev.org è come al solito una fantastica fonte per questi problemi
- https://lists.nongnu.org/archive/html/qemu-discuss/2014-10/msg00069.html
Vedi anche:
- https://github.com/torvalds/linux/blob/v4.9/Documentation/dev-tools/gdb-kernel-debugging.rst "documentazione" ufficiale del kernel Linux
- Come eseguire il debug del kernel Linux con GDB e QEMU? | Overflow dello stack
Limitazioni note:
- il kernel Linux non supporta (e non compila nemmeno senza patch) con
-O0
:Come de-ottimizzare il kernel Linux e compilarlo con -O0? | Overflow dello stack - GDB 7.11 ti lascerà a bocca aperta su alcuni tipi di completamento delle schede, anche dopo il
max-completions
correzione:interruzione del completamento della scheda per file binari di grandi dimensioni | Stack Overflow Probabilmente un caso d'angolo che non è stato trattato in quella patch. Quindi unulimit -Sv 500000
è un'azione saggia prima del debug. È esploso in particolare quando ho completato la schedafile<tab>
per ilfilename
argomento disys_execve
come in:la chiamata di sistema sys_execve() nel kernel Linux può ricevere percorsi sia assoluti che relativi? | Overflow dello stack