linux linux-kernel embedded qemu powerpc

linux - qemu download



¿Cómo depurar el kernel de Linux con QEMU y KGDB? (2)

Parece que confunde el dispositivo en serie del host / dev / ttyS0 para el invitado, y el propio gdbserver de QEMU para KGDB en el kernel invitado.

Normalmente no hay razón para que QEMU toque el puerto serie del host. En realidad, la única razón para hacerlo sería si desea tener un QEMU de host físico de la máquina, y efectivamente dar su puerto serie físico al invitado, para que luego pueda usar una máquina física diferente conectada por un cable serie real para depurar el huésped.

Cuando usa el indicador -s, le dice a QEMU que ejecute su propio servidor GDB (escuchando de forma predeterminada en el puerto TCP de hostback loopback 1234) lo que le permite entrar en cualquier programa que se ejecute en el invitado, ya sea un kernel o gestor de arranque u otra cosa . Esto no es lo mismo que tener el kernel invitado cooperando con la depuración a través de KGDB.

Si desea usar KGDB, necesitará algo así como configurar KGDB en la compilación del kernel para usar el lado del invitado de un puerto serie emulado, y luego decirle a GDB en el host que use el extremo del host de ese puerto emulado. La documentación de línea de comando QEMU cubre esto en detalle:

Opciones de depuración / experto:

''-serial dev'' Redirige el puerto serie virtual para alojar el dispositivo de desarrollo de dispositivo. El dispositivo predeterminado es vc en modo gráfico y stdio en modo no gráfico.

Esta opción se puede usar varias veces para simular hasta 4 puertos serie.

Una lista abreviada de algunas de sus opciones más interesantes:

''pty'' [solo para Linux] Pseudo TTY (se asigna automáticamente un nuevo PTY)

''/ dev / XXX'' [Sólo Linux] Use host tty, por ejemplo ''/ dev / ttyS0''. Los parámetros del puerto serie del host se establecen de acuerdo con los emulados.

Esto es lo que no desea, a menos que desee utilizar un cable serie en una máquina física diferente que ejecutará GDB.

''tcp: [host]: puerto [, servidor] [, nowait] [, nodelay]'' La Consola TCP Net tiene dos modos de operación. Puede enviar la E / S en serie a una ubicación o esperar una conexión desde una ubicación. Por defecto, la Consola TCP Net se envía al host en el puerto. Si usa la opción de servidor QEMU esperará a que una aplicación de socket cliente se conecte al puerto antes de continuar, a menos que se haya especificado la opción nowait. La opción nodelay desactiva el algoritmo de almacenamiento en búfer de Nagle. Si se omite el host, se supone 0.0.0.0. Solo se acepta una conexión TCP a la vez. Puede usar telnet para conectarse al dispositivo de caracteres correspondiente.

Ejemplo para enviar la consola tcp a 192.168.0.2 puerto 4444 -serial tcp: 192.168.0.2: 4444

Ejemplo para escuchar y esperar en el puerto 4444 para conexión -serial tcp :: 4444, servidor

Ejemplo de no esperar y escuchar en ip 192.168.0.100 puerto 4444 -serial tcp: 192.168.0.100: 4444, servidor, nowait

Esta es una buena y común elección. Puede utilizar básicamente la misma sintaxis GDB, por ejemplo, si especifica la dirección 127.0.0.1 de la interfaz de bucle invertido y el puerto 1234 puede usar exactamente el mismo comando GDB que antes.

''unix: path [, servidor] [, nowait]'' Se usa un socket de dominio unix en lugar de un socket tcp. La opción funciona igual que si usted hubiera especificado -serial tcp, excepto que la ruta del socket del dominio Unix se usa para las conexiones.

Esta es una buena opción también, suponiendo que su GDB lo admite.

Es posible que necesite configurar una de estas opciones primero, ejecute sin KGDB y obtenga un shell y descubra cómo se llama el extremo invitado del dispositivo emulado, luego reinicie con KGDB configurado para usarlo.

Pude arrancar un sistema basado en powerpc (el MPC8544DS es específico) usando la siguiente forma para invocar qemu (v1.7.0)

qemu-system-ppc -M mpc8544ds -m 512 -kernel zImage -s -nographic -initrd busyboxfs.img -append "root=/dev/ram rdinit=/bin/sh kgdboc=ttyS0,115200 kgdbwait"

donde zImage es un Kernel Linux compilado cruzado personalizado (v2.6.32) que tiene KGDB habilitado y compilado en (para la depuración del código de inicio) y busyboxfs.img es el rootfs basado en busybox.

Como estoy usando la bandera -s para Qemu, puedo ingresar al kernel usando cross gdb así:

(gdb) target remote localhost:1234 Remote debugging using localhost:1234 mem_serial_in (p=<value optimized out>, offset=5) at drivers/serial/8250.c:405 405 }

Sin embargo, si elimino el -s e intento ingresar al kernel sobre /dev/ttyS0 , me da un error de permiso denegado:

(gdb) set remotebaud 115200 (gdb) target remote /dev/ttyS0 permission denied

¿Es porque ha sido retenido por Qemu? Además, en el ejemplo de Internet, kgdboc se ha configurado en ttyAMA0 que he llegado a entender significa el bus AMBA que es específico de los sistemas basados ​​en ARM. ¿Tenemos algo similar para PowerPC? ¿Estoy haciendo algo mal aquí?


KGDB + QEMU paso a paso

En primer lugar, la opción -gdb de QEMU es estrictamente más poderosa que KGDB, por lo que es posible que desee utilizarla en su lugar: ¿Cómo depurar el kernel de Linux con GDB y QEMU? QEMU es sin embargo una manera fácil de jugar con KGDB en preparación para hardware real. He publicado algunos punteros KGDB de Raspberry Pi en: depuración en vivo del kernel de Linux, cómo se hace y qué herramientas se usan.

Si desea comenzar rápidamente desde el principio, he creado un ejemplo mínimo de Buildroot completamente automatizado en: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/d424380fe62351358d21406280bc7588d795209c#kgdb

Los pasos principales son:

  1. Compila el kernel con:

    CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_INFO=y CONFIG_CONSOLE_POLL=y CONFIG_KDB_CONTINUE_CATASTROPHIC=0 CONFIG_KDB_DEFAULT_ENABLE=0x1 CONFIG_KDB_KEYBOARD=y CONFIG_KGDB=y CONFIG_KGDB_KDB=y CONFIG_KGDB_LOW_LEVEL_TRAP=y CONFIG_KGDB_SERIAL_CONSOLE=y CONFIG_KGDB_TESTS=y CONFIG_KGDB_TESTS_ON_BOOT=n CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_SERIAL_KGDB_NMI=n

    La mayoría de ellos no son obligatorios, pero esto es lo que he probado.

  2. Agregue a su comando QEMU:

    -append ''kgdbwait kgdboc=ttyS0,115200'' / -serial tcp::1234,server,nowait

  3. Ejecute GDB desde la raíz del árbol fuente del kernel de Linux con:

    gdb -ex ''file vmlinux'' -ex ''target remote localhost:1234''

  4. En GDB:

    (gdb) c

    y el arranque debería terminar.

  5. En QEMU:

    echo g > /proc/sysrq-trigger

    Y GDB debería romperse.

  6. Ahora que hemos terminado, puedes usar GDB como de costumbre:

    b sys_write c

Probado en Ubuntu 14.04.

BRAZO

No puedo hacer que funcione Posiblemente relacionado con: ¿Cómo usar kgdb en ARM?