IC的帆哥 - linux https://icfgblog.com/index.php/tag/linux/ zh-CN Sat, 26 Mar 2022 20:50:00 +0800 Sat, 26 Mar 2022 20:50:00 +0800 FPGA 部署Rocket Chip 跑Linux https://icfgblog.com/index.php/software/328.html https://icfgblog.com/index.php/software/328.html Sat, 26 Mar 2022 20:50:00 +0800 icfg66 在过去的四个月时间里,一直尝试着在FPGA部署RISC-V处理器,并运行Linux操作系统,基本浏览了全网这方面所有教程,git clone,make的技能炉火纯青。

在FPGA部署Rocket Chip并运行Linux主要有两种方式,一种是伯克利官方仓库fpga-zynq,它需要借助ARM,通过前端服务器Frontend Server和ARM交互,进行串口显示。另一种是不借助ARM。

一、借助ARM

如下图所示,ARM端运行了PetaLinux,通过执行./fesvr-zynq pk hello ARM运行fesvr-zynq前端服务器,将pk(非常小的内核)和hello(rv-gcc编译的hello程序)搬到RV内存的特定地址,RV核执行之后,会将打印的结果告诉fesvr,最后通过ARM的串口显示。

通过执行./fesvr-zynq bbl也是类似原理,BBL是伯克利加载启动器,和OpenSBI有相同的作用,但比它更简化。bbl生成时,会加上payload选项,包入linux的Image镜像。此前Linux镜像生成时,也会包入简单根文件系统。这样就集齐了Linux运行的吉祥三宝:bootloader、kernel、root file system。

image.png

该工程已在ZC706的板子上复现,预编译的比特流文件似乎有点问题,需要重新生成才奏效。这个工程的缺点也比较明显:

  • Rocket Chip子仓库不在主分支上,是2018年的旁支,版本比较旧。
  • Vivado需要用2016.2版本,Ubuntu也最好是16版本,否则会报莫名的版本错误。
  • 需要借助ARM,不纯粹。

借助ARM运行RV Linux的工程还有几个:

二、不借助ARM

Z系列的板子都会带ARM,还找到一些不借助ARM,直接从SD卡启动的工程,也做了一些比较:

开源项目 更新频率 支持开发板 复现难度
Chipyard 活跃 VCU118 难
fpga-rocket-chip 三年前 Nexys A7 100T 易
lowrisc-chip 四年前 Nexys A7 100T 中
rocket-chip-vcu128 半年前 VCU128 中
vivado-risc-v 活跃 KC705,VC707,Nexys A7 100T 易

最终选择了最后一个仓库复现,社区很活跃,子仓库也是最新的,以打补丁的形式修改OpenSBI、Uboot、Linux kernel,容易进一步学习。

但要成功复现也不是想象中那么简单,运行环境如下:

  • Ubuntu 20 LTS ,32G内存
  • Vitis 2020.1以上

自己的虚拟机虽然是Ubuntu20,但只有8G内存。服务器虽然有32G内存,但Ubuntu是18.04,而且生成SD卡也不能在服务器上。这种因为环境造成的尬尴,Docker是最佳选择!

基本思路是,服务器装一个Ubuntu20的Docker环境,用来生成比特流文件;本地虚拟机用来生成SD卡需要的吉祥三宝:bootloader、linux kernel、root file system。

1、比特流文件

Docker的入门可以参考之前的博客 Docker 入门+实战

docker pull ubuntu:20.04
# 挂载整个工作目录,包含vivado软件
docker run -it --name yourname --user -v /home/username/:/home  ubuntu:20.04

之后按照github上的流程安装好相关的依赖软件make apt-install,make update-submodules。最后选择kc705的板子

source /opt/Xilinx/Vivado/2020.1/settings64.sh
make CONFIG=rocket64b2 BOARD=kc705 bitstream

生成好的比特流文件会在workspace目录下的vivado工程里,之后需要通过本地的vivado烧到板子上。

有意思的一点是,生成的过程中,设备树文件会合并到bootrom.img,然后作为固件一起烧进比特流文件。

2、SD卡准备

准备好SD卡,大卡小卡皆可,运行./mk-sd-card,主要流程是先下载Debian发行版的根文件系统,再分别生成uboot、opensbi、Linux kernel。opensbi会payload uboot,生成boot.elf和kernel一起放到SD卡的第一个分区,根文件系统放到SD卡的第二个分区。

最后写SD卡的过程会遇到一些错误,可以查看 issues 23:老显示SD占用,写不进数据, 需要手动umount /media/xxx/BOOT and rootfs 然后重新 ./mk-sd-card 。

3、最后一难

将SD卡插入卡槽,用vivado将bit流文件烧进板子,连接好串口,期待神圣的时刻:发现串口无打印!查看手册,发现是SW13的设置出错了,改成默认就行。

1648299710(1).png

image.png

最后,见证奇迹的时候:

image.png

虽然代码不是我写的,移植不是我做的,但看到起来的那一刻,也是热泪盈眶。接下来,盘它!

