Dependiendo de la distribución que le gustaría usar, hay varias formas de crear una imagen del sistema de archivos, p. este artículo lo guía a través del laborioso camino hacia un "Linux from Scratch" sistema.
En general , tú cualquiera de crear una imagen QEMU usando qemu-img
, busca los medios de instalación de alguna distribución y usa QEMU con el medio de instalación para preparar la imagen (esta página explica el proceso para Debian GNU/Linux) o usar una imagen preparada por otra persona.
Esta sección del Wikibook QEMU contiene toda la información que necesita.
Editar: Como sugiere la respuesta de Gilles a la pregunta vinculada, no necesita un sistema de archivos raíz completo para realizar pruebas, solo puede usar un initrd
imagen (por ejemplo, el initrd de Arch Linux como aquí)
Procedimiento paso a paso de QEMU + GDB probado en host Ubuntu 16.10
Para comenzar desde cero rápidamente, hice un ejemplo mínimo de QEMU + Buildroot completamente automatizado en:https://github.com/cirosantilli/linux-kernel-module-cheat Los pasos principales se describen a continuación.
Primero obtenga un sistema de archivos raíz rootfs.cpio.gz
. Si necesita uno, considere:
- un
init
mínimo -solo imagen ejecutable:distribución personalizada de Linux que ejecuta solo un programa, nada más | Intercambio de pilas de Unix y Linux - un sistema interactivo Busybox:¿Cuál es la implementación de Linux más pequeña posible? | Intercambio de pilas de Unix y Linux
Luego en el kernel de 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
En otra terminal, supongamos que desea iniciar la depuración desde 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'
¡¡y hemos terminado!!
Para los módulos del kernel, consulte:¿Cómo depurar los módulos del kernel de Linux con QEMU? | Desbordamiento de pila
Para Ubuntu 14.04, GDB 7.7.1, hbreak
se necesitaba, break
Se ignoraron los puntos de interrupción del software. Ya no es el caso en 16.10. Consulte también:https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944
El desordenado disconnect
y lo que viene después es solucionar el error:
Remote 'g' packet reply is too long: 000000000000000017d11000008ef4810120008000000000fdfb8b07000000000d352828000000004040010000000000903fe081ffffffff883fe081ffffffff00000000000e0000ffffffffffe0ffffffffffff07ffffffffffffffff9fffff17d11000008ef4810000000000800000fffffffff8ffffffffff0000ffffffff2ddbf481ffffffff4600000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000
Temas relacionados:
- https://sourceware.org/bugzilla/show_bug.cgi?id=13984 podría ser un error de GDB
- gdb:la respuesta del paquete 'g' remoto es demasiado larga | Desbordamiento de pila
- http://wiki.osdev.org/QEMU_and_GDB_in_long_mode osdev.org es, como de costumbre, una excelente fuente para estos problemas
- https://lists.nongnu.org/archive/html/qemu-discuss/2014-10/msg00069.html
Véase también:
- https://github.com/torvalds/linux/blob/v4.9/Documentation/dev-tools/gdb-kernel-debugging.rst "documentación" oficial del kernel de Linux
- ¿Cómo depurar el kernel de Linux con GDB y QEMU? | Desbordamiento de pila
Limitaciones conocidas:
- el kernel de Linux no es compatible (y ni siquiera compila sin parches) con
-O0
:¿Cómo desoptimizar el kernel de Linux y compilarlo con -O0? | Desbordamiento de pila - GDB 7.11 te hará perder la memoria en algunos tipos de finalización de pestañas, incluso después del
max-completions
corrección:interrupción de finalización de tabulación para binarios grandes | Desbordamiento de pila Probablemente algún caso de esquina que no se cubrió en ese parche. Entonces unulimit -Sv 500000
es una sabia acción antes de la depuración. Explotó específicamente cuando tabulé completandofile<tab>
para elfilename
argumento desys_execve
como en:¿Puede la llamada al sistema sys_execve() en el kernel de Linux recibir rutas absolutas o relativas? | Desbordamiento de pila