es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Captura de E/S semi-hospedada en QEMU

Con fines de pruebas unitarias, quiero poder ejecutar un binario de sistema operativo puro con qemu y capturar su salida.

Archivo de ejemplo:


#include <stdio.h> #include <stdint.h> static void qemu_exit() { register uint32_t r0 asm("r0"); r0 = 0x18; register uint32_t r1 asm("r1"); r1 = 0x20026; asm volatile("bkpt #0xAB"); } int main(void) { puts("This is some example text that I want to capture"); qemu_exit(); return 0; }

Ejecutando con:
qemu-system-gnuarmeclipse –nographic –no-reboot \
–board STM32F4-Discovery –mcu STM32F429ZI \
–semihosting-config enable=on,target=native \
–image

La salida en la consola es:
QEMU 2.8.0-13 monitor – type ‘help’ for more information
(qemu) This is some example text that I want to capture

Este ‘texto de ejemplo’ se genera dentro de QEMU, por lo que redirigir stdout a un archivo no lo captura (solo: QEMU 2.8.0-13 monitor – type ‘help’ for more information
(qemu)). Al analizar las opciones de registro de qemu disponibles con la opción -d help no se ofrece nada que yo pueda ver.

EDIT:

Una solución chapucera consiste en usar script para capturar la sesión de terminal:

script –quiet –command </stdint.h></stdio.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para capturar la salida de un binario bare-metal ejecutado con qemu, una solución posible es utilizar el comando script para capturar toda la sesión del terminal mientras se ejecuta el binario. Esto se puede hacer envolviendo el comando qemu con un script de shell que redirija su salida a un archivo, y luego ejecutando el script con el comando script.

    Un ejemplo de un script envolvente podría ser:

    #!/bin/sh
    
    qemu-system-gnuarmeclipse \
      --nographic \
      --no-reboot \
      --board STM32F4-Discovery \
      --mcu STM32F429ZI \
      --semihosting-config enable=on,target=native \
      --image $1 > /dev/tty | tee output.txt
    

    Este script toma el nombre del archivo binario como argumento y ejecuta el comando qemu con las opciones deseadas, redirigiendo su salida al terminal (/dev/tty) y también a un archivo llamado output.txt utilizando el comando tee.

    Para capturar toda la sesión del terminal, el script se puede ejecutar con el comando script:

    $ script --quiet --append capture.txt ./qemu-wrapper.sh my-binary.elf
    

    Esto iniciará el comando script, que creará un nuevo shell con su propio entorno y comenzará a capturar toda la entrada y salida en un archivo llamado capture.txt. La opción --append le indica a script que agregue su salida al archivo existente en lugar de sobrescribirlo, y la opción --quiet suprime el mensaje inicial de script.

    El comando ./qemu-wrapper.sh my-binary.elf ejecuta el script envolvente con el nombre del archivo binario, que a su vez ejecuta el comando qemu y redirige su salida a output.txt.

    Una vez que el binario haya terminado de ejecutarse, la sesión del terminal se puede cerrar con el comando exit, y la salida capturada se puede encontrar en el archivo capture.txt.

Comments are closed.