首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从QEMU设备直接执行代码的规范方法是什么?

从QEMU设备直接执行代码的规范方法是什么?
EN

Stack Overflow用户
提问于 2019-07-24 13:18:10
回答 1查看 196关注 0票数 2

我正在建模一个特定的评估板,它有一个leon3处理器和几个映射到特定地址的内存库。我的目标是使用我的引导加载器ELF启动,然后跳转到MRAM银行的基址,开始在其中执行裸金属程序。为此,我成功地运行了引导加载程序并跳转到第一条指令,但是QEMU立即停止并退出,而没有报告任何错误/陷阱。我还可以以ELF格式将它们作为内核传递给,从而隔离地运行这些裸金属程序。

短版本:是否有一种规范的方法来设置一个设备,以便可以直接从它执行代码?在编译代码以使代码能够正确执行时,需要采取哪些步骤?

我将MRAM建模为一个带有MemoryRegion的设备,以及适当的读和写操作,以便在我的程序中公开堆分配的数组。在我的板代码(修改后的qemu/hw/sparc/leon3.c)中,写入MRAM地址被映射到设备的MemoryRegion。使用printfs,我以未实现的设备(qemu/hw/misc/unimp.c)的方式报告读写,并且我已经验证了我正在正确地读写设备。

不幸的是,这并不适用于在设备上运行代码。在引导加载程序跳转到我的设备的基址后,我可以立即看到读取,但是read指令实际上没有做任何事情。引导加载程序使用一个空函数指针,该指针绑定到MRAM设备的地址,以诱导跳转。

我尝试过的另一种方法是从地址0开始为我的设备创建别名;我可能认为我的二进制文件的所有地址都是相对于零设置的,因此通过将从地址[0,MRAM_SIZE)中的写入作为别名映射到我的设备基地址,代码最终将读取设备MemoryRegion中的相应指令。

这种方法在内存中失败了断言:

代码语言:javascript
复制
static void memory_region_add_subregion_common(MemoryRegion *mr,
                                               hwaddr offsset,
                                               MemoryRegion *subregion)
{
    assert(!subregion->container);
    subregion->container = mr;
    subregion->addr = offset;
    memory_region_update_container_subregions(subregion);
}

我需要做什么来强迫QEMU在我的MRAM设备中执行代码?是否需要生成具有绝对地址的二进制文件?

EN

回答 1

Stack Overflow用户

发布于 2019-07-25 12:11:12

较早版本的QEMU根本无法从RAM或ROM以外的任何地方处理执行,并且尝试这样做会产生一个"qemu:致命:尝试在RAM或ROM之外执行代码“错误。QEMU3.1及更高版本解决了这个限制,现在可以在任何地方执行代码--尽管从设备执行要比从RAM执行要慢得多。

您提到您“将MRAM建模为带有MemoryRegion的设备,以及用于公开堆分配数组的适当的读和写操作”。这听起来可能是错误的方法--它会起作用,但速度会很慢。如果客户认为MRAM与RAM类似,则将其建模为RAM (即使用RAM MemoryRegion)。如果它就像读写内存,但需要做的不仅仅是写到内存(或者有时需要这样做),那么就用一个"romd“区域来建模,就像现有的pflash设备一样。尽管如此,将其建模为具有纯读和写功能的设备应该可以工作,它的速度会非常慢。

你遇到的断言是“你不能同时将一个内存区域放入两件事”--你传入的‘子区域’已经在其他地方被使用了,但是你试着把它放到第二个容器中。如果您需要在物理内存映射中的两个位置显示一个MemoryRegion,那么您需要:创建MemoryRegion;创建别名MemoryRegion,将真实的MemoryRegion化名;将实际的MemoryRegion映射到一个位置;将别名映射到另一个位置。在QEMU现有的董事会模型中有很多这样的例子。

更一般地,您需要弄清楚评估板硬件实际上是什么,然后对其进行建模。如果标准板在多个物理地址上都可以看到MRAM,那么是的,如果没有使用别名MR.,那么问题就在其他地方,您需要弄清楚实际发生了什么,而不是试图用不存在于实际硬件上的别名来绕过它。QEMU的调试日志记录(各种-d子选项,再加上登录到一个文件的-D文件)对于检查模拟CPU在这个早期启动阶段真正做了什么很有用--但是要注意日志可能相当大,而且它们有时很难解释,除非您了解一些QEMU内部程序。

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

https://stackoverflow.com/questions/57183915

复制
相关文章

相似问题

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