如何从使用Qemu运行的裸机程序中获取UART输出?
这是我一直在使用的命令行调用:
qemu-system-arm -M xilinx-zynq-a9 -cpu cortex-a9 -nographic -kernel $BUILD_DIR/mm.elf -m 512M -s -S
xilinx-zynq-a9
cortex-a9
-m 512M
表示平台具有512 MiB RAM-s
是-gdb tcp::1234
的快捷方式-S
表示启动时冻结CPU我正在使用的ELF文件(mm.elf
)执行一个简单的矩阵乘法运算,然后打印它是成功还是失败以及运行了多长时间。 ELF是使用Xilinx ARM工具链编译的。我正在将此用于软件fault injection。目前,我使用GDB询问应该打印的变量的值。但是,由于在故障注入的情况下打印时可能会出错,因此很高兴看到通过UART实际发送的内容。
redirect QEMU window output to terminal running qemu
这是我尝试过的一些建议,但是不适用,因为问题是关于在主机终端窗口中获取Linux启动消息。
How to run a program without an operating system?
这不是很相关,因为它仍然假设用户具有某种引导程序。从技术上讲,必须完全有引导加载程序才能运行该应用程序,但Xilinx在boot.S之类的文件中提供此系统代码,然后将其作为main
之前的代码编译到ELF文件中。
我尝试将所有这些添加到当前Qemu命令的末尾。结果遵循尝试的参数。
-serial mon:stdio
-serial null -serial mon:stdio
(因为Cortex-A9有两个UART)-semihosting
-serial stdio
-console=/dev/tty
-curses
我查看了ELF文件的反汇编,并验证了将UART消息写入的地址与Qemu设置所期望的地址相同(info mtree
)。基址是0xe0000000
,两个地方都相同。
我希望能够捕获发送到UART的消息的输出。如果通过重定向到stdout完成此操作,那很好。如果它通过TCP套接字,也可以。故障注入设置使用Python,并且Qemu作为子进程运行,因此可以很容易地从任何一个来源获取输出。
注意:在故障注入设置中运行时,Qemu调用为
qemu-system-arm -M xilinx-zynq-a9 -cpu cortex-a9 -nographic -kernel $BUILD_DIR/mm.elf -m 512M -gdb tcp::3345 -S -monitor telnet::3347,server,nowait
主要区别在于1)GDB端口号不同(因此可以同时运行多个实例),以及2)Qemu将通过套接字上的telnet连接进行控制,因此可以通过Python脚本进行控制。
问题:如何从使用Qemu运行的裸机程序中获取UART输出?背景信息这是我一直在使用的命令行调用:qemu-system-arm -M xilinx-zynq-a9 -cpu cortex-a9 -...
您需要在初始化UART之前尝试输出任何字符。例如,通过使用UART0
的稍微修改的版本,this program仿真可以正常工作: