检测是否在QEMU内部运行

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

我正在编写一些裸机 Cortex-M4 代码。它通常在开发板上运行,但为了运行单元测试,我在 QEMU 下模拟它。然而,一些硬件配置的完成方式有所不同,具体取决于它是在主板上运行还是在 QEMU 上运行 - 例如,如果在主板上运行,

stdout
会重定向到 SWO,如果在 QEMU 下运行,则重定向到 USART。

目前我有一个构建时标志来确定是否在 QEMU 下运行它。然而,为了让用户体验更好一点,我想避免这种情况。因此,我想知道是否有一种方法可以在运行时检查代码是否在板上或 QEMU 下运行。比如说,读取一个内存地址,这将为 QEMU 和开发板提供不同的输出。我知道如果仿真没有错误,它的行为应该与主板完全相同,但也许 QEMU 开发人员在我可以检查的地方隐藏了一些东西。

qemu cortex-m
1个回答
0
投票

我找到了一个可能的解决方案。我的问题中缺少的一个信息是,我在带有 STM32F407VG MCU 的 STM32F4DISCOVERY 板上运行,而在 QEMU 中,我使用

olimex-stm32-h405
目标来模拟它(这对于我的目的来说足够相似)。

根据 STM32F405/F407(和其他型号)的参考手册,第 38.6.1 节中,地址

DBGMCU_IDCODE
处的 MCU ID 代码 (
0xE0042000
) 应在最后 12 位返回
0x413
,如果在 405 或 407 MCU 上运行。在真实的板上运行,这确实是从该地址读取的内容。然而,显然这不是由 QEMU 实现的,因此从该地址读取将返回 0。

我知道这依赖于 QEMU 未实现的功能,如果他们决定实现它,将来可能会中断。但缺乏更好的建议,我现在可能会选择这个,如果以后它坏了我会重新评估。

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