Qemu裸机仿真-如何查看UART输出?

问题描述 投票:0回答:1

问题:

如何从使用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
  • 因为这是裸机,所以可执行文件是一个自包含的ELF文件
  • [-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
    • 不能通过多个字符设备使用stdio
    • 无法将串行设备连接到字符后端'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 -...

    arm qemu uart bare-metal reliability
    1个回答
    0
    投票

    您需要在初始化UART之前尝试输出任何字符。例如,通过使用UART0的稍微修改的版本,this program仿真可以正常工作:

    © www.soinside.com 2019 - 2024. All rights reserved.