使用 QEMU 在 LEON3 处理器上运行 .elf 文件

Posted

技术标签:

【中文标题】使用 QEMU 在 LEON3 处理器上运行 .elf 文件【英文标题】:Running .elf file on LEON3 processor using QEMU 【发布时间】:2021-10-13 02:07:19 【问题描述】:

最近我一直在尝试使用 qemu 在 Leon3 处理器上执行代码。我的代码如下所示:

#include <stdio.h>
#include <stdint.h>


int main(void) 
    
    
    int a,b,c,d,e;  
    printf("hello world!");
   
    
    
    if(a)
        a++;
    ;
    
    if(b)
        b++;
    ;
    
    if(c)
        c++;
    ;
    
    if(d)
        d++;
    ;
    
    
    if(e)
        e++;
    ;
    
    
    while(1)
    
    
    
    
    
   
    return 0;


所以这是一个非常简单的程序。 我使用以下命令启动 Qemu:qemu-system-sparc.exe -nographic -M leon3_generic -m 64M -kernel testapp.elf

但我没有得到任何输出。 Qemu 似乎启动并立即退出,甚至没有挂在无限循环上。 尝试调试会导致崩溃(?),代码如下:qemu-system-sparc.exe: QEMU: Terminated via GDBstub

我想也许我不了解 qemu,但我找不到任何有关运行 .elf 文件的帮助。

也许有人做过这件事并可以帮助我?

【问题讨论】:

stdio.h?打印? -kernel?? C 代码看起来像使用标准库的用户空间二进制文件。如果您尝试将其作为操作系统内核启动,它不会做任何有用的事情。如果你想制作自己的内核,你还没有这样做。如果你想按原样运行程序,你需要先安装一个操作系统来运行它。 感谢您的回复!那么用-kernel加载和.elf文件不是执行代码的正确方法吗?我试图实现的基本上是将这个程序闪存到内存中并像在微控制器中一样运行它。 qemu 甚至可以吗? 使用 qemu 是的,使用那个程序,不是。或者你有一个独立的 printf 等可以这样使用的实现吗?印刷品去哪儿了?如果你这样做了,你可能想详细说明你是如何编译的。 qemu 的 -kernel 选项需要一个 Linux 内核或多重引导格式的文件。即使使用正确的可执行代码,您仍可能需要执行一些额外的步骤才能正确打包。 好的,所以没有使用 qemu 的“简单”(简单的意思是加载和运行)方法。即使我只想运行裸 C 应用程序,我也需要系统映像? 【参考方案1】:

好的,所以我找到了一种方法。

正如 Peter 在 cmets 中提到的:Qemu 需要的不仅仅是裸机 .elf 文件。

我发现 Cobham-Gaisler 提供了一个工具 MKPROM2,它接受一个 .elf 文件并创建一个 ROM 映像,以后可以使用 -kernel 选项将其加载到 Qemu。

ROM 映像与裸机 .elf 的不同之处在于 ROM 映像包含一些初始化代码,允许运行我们最初想要执行的程序。

所以最后要做的就是运行: mkprom2 -freq 20 -romres testapp.elf

这会输出prom.out 可以加载到qemu 的文件。

【讨论】:

以上是关于使用 QEMU 在 LEON3 处理器上运行 .elf 文件的主要内容,如果未能解决你的问题,请参考以下文章

KVM、QEMU和KQemu有啥区别

qemu 怎么运行 android

QEMU简单知识 以及磁盘格式转换的简单命令

如何在QEMU上运行裸机ELF文件?

构建一个嵌入 Qt 的最小系统并在 Qemu for x86 上运行

在linux下编译并以qemu user模式运行mips架构的文件