当前位置: 首页 > 知识库问答 >
问题:

如何在qemu上运行arm64 baremetal hello world程序?

云德辉
2023-03-14

通常一个问题会引导我进入另一个问题。< br >在尝试调试内联汇编代码时,我遇到了另一个基本问题。< br >长话短说,我想在qemu上运行arm64裸机hello world程序。

#include <stdio.h>

int main()
{
printf("Hello World!\n");
}

我是这样编译的:aarch64-无-精灵-gcc-g test. c

对于< code > _ exit < code > _ sbrk < code > _ write < code > _ close < code > _ lseek < code > _ read < code > _ fstat 和< code>_isatty,我得到未定义的引用错误。我在过去了解到,< code>-specs=rdimon.specs编译选项可以消除这种错误。所以我跑了

aarch64-none-elf-gcc -g test.c -specs=rdimon.specs

它可以编译一个. out文件。< br >现在我运行qemu裸机程序来调试代码。

QEMU-system-aarch 64-machine virt,gic-version=max,secure=true,virtual ization = true-CPU cortex-a72-kernel a . out-m 2048m-no graphic-S-S

这是gdb运行结果。

ckim@ckim-ubuntu:~/testdir/testinlinedebugprint$ aarch64-none-elf-gdb a.out
GNU gdb (GNU Toolchain for the A-profile Architecture 10.2-2020.11 (arm-10.16)) 10.1.90.20201028-git
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=aarch64-none-elf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://bugs.linaro.org/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...
(gdb) set architecture aarch64
The target architecture is set to "aarch64".
(gdb) set serial baud 115200
(gdb) target remote :1234
Remote debugging using :1234
_start ()
    at /tmp/dgboter/bbs/build02--cen7x86_64/buildbot/cen7x86_64--aarch64-none-elf/build/src/newlib-cygwin/libgloss/aarch64/crt0.S:90
90  /tmp/dgboter/bbs/build02--cen7x86_64/buildbot/cen7x86_64--aarch64-none-elf/build/src/newlib-cygwin/libgloss/aarch64/crt0.S: No such file or directory.
(gdb) b main
Breakpoint 1 at 0x4002f8: file test.c, line 26.
(gdb) 
(gdb) r
The "remote" target does not support "run".  Try "help target" or "continue".
(gdb) c
Continuing.

它不会断裂并挂起<我做错了什么?我如何解决<code>/tmp/dgboter/bbs/build02--cen7x86_64/buildbot/cen7x86_64--aarch64 none-elf/build/src/newlib-cygwin/libgloss/aarch65/crt0.S:没有这样的文件或目录 问题?任何帮助都将不胜感激。谢谢

补充:< br >我意识到我问过同样的问题(如何编译baremetal hello_world.c并在qemu-system-aarch64上运行?)之前(啊!我的记忆..)我意识到我需要像start这样的所有东西。S crt0。和链接器脚本。。。我愚蠢地认为裸机编译器会自动处理它,而实际上我不得不填充非常低级的东西。我在某些情况下做过裸机程序,但那是在别人已经设置好初始环境之后(有时我甚至多次修改它们!).在裸机时代,你必须拥有所有的东西。没有任何东西你可以想当然,因为它是“裸机”。我很晚才意识到这个基本的东西..

共有1个答案

汪翰墨
2023-03-14

当您为“裸机”构建一个程序时,这意味着您需要配置您的工具链来生成一个二进制文件,它可以在您尝试运行它的特定裸机上工作。例如,二进制文件必须:

  • 将其代码放在机器内存映射中有ROM或RAM的某处
  • 把它的数据放在有RAM的地方
  • 确保在启动时正确初始化堆栈指针以指向RAM
  • 如果要打印输出,请包含访问该机器上合适设备的例程。这可能是一个串行端口,串行端口通常是完全不同的设备,位于不同的地址,在不同的机器上

如果这些事情中的任何一个是错误的,或者与您运行的实际机器不匹配,结果通常与您看到的完全一样——程序在没有输出的情况下崩溃。

更具体地说,rdimon.specs告诉编译器在C库中构建函数,这些函数通过“半托管”调试器ABI(它支持“打印字符串”和其他一些东西)执行部分操作。您的QEMU命令行不启用半托管的实现(您可以使用-semihost选项打开它),因此根本不起作用。但您可能还遇到了其他问题。

 类似资料:
  • 使用 QEMU 运行内核 使用 OpenSBI 新版 QEMU 中内置了 OpenSBI 固件,它主要负责在操作系统运行前的硬件初始化和加载操作系统的功能。我们使用以下命令尝试运行一下: 运行输出 $ qemu-system-riscv64 \ --machine virt \ --nographic \ --bios default OpenSBI v0.6 ____

  • 问题内容: 我正在尝试从Windows中的命令行执行Java程序。这是我的代码: 我不确定如何执行程序-有帮助吗?在Windows上可以吗?为什么它不同于另一个环境(我以为JVM只写一次,可以在任何地方运行)? 问题答案: 假设你的文件位于 运行命令提示符 这使C:\ mywork成为当前目录。 这将显示目录内容。你应该在文件中看到。 这告诉系统在哪里可以找到JDK程序。 这将运行编译器。除了下一

  • 我正试图在Windows中从命令行执行一个Java程序。下面是我的代码: 我不确定如何执行程序-有什么帮助吗?这在Windows上可能吗?为什么它和另一个环境不同(我以为JVM是编写一次,运行任何地方)?

  • 问题内容: 我刚刚安装了QEMU并编译了具有ARM支持的linux内核,但是当我在以下命令下运行时 我只能看到黑屏,我也尝试了下面线程中的建议 但是仍然没有用。 以下是我运行以编译内核源代码的make命令的输出 使ARCH = arm CROSS_COMPILE = arm-none-linux-gnueabi- uImage -s 负载点和入口点可以吗? 问题答案: 没有您的负载和入口点不正确。

  • 我用JDK 13制作了一个java应用程序。我用launch4j创建了一个exe文件。但是没有人可以运行它,因为每个人都有jre 1.8版本,而且它不会启动。。。我必须在安装中包含java jdk 13,并用它设置java_home?

  • 问题内容: 我将创建一个程序(脚本),该程序在运行时会启动操作,因此我不在此程序中使用路由 我正在使用NestJS框架(要求)。 实际上,我正在尝试在文件中编写代码,并使用方法导入服务。 我的服务 我将使用服务来处理我的操作,所以我会使用DI,该DI在非类文件中不起作用。 我会知道如何以适当的方式在初始化时间内运行我的操作 问题答案: 有两种方法可以做到这一点: A)生命周期事件 使用生命周期事件