Trabajo Practico destinado para la materia de Arquitectura de Computadoras.
GDB DEBUGGER
-S no inicia CPU -s gdb.tcp:1234 (gdbserver en 1234) -monitor dev abre una terminal para interactuar con qemu -d int logging interrupciones
-Le vamos a decir a qemu que arranque sin iniciar CPU, para poder abrir el debugger. Nos vamos a conectar a qemu desde gdb para poder controlar desde ahi la ejecucion de la maquina qemu.
sudo ./docker.sh jtallar gdb
-Para obtener la ip ifconfig | grep "status: active" -B4 | grep "inet " | xargs | cut -d " " -f2 | pbcopy
Si eso no funciona, hacer hostname --ip-address Buscar la IP que no sea 192.168.0.XX y que arranque con 192.168, copiar y pegar esa direccion en la primera linea del .gdbinit, donde dice target remote 192.168.122.1:1234 (dejar el :1234 como esta)
-Inicio gdb con: gdb target remote ... (direccion ip)
- Como el archivo de salida (en los .ld) es binary, se tira toda la info de debuggeo (aunque compile con GCC con -G). En gdb le podemos decir que los simbolos estan en kernel.lf y 0000-sampleCodeModule.elf.
add-symbol-file kernel.elf 0x100000 add-symbol-file 0000-sampleCodeModule.elf 0x400000
- b get_char agrega breakpoint en la direccion de inicio de la funcion get_char
- c continuar hasta llegar a un breakpoin
- n avanzar de a una linea
- si avanza de a una linea por assembler
- ENTER ejecuta el ultimo comando
-Si corremos gdb con un .gdbinit, se pone lindo. (en el .gdbinit, habra que cambiar la direccion ip)
Correr gdb -iex 'add-auto-load-safe-path .' para que busque el .gdbinit
-En la CheatSheet, están los comandos más importantes
-En el manual de qemu, en la sección de gdb, hay un par de comandos para habilitar las interrupciones nuevamente (por defecto, me las deshabilita)
-Si agregamos -d int en el run.sh, imprime por salida estandar las llamadas a interrupciones, registros, segmentos, etc.
-
Para mostrar solo las lineas en las que se ejecutaron interrupciones (se podria elegir un solo tipo en el "") ./run.sh 2>&1 | grep "v=[0-9]+"
Sirve por ejemplo para ver que llamadas como get_char bloqueen, no llamen constantemente (busy waiting)
MEMORY MANAGER
Para ver las distintas secciones de memoria readelf --sections /bin/ls
KERNEL.LD
Veo desde donde arranca cada seccion de memoria ".text", las demas secciones estaran pegadas.
Variables interesantes --> .text arranca en 0x100000
endOfKernelBinary
endOfKernel
sampleCodeModule.ld Variable interesante --> endOfBinary
qemu <...> -monitor stdio --> Para abrir una terminal para interactuar con qemu
Analizar tamaño de SampleCodeModule, ver que no se solape con SampleDataModule Verlo con endOfUserBinary
Analizar tamaño de SampleDataModule --> Haciendo un size de SampleDataModule Asegurarnos que esa direccion no sobrepase la direccion inicial de memoria a administrar Podemos tomar directamente a partir de una direccion como 0x600000
freeRTOS/Source/portable/MemMgr