首页 > 解决方案 > 当 aarch64 汇编内核代码终止时会发生什么?

问题描述

我正在为 raspi3 编写内核并用 QEMU4.0.0 模拟它

我知道在编写内核时,您通常会有永远循环的代码。在我的情况下,我将 4 个模拟 raspi3 内核中的 3 个旋转锁定为:

1:   wfe
     b    1b

在主 C 程序中,我的最后一个核心运行一个while(1)循环,它只是回显标准输入键击

然而,在我看来,自旋锁内核的原因是它们不执行不应该执行的代码,即在 Aarch64 汇编内核文件中进一步执行代码。我不能将核心发送到文件末尾,那里没有更多的指令可以运行吗?

1:
//EOF

我试过这个,它编译并运行(至少在 QEMU4.0.0 中),但现在我很好奇当指令指针找不到更多可做的事情时究竟会发生什么。

当核心到达程序集文件的末尾时会发生什么?它会停止吗?它是否开始读取内存中的下一个内容?模拟器是否比我更聪明,并以真实硬件不会的方式为我处理它?

标签: qemuarm64

解决方案


CPU 从内存而不是文件中运行代码。如果 CPU 在加载到内存中的程序结束时“掉线”,它将开始尝试执行程序后面的内存中的代码。由于此内存可能不包含有效代码,因此处理器可能会抛出无效指令异常。但是,您的程序后面的数据也有可能恰好是有效代码,并且该代码可能会导致系统的行为不可预测——因此在程序末尾添加一个自旋循环是个好主意。


推荐阅读