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
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 comandoscript
.Un ejemplo de un script envolvente podría ser:
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 llamadooutput.txt
utilizando el comandotee
.Para capturar toda la sesión del terminal, el script se puede ejecutar con el comando
script
: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 llamadocapture.txt
. La opción--append
le indica ascript
que agregue su salida al archivo existente en lugar de sobrescribirlo, y la opción--quiet
suprime el mensaje inicial descript
.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 aoutput.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 archivocapture.txt
.