本章实验 · 三个实验
本章三个实验一览
本章全部围绕「程序怎么到板子上跑起来」这一件事,拆成三个递进的实验。实验一、实验二只需要软件(板端 gcc),没有硬件器材;实验三是正式的通道验收。三个实验都必须在板上跑通、留下可复查证据才算过关。
| 实验 | 层次 | 一句话目标 | 跑在哪 |
|---|---|---|---|
| 实验一 板端原生:自己编、自己跑 |
软件 | 最小程序 probe 在板端用 make 编出 RISC-V 产物并跑通 |
荔枝派(原生) |
| 实验二 架构陷阱:编错就上不了板 |
软件 | 把主机 gcc 编出的 x86 产物传上板,亲眼看到 Exec format error,理解为何要「对架构编译」 |
主机 + 荔枝派 |
| 实验三 上板通道验收(CoreMark) |
通道验收 | 交叉编 CoreMark → SCP 上传 → 板端跑分,归档整套通道证据 | 主机交叉 + 荔枝派 |
实验一 · 板端原生:自己编、自己跑(probe)
荔枝派跑的是一套完整的 Linux,板子上自带 gcc 与 make(讲义 1.3「三条开发路径」中的板端原生路径)。本实验让板子「自己编、自己跑」一个最小程序,并用 file / readelf 认一认产物确实是 RISC-V。
步骤
源码在仓库 chapters/ch01/code/probe/(一个 probe.c + 一个 Makefile)。先把它传到板子:
# 主机上执行:把 probe 目录整个传到板端家目录 $ scp -r chapters/ch01/code/probe user@board-ip:~/
然后登录板子,编译、认架构、运行:
# 板端 shell $ cd ~/probe $ make $ file probe # 期望输出里含 UCB RISC-V;若没有,说明 make 用的不是板端 gcc $ readelf -h probe | grep Machine # 期望:Machine: RISC-V $ ./probe # 期望: # arch = riscv # ptr size = 8 bytes # probe done.
本实验成功判据:file probe 出现 RISC-V;readelf -h 的 Machine 为 RISC-V;./probe 正常打印三行并退出。把三处输出抄进下表。
| 记录字段 | 你的记录 |
|---|---|
板端 uname -m | |
file probe 一行摘要 | |
readelf -h probe | grep Machine 输出 | |
./probe 输出(三行) |
验收:上表字段齐全、值正确,即通过实验一。
make、file 为 RISC-V、./probe 跑通实验二 · 架构陷阱:编错就上不了板
实验一证明「板端原生 gcc 编的能跑」。现在反过来看:主机 gcc 编的程序,架构是 x86-64,直接传上板子会怎样?本实验把同一份 probe.c 在主机编一次、在板端编一次,两份都拿到板子上跑,亲自确认「对架构编译」这件事。
步骤
# 主机上执行(这台是 x86 Linux):make 得到 x86-64 产物 $ cd chapters/ch01/code/probe $ make $ file probe # 期望:x86-64 / Advanced Micro Devices X86-64,而不是 RISC-V $ readelf -h probe | grep Machine # 期望:Machine: Advanced Micro Devices X86-64 $ scp probe user@board-ip:/tmp/probe.x86
# 板端 shell:先确保自己有 riscv 版,再试跑传上来的 x86 版 $ cd ~/probe && make # 若实验一已编过,这步会跳过 $ file probe # 期望:UCB RISC-V $ chmod +x /tmp/probe.x86 $ /tmp/probe.x86 # 期望:cannot execute binary file: Exec format error(退出码 126) # —— x86 程序在 RISC-V 板上跑不起来,而不是「程序崩溃」 $ ./probe # 期望:正常打印 arch = riscv —— 板端自己编的就能跑
Exec format error 不是程序写错,而是产物架构和 CPU 对不上。要让板子跑,程序必须编成 RISC-V:要么在板端原生编,要么在主机用交叉工具链编(实验三用后者)。讲义 1.3 的反汇编对比,让你看到同一份 C 在不同架构下生成的指令根本不同。
| 记录字段 | 你的记录 |
|---|---|
主机 file probe 一行摘要(x86-64) | |
板端 file probe 一行摘要(RISC-V) | |
板端跑 /tmp/probe.x86 的错误行(cannot execute binary file: Exec format error) | |
板端跑 ./probe 的输出首行 | |
| 一句话结论(为什么 x86 产物上不了板) |
验收:两张 file 摘要架构不同;x86 产物在板上报 Exec format error;riscv 产物正常跑;结论句写对。
/tmp/probe.x86 → Exec format error;板端 ./probe 正常实验三 · 上板通道验收(CoreMark)
实验一、实验二已经证明:板端能原生编、能跑;主机默认 gcc 的产物上不了板。实验三把整条「主机交叉编译 → 传输 → 板端运行」通道用到正式程序 CoreMark 上,并留下可复查的分数与证据。
本实验要做什么
本实验要证明一件事:你在主机上用交叉工具链编出的 RISC-V 程序,能够完整传到荔枝派 4A,并在板端真正跑起来。我们用 CoreMark 作为这份程序:你将留下编译产物、传输核对与板端运行的完整证据,使整条通道可以被复查。分数用来确认程序确实执行成功;可复查的通道证据,才是本章实验要交付的成果。
开始之前,请确认讲义 1.1 至 1.3 已经做完:交叉工具链可用,板子可以登录,主机上已经交叉编出 CoreMark,并且用 file 确认产物架构是 RISC-V。交叉编译的完整命令以讲义为准;本页从「核对已有产物」开始,完成传输、跑分与归档。
你将依次完成这些事:在主机上再次用 file 与 sha256sum 核对产物;用 SCP 把文件传到板子并确认两端哈希一致;在板端加上执行权限并跑出 CoreMark 分数;把分数、日志与通道自证输出写入记录表。
前提自检
请先确认下表每一项都已具备。若有缺项,回到对应讲义小节补齐后再继续本页步骤。
| 前提 | 你怎么确认「已经具备」 | 对应讲义 | □ |
|---|---|---|---|
| ruyi 与交叉工具链已安装 | 在 x86 Linux 上激活 venv-gnu-ruyisdk 后执行 riscv64-ruyisdk-linux-gnu-gcc -dumpmachine,输出为 riscv64-ruyisdk-linux-gnu |
1.1 | |
| 荔枝派 4A 已烧录并可启动 | 上电能登录;cat /etc/revyos-release 中 RELEASE_ID=20251226;uname -m 为 riscv64(讲义 1.2) |
1.2 | |
| 串口或 SSH 至少一种可登录板端 | 能进入板端 shell,并执行简单命令(如 hostname) |
1.2 | |
| 主机上已有 RISC-V 架构的 CoreMark 可执行文件 | 对产物执行 file,输出中含 RISC-V 或 UCB RISC-V(架构为 x86-64 则需回到讲义 1.3 重编) |
1.3 |
步骤
下面是本实验的主体步骤。若交叉编译命令需要重做,请回到讲义 1.3。
1. 在主机确认 CoreMark 产物架构
在 x86 Linux 上进入 chapters/ch01/code(或板上同步目录 ~/ruyi-riscv-embedded/ch01-lab 的主机交叉产物):
$ file coremark/coremark.exe # 成功:一行摘要里应出现 UCB RISC-V 或 RISC-V 字样 # 失败:若出现 x86-64 / Intel 80386,说明没用交叉工具链,回讲义 1.3 重编 $ sha256sum coremark/coremark.exe # 记下这串哈希,稍后与板端对照,证明 SCP 传的是同一份文件
本步成功判据:file 确认是 RISC-V ELF;你已把 sha256sum 结果抄进下方「必记字段」表。
venv-gnu-ruyisdk 后 make:产物为 RISC-V ELF2. SCP 上传到荔枝派 4A 并核对完整性
SCP(Secure Copy)通过 SSH 通道把文件拷到远端。把下面命令里的 user 和 board-ip 换成你板子的真实用户名与局域网 IP(可先在板端执行 ip a 查看)。
$ scp coremark/coremark.exe user@board-ip:/tmp/ $ ssh user@board-ip 'sha256sum /tmp/coremark.exe' # 板端打印的哈希必须与主机上一步完全一致
本步成功判据:两端哈希一致;板端路径 /tmp/coremark.exe(或你实际选用的路径)可被列出。
3. 板端赋予执行权限并跑分
$ ssh user@board-ip # 已进入板端 shell 后: $ chmod +x /tmp/coremark.exe $ /tmp/coremark.exe
程序会运行一段时间后打印结果。请从输出中抄录 CoreMark 分数(常见字段为 Iterations/Sec,或汇总行里的 CoreMark 总分),并把完整终端输出另存为日志文件(截图或重定向均可),同时写入下方「必记字段」表。
本步成功判据:程序正常结束并打出分数;你已把分数与运行日期写入「必记字段」表,并保存完整日志。
本实验验收走步骤 2–3 的 SCP 路径。图 2 是板上自己编译/跑分的对照,两条都会即可。
Exec format error 时,先回主机用 file 核对是否误用了主机 GCC;再核对 SCP 目标路径与 chmod +x 是否做过。若 SSH 连不上,回讲义 1.2 检查网线、IP 与防火墙。命令细节以讲义 1.2 / 1.3 为准。
必记字段
| 字段 | 你的记录 |
|---|---|
| 产物文件名 | |
主机 file 一行摘要 | |
主机与板端 sha256sum(须一致) | |
| 板端可执行文件路径 | |
| CoreMark 分数(含字段名) | |
| 运行日期 / 板卡型号 |
4. 通道与工具链自证
除跑分外,还要留下三份「通道还活着」的证据。每条保留一行真实输出(可粘贴到实验报告)。
# 板端:证明 SSH 能登录,且架构是 riscv64 $ ssh user@board-ip 'hostname; uname -m' # uname -m 的期望输出:riscv64 # 主机:证明交叉工具链三元组正确 $ riscv64-ruyisdk-linux-gnu-gcc -dumpmachine # 期望输出:riscv64-ruyisdk-linux-gnu
本步成功判据:三行输出均已保存;uname -m 为 riscv64;-dumpmachine 为 riscv64-ruyisdk-linux-gnu。
验收表
全部勾选且材料齐全,即完成本章实验。缺证据视为未通过。
| 验收项 | 证据 | □ |
|---|---|---|
| 烧录后荔枝派 4A 可启动 | 启动日志或串口/SSH 登录截图 | |
| SSH 可登录板端 | ssh … 'hostname; uname -m' 输出 | |
uname -m 为 riscv64 | 同上日志中的架构行 | |
| 工具链三元组正确 | -dumpmachine → riscv64-ruyisdk-linux-gnu | |
| CoreMark 交叉编译产物为 RISC-V | 主机 file 输出 | |
| SCP 上板成功且文件完整 | 两端 sha256sum 一致 | |
| 板端跑出 CoreMark 分数并已记录 | 完整运行日志 + 「必记字段」表 |