计算机基础实战课
彭东
网名 LMOS,Intel 傲腾项目关键开发者
19719 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
计算机基础实战课
15
15
1.0x
00:00/00:00
登录|注册

13|小试牛刀:跑通RISC-V平台的Hello World程序

你好,我是 LMOS。
在上一课中,我们一起约定了主环境,安装了编译工具和依赖库,构建了交叉编译 RISC-V 工具链。
今天我们继续构建 RISC-V 版的模拟器 QEMU(代码你可以从这里下载),让它成为“定制款”,更匹配我们的学习需要。为此,我们需要设置好主环境的环境变量,安装好 VSCode 及其插件,这样才能实现编辑、编译、运行、调试 RISC-V 程序的一体化、自动化。
话不多说,我们开始吧。

RISC-V 运行平台

有了上节课成功构建好的交叉编译器,有很多同学可能按捺不住,急着想写一个简单的 Hello World 程序,来测试一下刚刚构建的交叉编译器。
恕我直言,这时你写出来的 Hello World 程序,虽然会无警告、无错误的编译成功,但是只要你一运行,铁定会出错。
这是为什么呢?因为你忘记了交叉编译器,生成的是 RISC-V 平台的可执行程序,这样的程序自然无法在你的宿主机 x86 平台上运行,它只能在 RISC-V 平台上运行。
摸着自己的荷包,你可能陷入了沉思:难道我还要买一台 RISC-V 平台的计算机?这样成本可太高了,不划算。
贫穷让人学会变通,为了节约成本,我们希望能用软件模拟 RISC-V 平台。嘿!这当然可以,而且前辈们,早已给我们写好了这样的软件,它就是 QEMU。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了在RISC-V平台上运行Hello World程序的过程,并重点讲解了构建RISC-V版的模拟器QEMU的步骤。首先,文章介绍了RISC-V运行平台的问题,并详细解释了QEMU的特点和工作模式。然后,文章详细介绍了构建定制款QEMU的过程,包括下载源代码、配置功能选项、编译和安装。此外,文章还介绍了处理环境变量的方法。接着,文章介绍了如何在VSCode上安装C/C++扩展,并配置相关文件,使得在图形化环境下编写、编译、运行和调试RISC-V平台的可执行程序成为可能。最后,文章总结了本节课的要点,并提出了思考题,鼓励读者在留言区提问或分享实验记录。整体而言,本文为读者提供了在RISC-V平台上进行开发的重要指导,使他们能够快速了解相关技术并进行实际操作。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《计算机基础实战课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • 廖雪峰
    如果有不想编译的同学,可以按照以下步骤运行: 1. 安装Ubuntu 22.04 2. 安装编译环境: $ sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev 3. 直接安装riscv-gcc发行包: $ sudo apt install gcc-riscv64-linux-gnu gcc-riscv64-unknown-elf picolibc-riscv64-unknown-elf 4. 直接安装qemu发行包: $ sudo apt install qemu-user qemu-system-misc 5. 编写hello.c #include<stdio.h> int main() { printf("Hello, riscv!\n"); return 0; } 6. 编译: $ riscv64-linux-gnu-gcc hello.c -o hello 7. 运行: $ qemu-riscv64 hello qemu-riscv64: Could not open '/lib/ld-linux-riscv64-lp64d.so.1': No such file or directory 如果报错找不到/lib/ld-linux-riscv64-lp64d.so.1,是因为这个文件实际上在/usr/riscv64-linux-gnu/lib下,加个参数运行: $ qemu-riscv64 -L /usr/riscv64-linux-gnu hello Hello, riscv! 最后,riscv64-unknown-elf-gcc编译还没搞定,正在找原因

    作者回复: 可能 是 网络原因

    2022-08-24归属地:湖北
    4
    10
  • 光华路小霸王
    使用了 VS Code 的 Remote Development 远程调试,发现 F5 debug 回找不到编译器和 qemu,shell 登录可以,一通谷歌是 .bashrc 与 .bash_profile 的问题,把环境变量加到 bash_profile 就可以了,vscode 是运行在 login shell 的,加载的是 bash_profile ,不会加载 .bashrc refs: https://github.com/microsoft/vscode-remote-release/issues/854

    作者回复: 66666

    2022-09-02归属地:湖北
    1
  • Liu Zheng
    纠正一下。在环境变量设置好之前,即使在`/opt/riscv/qemu/bin`目录下,也不能直接跑` qemu-riscv32 -version && qemu-riscv64 -version && qemu-system-riscv32 -version && qemu-system-riscv64 -version`. 而是需要`./qemu-riscv32 ...`.

    作者回复: 嗯 嗯

    2022-08-24归属地:湖北
    1
  • TableBear
    source 的主要用途是执行文件并从文件加载变量及函数到执行环境。 ~/.bashrc文件中的环境变量已经在用户登录shell的时候加载进执行环境了,此时编辑不会触发加载。必须使用source或者重新登录才能触发重新加载

    作者回复: 是的

    2022-08-24归属地:湖北
    1
  • 筱琲
    在build 目录下执行配置命令时,遇到几个包缺失,依次安装就好: sudo apt install libglib2.0-dev libpixman-1-dev libsdl2-dev

    作者回复: 嗯嗯 加油

    2022-11-02归属地:湖北
  • overheat
    sudo make -j8, 这里应该不用sudo。

    作者回复: 可以 不用

    2022-09-22归属地:湖北
  • Geek_d47998
    tasks.json和launch.json在老师给的代码,gitee仓库下有,main.c文件里还需要放Makefile后才能按F5编译

    作者回复: 有啊

    2022-09-12归属地:湖北
  • jeigiye
    root@zgye-ubuntu:~/test# cat hello.s .file "hello.c" .option nopic .attribute arch, "rv64i2p0_m2p0_a2p0_f2p0_d2p0_c2p0" .attribute unaligned_access, 0 .attribute stack_align, 16 .text .section .rodata .align 3 .LC0: .string "Risc-V" .align 3 .LC1: .string "Hello %s\n" .text .align 1 .globl main .type main, @function main: addi sp,sp,-16 sd ra,8(sp) sd s0,0(sp) addi s0,sp,16 lui a5,%hi(.LC0) addi a1,a5,%lo(.LC0) lui a5,%hi(.LC1) addi a0,a5,%lo(.LC1) call printf li a5,0 mv a0,a5 ld ra,8(sp) ld s0,0(sp) addi sp,sp,16 jr ra .size main, .-main .ident "GCC: () 12.1.0" root@zgye-ubuntu:~/test# /opt/riscv/qemu/bin/qemu-riscv64 hello Hello Risc-V root@zgye-ubuntu:~/test# ubuntu22.04上跑通。

    作者回复: 666666

    2022-09-06归属地:湖北
  • Liu Zheng
    想问一下,https://gitee.com/lmos/Geek-time-computer-foundation/blob/master/lesson12~13/main.c#L7-8 这里面func和sumdata分别都是什么呢?没有看到哪个地方有定义这两个东西,跑make或者vscode里面按F5也是会报错。

    作者回复: 故意 的 请详细读文稿

    2022-08-25归属地:湖北
  • 🔥Burn
    archlinux,在编译qemu时报了编译错误,麻烦老师看看什么问题: lssh -lstdc++ -Wl,--end-group /usr/bin/ld: libcommon.fa.p/ebpf_ebpf_rss.c.o: in function `ebpf_rss_load': /home/burn/riscv-gnu-toolchain/qemu-6.2.0/build/../ebpf/ebpf_rss.c:52: undefined reference to `bpf_program__set_socket_filter' collect2: 错误:ld 返回 1 [1926/2548] Compiling C object libqemu-riscv64-linux-user.fa.p/target_riscv_vector_helper.c.o [1927/2548] Compiling C object libqemu-riscv64-linux-user.fa.p/target_riscv_translate.c.o [1928/2548] Compiling C object libqemu-riscv32-linux-user.fa.p/target_riscv_translate.c.o ninja: build stopped: subcommand failed. make: *** [Makefile:162:run-ninja] 错误 1
    2023-05-18归属地:浙江
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部