//纪念第100篇灌水博文

]]>
0 https://icfgblog.com/index.php/software/328.html#comments https://icfgblog.com/index.php/feed/tag/linux/
Qemu运行riscv linux总结 https://icfgblog.com/index.php/software/324.html https://icfgblog.com/index.php/software/324.html Wed, 09 Mar 2022 10:52:00 +0800 icfg66 全网有各种Qemu运行riscv linux的教程,有点杂,在此做一个总结分类。

要成功运行起来不难也不容易,跑不通最大的原因可能是版本问题,包括Qemu的版本、Opensbi版本、Linux的版本、BBL版本。

硬件上启动Linux需要准备三样东西:bootloader、Linux 内核、根文件系统。bootloader可以是opensbi(Open Supervisor Binary Interface)、bbl(Berkeyly Boot Loader)。根文件系统可以通过busy_box配置,也可以是各类linux发行版。

Qemu是硬件仿真器,可以将它当成一个实际的硬件,包含地址映射、外设等。

spike是指令集的模拟器,也是可以当成是硬件,但它与Qemu不同,只能解析二进制指令,Qemu还可以解析elf文件。有关spike、pk、fesrv可以参考这两篇文章:深入理解基于RISC-V ISS Spike的仿真系统:探索Spike,pk和fesrv、华科OS教程:RISC-V体系结构

一、Qemu 运行

1、默认opensbi + 独立Image + 独立rootfs

搭建qemu RISC-V运行Linux环境 汪辰,在 QEMU 上运行 RISC-V 64 位版本的 Linux

qemu-system-riscv64 -M virt \
		    -m 256M \
		    -nographic \
		    -bios default\
		    -kernel linux/arch/riscv/boot/Image\
		    -drive file=rootfs.img,format=raw,id=hd0 \
		    -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0"

2、opensbi包Image+独立rootfs

risc-v linux 根文件系统制作和运行 先生成linux内核文件Image,然后用opensbi的PAYLOAD选项将内核一起包入编译。最后运行时一定要加上-bios none否则会出现地址冲突错误。

qemu-system-riscv64 -M virt \
		    -m 256M \
		    -nographic \
		    -bios none\
		    -kernel opensbi/build/platform/generic/firmware/fw_payload.elf\
		    -drive file=rootfs.img,format=raw,id=hd0 \
		    -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0"

3、独立opensbi+独立Image+独立rootfs JUMP方式

构建riscv上运行的linux系统

qemu-system-riscv64 -M virt \
		    -m 256M \
		    -nographic \
		    -bios opensbi/build/platform/generic/firmware/fw_jump.bin\
		    -kernel linux/arch/riscv/boot/Image\
		    -drive file=rootfs.img,format=raw,id=hd0 \
		    -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0"

4、opensbi包Linux内核

RISC-V Kurun的博客只加载内核,无设备树。

qemu-system-riscv64 -M virt \
		    -m 256M \
		    -nographic \
		    -bios opensbi/build/platform/generic/firmware/fw_jump.bin\

5、opensbi包hello payload模式

opensbi下的riscv64裸机系列编程1(串口输出)

payload的文件一定是bin文件,file xx. bin会显示data,可以通过 riscv64-unknown-elf-objcope -O binary xx.elf xx.bin生成bin文件。

qemu-system-riscv64 -M virt 
          -m 256M\
          -nographic\
          -bios build/platform/generic/firmware/fw_payload.elf 

6、bbl包Image+rootfs

未验证 How to Run Linux on RISC-V with QEMU Emulator - CNX Software qemu引导riscv linux--摆脱busybear

 qemu-system-riscv64  -M virt \
                    -m 256M \
                    -nographic\
                    -kernel bbl \
                    -drive file=busybear.bin,format=raw,id=hd0\
                  -device virtio-blk-device,drive=hd0  -append "root=/dev/vda ro console=ttyS0"         
                  -netdev type=tap,script=./ifup,downscript=./ifdown,id=net0   
                  -device virtio-net-device,netdev=net0

二、Spike 运行

Image包rootfs ,bbl 包 Image。这种方式的启动和版本更加有关系 Spike模拟Linux 5.3教程 Spike 运行RISC-V Linux实践 bbl制作

LiteX and RocketChip

附录

# 1.查看qemu设备树
qemu-system-riscv64 -machine virt,dumpdtb=qemu-riscv64-virt.dtb
dtc qemu-riscv64-virt.dtb > qemu-riscv64-virt.dts
# 2.qemu debug模式
qemu-system-riscv32 -M virt -m 256M -kernel opensbi-1.0/build/platform/generic/firmware/fw_payload.elf -nographic -bios none  -smp 1 -s -S

riscv32-unknown-linux-gnu-gdb build/linux-5.16.12/vmlinux
target remote localhost:1234
]]>
0 https://icfgblog.com/index.php/software/324.html#comments https://icfgblog.com/index.php/feed/tag/linux/