首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在没有用户干预的情况下执行裸金属程序后干净地退出QEMU?

如何在没有用户干预的情况下执行裸金属程序后干净地退出QEMU?
EN

Stack Overflow用户
提问于 2015-08-13 14:04:50
回答 6查看 6.4K关注 0票数 14

我正在为ARM系统装配一个交叉编译单元测试平台,并使用qemu-system-arm在主机上运行测试。具体来说,我使用qemu来模拟Stellaris LM3S6965 Stellaris,因为它包含一个M3处理器,就像我的目标环境一样。qemu中的二进制运行是用用于ARM的GNU工具构建的。

不涉及操作系统。测试套件作为一个裸金属应用程序在-nographic模式下运行。工具链和试验台本身运行良好。并且测试成功地运行到完成,并在qemu内产生测试结果。

问题是在自动构建工具中封装qemu (本例中是Rake)。除了键盘命令之外,我还没有找到一种很好的方法来使qemu在测试套件运行并输出其结果之后退出。这会导致构建环境挂起/依赖用户干预。

我已经看得很高和低,没有找到好的来源如何完成一个简单的退出后,程序终止。我确实找到了一些建议:使用-no-reboot选项运行qemu,然后从模拟器中运行的程序触发系统重置。我试过这个。它可以工作…有点像。在main()执行后,我将适当的值写入模拟处理器的重置向量,这确实触发了重置。在运行测试套件之后,qemu报告捕获了系统重置。但是,它将此报告为硬件错误,转储寄存器内容,然后退出愤怒(下面的错误消息)。虽然这确实是在测试套件运行后完成退出,但由于qemu在错误条件下退出,它会破坏自动构建脚本。

代码语言:javascript
运行
复制
qemu: hardware error: System reset

为了模拟用户的干预,我想避免将键盘命令插入到构建中。我还想避免依赖qemu在错误状态下退出。

看来我离一个干净的出口很近,但不完全是在那里。搜索qemu错误消息(上面)除了与切线相关的错误报告之外,没有生成其他相关文档。

是否有一种机制可以使qemu在main()返回我所缺少的裸金属程序后退出?这个-no-reboot +系统重置策略会起作用吗?如果是这样的话,还需要什么才能让qemu干净地退出?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-08-18 03:56:17

对于我来说,最干净的选择是获取一个稳定版本的Qemu的源代码,接近我们已经使用的版本。下面是Qemu源代码的1.1.2版本。

我修改了M3中的Cortex LM3S6965 + Stellaris LM3S6965 vector的复位向量处理的仿真。我将hw_error()调用替换为对qemu_system_reset_request()的调用。这个内部系统调用将重置一个虚拟机,但也会响应-no-reboot命令行选项,以进行干净的关闭,正如我在最初的问题中所讨论的那样。

这些生成指令在抓住Qemu 1.1.2的快照之后为我工作。我遇到了几个构建错误,但网络搜索很快解决了每个问题。

票数 1
EN

Stack Overflow用户

发布于 2016-12-04 11:05:22

我建议在ARM过程中使用天使接口。这对调试很有帮助。你可以在ARM信息中心上读到一些关于它的东西。特别是查看angel_SWIreason_ReportException (0x18)操作和参数ADP_Stopped_ApplicationExit,QEMU将了解应用程序已经结束。

不要忘记使用-semihosting参数运行QEMU,如下所示:

代码语言:javascript
运行
复制
qemu-system-arm -nographic -semihosting -kernel your_binary

下面是告诉QEMU停止的代码(您必须使用一些汇编程序):

代码语言:javascript
运行
复制
register int reg0 asm("r0");
register int reg1 asm("r1");

reg0 = 0x18;    // angel_SWIreason_ReportException
reg1 = 0x20026; // ADP_Stopped_ApplicationExit

asm("svc 0x00123456");  // make semihosting call

您还可以查看我在github使用它的项目。

票数 7
EN

Stack Overflow用户

发布于 2018-04-19 21:15:43

aarch64半宿主退出

https://stackoverflow.com/a/40957928/895245给了A32,这是A64:

代码语言:javascript
运行
复制
.global main
main:
    /* 0x20026 == ADP_Stopped_ApplicationExit */
    mov x1, #0x26
    movk x1, #2, lsl #16
    str x1, [sp,#0]

    /* Exit status code. Host QEMU process exits with that status. */
    mov x0, #0
    str x0, [sp,#8]

    /* x1 contains the address of parameter block.
     * Any memory address could be used. */
    mov x1, sp

    /* SYS_EXIT */
    mov w0, #0x18

    /* Do the semihosting call on A64. */
    hlt 0xf000

下面是GitHub上的一个示例:

文档已移到:https://developer.arm.com/docs/100863/latest

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31990487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档