2012-03-05 20 views
5

Estoy intentando usar GDB para depurar un kernel de Linux zImage antes de que se descomprima. El núcleo se está ejecutando en un destino ARM y tengo un depurador JTAG conectado a él con un código auxiliar del servidor GDB. El objetivo debe cargar un gestor de arranque. El gestor de arranque lee la imagen del núcleo desde el flash y la coloca en la RAM al 0x20008000, luego se bifurca a esa ubicación.Depurar etapa previa a la descompresión del kernel de Linux

he empezado BGF y conectado con el destino remoto, entonces yo uso de comandos de GDB add-symbol-file así:

add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow 

Cuando me puse un punto de interrupción para esa dirección, lo hace trampa en el lugar correcto - justo cuando se ramifica al kernel. Sin embargo, GDB muestra la línea incorrecta de la fuente de arch/arm/boot/compressed/head.S. Son 4 líneas detrás. ¿Cómo puedo arreglar esto?

También he intentado añadir la opción -s section addr-add-symbol-file con -s .start 0x20008000; esto da como resultado exactamente el mismo problema.

+0

Primero asegúrese de tener un gcc y gdb que sean compatibles, preferiblemente de la misma versión de la cadena de herramientas. Además, sepa que el kernel de Linux está compilado con -O2, por lo que algunas líneas se optimizan. ¿Estás seguro de que no hay palabras clave .align en algún lugar? –

+0

El código descompresor es todo relativo para PC. Incluso puede copiarse de una región a otra. El gestor de arranque puede colocarlo donde está el objetivo descomprimido; entonces tiene que moverse solo. Dudo que vayas a tener buenos momentos usando JTAG con símbolos fijos. No sé si puedes * reubicarte * con GDB de alguna manera. –

Respuesta

2

Hay macros de ensamblador que imprimen cosas al compilar con de nivel bajo depurar. Debe asegurarse de que las macros sean apropiadas para su placa.

linux-latest/arch/arm$ find . -name debug-macro.S | wc 
56  56 2306 

Encuentre el archivo para su tablero y garantizar los registros correctos del puerto serie son golpeados. Puede instrumentar el código sin usar JTAG. Estas macros se usan en el código de descompresión. Por supuesto, configure con * CONFIG_DEBUG_LL *.

Lo más probable es que los ATAG no sean correctos o cumplan uno de los otros requisitos. Consulte Documentation/arm/Booting para asegurarse de tener los registros configurados correctamente. Tenga en cuenta que hay un nuevo requisito con kernels recientes para enviar una lista dt.

+0

Las macros actuales están en [armar incluyen depurar] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/include/debug) (a partir de enero de2015 v3 .19). Ver también: [depuración comprimida] S (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/compressed/debug.S) –

Cuestiones relacionadas