GNU/Linux >> Tutoriales Linux >  >> Linux

Depuración del kernel de Linux con QEMU

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 un ulimit -Sv 500000 es una sabia acción antes de la depuración. Explotó específicamente cuando tabulé completando file<tab> para el filename argumento de sys_execve como en:¿Puede la llamada al sistema sys_execve() en el kernel de Linux recibir rutas absolutas o relativas? | Desbordamiento de pila

Linux
  1. Seguimiento del kernel con trace-cmd

  2. Analizar el kernel de Linux con ftrace

  3. Compilando GNU/Linux con optimización -O3

  4. ¿Puedo hacer que Qemu salga con falla en kernel panic?

  5. Linux Centos con marca de tiempo dmesg

Comando Sysctl en Linux

15 comandos ps de Linux con ejemplos

¿Linux es un sistema operativo o un kernel?

Núcleo de Linux vs. Núcleo de Mac

Administre y monitoree los módulos del kernel de Linux con Kmon

¡Parche el kernel Linux de Raspberry Pi con KernelCare GRATIS!