[{"data":1,"prerenderedAt":231},["ShallowReactive",2],{"content:\u002Ffiddling\u002Fspike-install":3,"surround:\u002Ffiddling\u002Fspike-install":220},{"id":4,"title":5,"body":6,"categories":195,"date":197,"description":198,"draft":199,"extension":200,"image":201,"meta":202,"navigation":204,"path":205,"permalink":201,"published":201,"readingTime":206,"recommend":201,"references":201,"seo":211,"sitemap":212,"stem":213,"tags":214,"type":218,"__hash__":219},"content\u002Fposts\u002Ffiddling\u002Fspike-install.md","RISC-V 工具链与模拟器（emulator）的安装",{"type":7,"value":8,"toc":187},"minimark",[9,13,18,21,30,38,41,51,58,64,67,73,76,82,89,104,108,114,117,123,130,134,140,143,146,152,155,158,166,169,175,178,184],[10,11,12],"p",{},"闲的无聊看看 spike 源码，但是翻了很多教程都没有可以直接安装好 spike 和相关的工具链。于是自己动手丰衣足食，直接读相关仓库的 README，基本都可以安装成功，但是还是暗藏着一个小坑，记录一下。",[14,15,17],"h3",{"id":16},"工具链riscv-gnu-toolchain的安装","工具链（riscv-gnu-toolchain）的安装",[10,19,20],{},"RISC-V 工具链包括 gcc、gdb、objdump\u002Fcopy 和相关的标准库实现等，建议首先安装。",[10,22,23,24],{},"仓库地址：",[25,26,27],"a",{"href":27,"rel":28},"https:\u002F\u002Fgithub.com\u002Friscv-collab\u002Friscv-gnu-toolchain",[29],"nofollow",[10,31,32,33,37],{},"clone 时建议加上 ",[34,35,36],"code",{"code":36},"--depth=1"," 参数缩小 clone 体积，后面几个仓库的 clone 也建议加此参数。",[10,39,40],{},"前置的依赖安装可见 README 中的 Prerequisites 一节，当前 Debian 系下为：",[42,43,49],"pre",{"className":44,"code":46,"language":47,"meta":48},[45],"language-bash","sudo apt 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 ninja-build\n","bash","",[34,50,46],{"__ignoreMap":48},[10,52,53,54,57],{},"clone 后按照工具链中的 ",[34,55,56],{"code":56},"Installation (Newlib)"," 一节基本可以安装成功，但是有坑点：",[59,60,61],"blockquote",{},[10,62,63],{},"使用此方式编译的 gcc 无法编译 riscv-pk，会报 extension `zifencei' required 的错误，推测是因为默认的编译参数并不支持 zifencei 扩展（即 FENCE.I 指令）",[10,65,66],{},"可用的编译参数如下：",[42,68,71],{"className":69,"code":70,"language":47,"meta":48},[45],".\u002Fconfigure --prefix=\u002Fopt\u002Friscv --with-arch=rv64gc\nmake\n",[34,72,70],{"__ignoreMap":48},[10,74,75],{},"建议首先在 \u002Fopt 下建立 riscv 文件夹，并保证 riscv 文件夹的所有人为普通用户自己。如非则需要 chown：",[42,77,80],{"className":78,"code":79,"language":47,"meta":48},[45],"sudo chown 1000:1000 \u002Fopt\u002Friscv\n",[34,81,79],{"__ignoreMap":48},[10,83,84,85,88],{},"这里假设 uid 和 gid 皆为 1000，具体可以通过 ",[34,86,87],{"code":87},"id"," 命令查看。",[10,90,91,92,95,96,99,100,103],{},"安装完成后需要将 ",[34,93,94],{"code":94},"\u002Fopt\u002Friscv\u002Fbin"," 加入 Path，具体方式可 Google 可 ChatGPT。后续安装的内容也都会放入 ",[34,97,98],{"code":98},"\u002Fopt\u002Friscv"," 中。完成后 ",[34,101,102],{"code":102},"riscv64-unknown-elf-gcc"," 应当可用。",[14,105,107],{"id":106},"模拟器spike的安装","模拟器（spike）的安装",[10,109,23,110],{},[25,111,112],{"href":112,"rel":113},"https:\u002F\u002Fgithub.com\u002Friscv-software-src\u002Friscv-isa-sim",[29],[10,115,116],{},"clone 下来后按照 README 中的 Build Steps 一节直接安装即可，并无坑点。当前命令：",[42,118,121],{"className":119,"code":120,"language":47,"meta":48},[45],"$ sudo apt install device-tree-compiler\n$ mkdir build\n$ cd build\n$ ..\u002Fconfigure --prefix=\u002Fopt\u002Friscv\n$ make\n$ make install\n",[34,122,120],{"__ignoreMap":48},[10,124,125,126,129],{},"安装完成后 ",[34,127,128],{"code":128},"spike"," 命令应可用",[14,131,133],{"id":132},"模拟内核riscv-pk的安装","模拟内核（riscv-pk）的安装",[10,135,23,136],{},[25,137,138],{"href":138,"rel":139},"https:\u002F\u002Fgithub.com\u002Friscv-software-src\u002Friscv-pk",[29],[10,141,142],{},"pk 即 Proxy Kernel，用来直接运行静态链接的用户态 RISCV 程序，毕竟只要验证的话，再跑一个操作系统太重了。",[10,144,145],{},"clone 下来后按照 README 中的 Build Steps 直接安装即可。坑点仅限于工具链一节提到的 FENCE.I 指令。当前命令：",[42,147,150],{"className":148,"code":149,"language":47,"meta":48},[45],"$ mkdir build\n$ cd build\n$ ..\u002Fconfigure --prefix=\u002Fopt\u002Friscv --host=riscv64-unknown-elf\n$ make\n$ make install\n",[34,151,149],{"__ignoreMap":48},[14,153,154],{"id":154},"验证",[10,156,157],{},"验证使用了 spike 中的例子。新建 hello.c，内容如下：",[42,159,164],{"className":160,"code":162,"language":163,"meta":48},[161],"language-c","#include \u003Cstdio.h>\n\nvoid main()\n{\n    const char *s = \"Hello.\\n\";\n    while (*s) putchar(*s++);\n    while(1);\n}\n","c",[34,165,162],{"__ignoreMap":48},[10,167,168],{},"编译该文件：",[42,170,173],{"className":171,"code":172,"language":47,"meta":48},[45],"$ riscv64-unknown-elf-gcc -o hello hello.c\n",[34,174,172],{"__ignoreMap":48},[10,176,177],{},"通过 spike 运行：",[42,179,182],{"className":180,"code":181,"language":47,"meta":48},[45],"spike pk hello\n",[34,183,181],{"__ignoreMap":48},[10,185,186],{},"可以看到终端输入了 Hello.，按多次 ctrl+c 可退出。",{"title":48,"searchDepth":188,"depth":188,"links":189},4,[190,192,193,194],{"id":16,"depth":191,"text":17},3,{"id":106,"depth":191,"text":107},{"id":132,"depth":191,"text":133},{"id":154,"depth":191,"text":154},[196],"折腾","2023-05-24 17:51:09","在安装 RISC-V 工具链时，首先需要获取 riscv-gnu-toolchain 的源码，建议使用带有 `--depth=1` 的 clone 命令，以减少下载体积。安装过程中，注意查看 README 中的 Prerequisites 部分，确保前置依赖都已正确安装。在 Debian 系统中，可以通过简单的命令安装所需的依赖包，确保工具链的顺利搭建。",false,"md",null,{"slots":203},{},true,"\u002Ffiddling\u002Fspike-install",{"text":207,"minutes":208,"time":209,"words":210},"3 min read",3.005,180300,601,{"title":5,"description":198},{"loc":205},"posts\u002Ffiddling\u002Fspike-install",[196,215,216,128,217],"环境搭建","riscv","riscv-pk","tech","mGyZE5rjjscZQIJQLTk1EKI0I9vopLiN1oP4REEgiCw",[221,226],{"title":222,"path":223,"stem":224,"date":225,"type":218,"children":-1},"漫谈编程语言","\u002Ffiddling\u002Fchitchat-about-programming-language","posts\u002Ffiddling\u002Fchitchat-about-programming-language","2023-04-08 13:16:36",{"title":227,"path":228,"stem":229,"date":230,"type":218,"children":-1},"GFW 原理考","\u002Ffiddling\u002Ftech-about-gfw","posts\u002Ffiddling\u002Ftech-about-gfw","2024-06-23 15:31:32",1787554444969]