我必须在 ARM 架构上测试一些低级代码。通常在实际电路板上进行实验非常复杂,所以我在考虑 QEMU。
我想得到的是某种调试信息,如 printfs 或 gdb。我知道这对 linux 很简单,因为它实现了 QEMU Integrator 的设备驱动程序和 gdb 功能,但我没有使用 Linux。我还怀疑从 Linux 内核源代码中提取这种功能会很复杂。
我正在从一些已经实现这些功能之一的简单操作系统中进行搜索。你有什么建议吗?
您不需要目标操作系统来调试在 QEMU 中运行的代码——QEMU 已经为您做到了。
具体来说,QEMU 支持从 GDB 进行远程调试——您可以使用适当的命令行选项运行 QEMU,它将导出一个 GDB 副本(在主机上运行)可以连接到的接口。此时,您可以在 GDB 中调试程序,就像在主机上运行它一样。
http://wiki.osdev.org/GDB似乎有更多的基本信息;可能不足以让你完全入门,但至少给你基本的想法和一些在 QEMU 和 GDB 文档中寻找的术语。跳过关于“实现 GDB 存根”的部分,这里不适用,因为 QEMU 已经有了,从“使用仿真器存根”部分开始。简而言之,您使用-s
选项(在 localhost:1234 上导出 GDB 连接)和-S
选项(在开始执行之前等待 GDB“继续”命令)启动 QEMU,然后在主机上的 GDB 中说target remote :1234
,而不是run
. 此外,当然,您需要使用 GDB 的 ARM 版本,而不是原生 x86 版本。
(此外,如果您愿意为商业解决方案付费,CodeSourcery 的 ARM 工具链具有 IDE 集成,可以自动设置所有这些,包括支持“printf”打印到调试器控制台。这适用于物理板上, 同样, 如果你有一个硬件调试器。通常关于我是 CodeSourcery 员工的免责声明适用——但我确实觉得它很容易使用。)
2012 年更新: CodeSourcery 的工具链现在称为 Mentor Graphics Sourcery CodeBench,但以上所有内容仍然适用。
I realise that I am addressing your original problem here rather than your proposed solution (perhaps that's better?), but to use GDB (or Insight/GDB) directly on the target, use a low-cost JTAG tool and OpenOCD. An example of such a set-up and how to implement it can be found here.
If you have a larger budget, a more fully featured JTAG debugger may be useful, such as the Abatron BDI3000 with bdiGDB firmware which allows remote debugging and device programming over Ethernet with GDB and no special drivers or target debug agent.
也许像OKL4这样的微内核可以满足您的需求?