1.本文概述
2.工具介紹
2.1 riscv-gnu-toolchain
2.2 spike
2.3 RISC-V Porxy Kernel
2.4 編譯工具
3.編譯Linux Kernel
4.編譯busybox
5.制作根文件系統
6.編譯安裝qemu
7.啟動基本Linux程序
8.運行發行版本OS(fedora&ubuntu)
8.1 下載安裝fedora鏡像
8.2 下載安裝ubuntu鏡像
9.總結
1.本文概述目前雖然RISC-V的硬件開發板能夠運行Linux的十分難得,從探索RISCV的生態的角度上來看,使用模擬器也是一種非常好的方式。使用QEMU能夠很好的模擬RISCV的硬件資源,后期有實際的開發板后將其軟件生態移植上去也并不復雜。
本文將演示QEMU上建立RISCV的環境,以及如何交叉編譯Linux,通過文章的描述,可以掌握RISC-V上的Linux的編譯開發流程,文章也展示了在riscv64架構上運行fedora和ubuntu兩個Linux發行版本的過程。
2.工具介紹在進行環境搭建之前,首先先來介紹一些目前開源的比較熱門的RISCV工具項目。
2.1 riscv-gnu-toolchain
RISCV的GNU工具鏈,是編譯RISC-V程序的交叉編譯工具鏈。
https://github.com/riscv/riscv-gnu-toolchain
主要有兩個版本:
riscv64--unknown--elf-gcc是使用newlib,主要用于靜態編譯的獨立的程序或者單機嵌入式程序,RTOS等等。
riscv64-unknown--linux--gnu--gcc使用的glibc,可以編譯動態鏈接程序,例如大型操作系統如Linux等等。
如果編譯選項加上-nostartfiles -nostdlib -nostdinc,兩個編譯版本一致
2.2 spike
spike是一個開源的RISC-V的指令模擬器,實現了一個和多個RISC-V harts的功能,提供了豐富的系統仿真,其名稱來自于Golden Spike,是第一條橫貫美國大陸的鐵路。
https://github.com/riscv/riscv-isa-sim
在RISC-V架構指令集擴展層面有著非常好的實現。
2.3 RISC-V Porxy Kernel
RISC-V Proxy Kernel and Boot Loader,簡稱RISCV-PK,是一個輕量級的應用程序的可執行環境,可以加載靜態的RISCV ELF的可執行文件。主要兩個功能,代理和引導啟動,可以作為引導啟動RISC-V的Linux的環境。
https://github.com/riscv/riscv-pk
2.4 編譯工具
如果要一次性部署這些工具,可以通過下面的倉庫進行操作
https://github.com/riscv/riscv-tools
在此之前,首先安裝必要的程序,本次使用的環境為Ubuntu20.04。
sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev libncurses5-dev libncursesw5-dev
當安裝好必要的程序后,可以clone倉庫。
git clone https://github.com/riscv/riscv-tools.git
git submodule update --init --recursive
export RISCV=~/riscv
。/build.sh
可能會遇到如下的錯誤:
要解決這個問題,首先需要安裝下載riscv64的交叉編譯工具鏈。
git clone https://github.com/riscv/riscv-gnu-toolchain
。/configure --prefix=$RISCV
其中配置項目--enable-multilib表示編譯32bit和64bit的gcc,支持,這里不選擇,只編譯32bit的交叉編譯工具鏈。
經過測試最高版本的gcc交叉編譯工具鏈,編譯riscv-tools會出現異常,所以替換成低一點的版本。
riscv-gnu-toolchain/riscv-gcc
git checkout riscv-gcc-8.2.0
緊接著開始編譯
make -j $(nproc)
表示編譯baremate版本的嵌入式交叉編譯環境。
make -j $(nproc) linux
編譯Linux版本的交叉編譯環境。
編譯完成后,可以看到編譯好的程序。
ls ~/riscv/bin
然后,返回去編譯riscv-tools。
最后導出環境變量
export PATH=/home/bigmagic/riscv/bin:$PATH
3.編譯Linux Kernel在編譯Linux Kernel之前,需要安裝相關的工具。
sudo apt install libncurses5-dev libncursesw5-dev
下載編譯Linux Kernel
git clone https://github.com/torvalds/linux.git
cd linux
git checkout v5.10
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j $(nproc)
編譯完成后,最后生成的Kernel文件在linux/arch/riscv/boot/Image。
4.編譯busybox可以用busybox制作生成根文件系統,同時也提供了Linux下運行的一些基本程序與控制臺。
git clone https://git.busybox.net/busybox
cd busybox
git checkout 1_32_1
CROSS_COMPILE=riscv64-unknown-linux-gnu- make defconfig
CROSS_COMPILE=riscv64-unknown-linux-gnu- make menuconfig
需要選擇靜態link。
選擇靜態link
然后開始編譯
CROSS_COMPILE=riscv64-unknown-linux-gnu- make -j $(nproc)
5.制作根文件系統下面來制作一個空的磁盤,格式為ext2的文件系統。
dd if=/dev/zero of=root.bin bs=1M count=64
mkfs.ext2 -F root.bin
這樣就制作了一個空的,名稱為root.bin文件格式為ext2的文件系統。
接著只需要將busybox的程序加載進去即可。
mkdir mnt
sudo mount -o loop root.bin mnt
cd mnt
sudo mkdir -p bin etc dev lib proc sbin tmp usr usr/bin usr/lib usr/sbin
sudo cp ~/busybox/busybox bin
sudo ln -s 。./bin/busybox sbin/init
sudo ln -s 。./bin/busybox bin/sh
cd 。.
sudo umount mnt
制作好的根文件系統目錄結構如下:
如果要創建更加功能完善的Linux的根文件系統,這里可以采用buildroot或者Yocto來進行創建。
6.編譯安裝qemu可以直接安裝
sudo apt install qemu-system-misc
或者自己編譯
編譯之前需要安裝如下的庫:
sudo apt-get install -y git build-essential pkg-config zlib1g-dev libglib2.0-0 libglib2.0-dev libsdl1.2-dev libpixman-1-dev libfdt-dev autoconf automake libtool librbd-dev libaio-dev flex bison make
因為要運行qemu
git clone git@github.com:qemu/qemu.git
cd qemu
git checkout v6.0.0
mkdir build
cd build
。./configure --prefix=/home/bigmagic/riscv/qemu --target-list=riscv32-
softmmu,riscv64-softmmu --enable-debug-tcg --enable-debug --enable-debug-info && make -j8 && make install
其中--prefix=后面的路徑是需要填寫自己的路徑。
最后添加環境變量到自己的路徑。
export PATH=/home/bigmagic/riscv/qemu/bin/:$PATH
7.啟動基本Linux程序事先準備好編譯完成的root.bin程序以及Linux的Image
qemu-system-riscv64 -nographic -machine virt -kernel linux/arch/riscv/boot/Image -append “root=/dev/vda rw console=ttyS0” -drive file=rootfs/root.bin,format=raw,id=hd0 -device virtio-blk-device,drive=hd0
此時可以看到Linux正常的啟動。
第一階段是OpenSBI,后面一個階段才是
Linux啟動后,無法正常輸入命令,需要輸入
/bin/busybox --install -s
可以看到RISCV64 的 Linux正常的運行起來了。
8.運行發行版本OS(fedora&ubuntu)根據之前的描述,如果在buildroot中選擇了qemu_riscv64_virt_defconfig,那么最后生成的可執行腳本如下
qemu-system-riscv64 -nographic -machine virt -kernel output/images/Image
-append “root=/dev/vda rw console=ttyS0”
-drive file=output/images/rootfs.ext2,format=raw,id=hd0
-device virtio-blk-device,drive=hd0
上述的腳本可以作為基本的參考。如果要運行fedora,那么可以按照下面的流程進行。
首先安裝virt-builder,可以快速構建虛擬機環境。
sudo apt install libguestfs-tools
接下來可以添加fedora的倉庫。
mkdir -p ~/.config/virt-builder/repos.d/
cat 《《EOF 》 ~/.config/virt-builder/repos.d/fedora-riscv.conf
[fedora-riscv]
uri=https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/index
EOF
通過列出riscv64支持的發行版鏡像
8.1 下載安裝fedora鏡像
下載fedora鏡像,所有的鏡像可以在下列的網站中找到
https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/
此時構建一個20200108版本的鏡像。
wget https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/Fedora-Developer-Rawhide-20200108.n.0-sda.raw.xz
下載完成后,解壓文件
unxz -k Fedora-Developer-Rawhide-20200108.n.0-sda.raw.xz
接著下載啟動文件
wget https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/Fedora-Developer-Rawhide-20200108.n.0-fw_payload-uboot-qemu-virt-smode.elf
執行的腳本如下
export VER=20200108.n.0
qemu-system-riscv64 -machine virt
-nographic
-smp 4
-m 8G
-bios Fedora-Developer-Rawhide-${VER}-fw_payload-uboot-qemu-virt-smode.elf
-object rng-random,filename=/dev/urandom,id=rng0
-device virtio-rng-device,rng=rng0
-device virtio-blk-device,drive=hd0
-drive file=Fedora-Developer-Rawhide-${VER}-sda.raw,format=raw,id=hd0
-device virtio-net-device,netdev=usernet
-netdev user,id=usernet,hostfwd=tcp:22
正常情況下,啟動信息如下:
下面也列出了用戶名
login: riscv
password: fedora_rocks!
進入環境后可以正常使用鏡像。
使用python。
這樣就可以在RISCV的架構上開發應用程序了。
8.2 下載安裝ubuntu鏡像
安裝需要的工具
sudo apt install qemu-system-misc opensbi u-boot-qemu qemu-utils
到ubuntu官網上看到可以下載的鏡像
http://ubuntutym2.u-toyama.ac.jp/ubuntu-dvd/20.04/release/
下載地址如下:
wget http://ubuntutym2.u-toyama.ac.jp/ubuntu-dvd/20.04/release/ubuntu-20.04.2-preinstalled-server-riscv64.img.xz
然后解壓
xz -dk ubuntu-20.04.2-preinstalled-server-riscv64.img.xz
最后可以運行ubuntu的腳本
qemu-system-riscv64
-machine virt -nographic -m 2048 -smp 4
-bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_jump.elf
-kernel /usr/lib/u-boot/qemu-riscv64_smode/uboot.elf
-device virtio-net-device,netdev=eth0 -netdev user,id=eth0
-drive file=ubuntu-20.04.2-preinstalled-server-riscv64.img,format=raw,if=virtio
執行的現象如下:
登錄用戶名,密碼
username:ubuntu
password:ubuntu
然后修改新的密碼,最后可以正常進入ubuntu。
9.總結本文從頭介紹了一個riscv64上運行完整Linux的流程,也完成fedora&ubuntu兩個發行版本的RISC-V環境搭建。
越來越多的RISCV的發新版本的適配,也充分展示了RISCV架構生態的繁榮。
目前越來越多的發新版OS開始慢慢適配RISCV,但是由于硬件資源和開發板的稀缺,導致很多軟件生態不能實際的構建,此時可以通過qemu來進行實驗。
開發板的出現只是遲早的,目前D1開發板對標樹莓派,想必出來后也可以運行Linux的發行版,后期可以將其適配到各種Linux的發行版本上,在其進行軟件生態建設也是一個不錯的平臺。
原文標題:搭建qemu RISC-V運行Linux環境
文章出處:【微信公眾號:嵌入式IoT】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
Linux
+關注
關注
87文章
11123瀏覽量
207919 -
RISC
+關注
關注
6文章
460瀏覽量
83566
原文標題:搭建qemu RISC-V運行Linux環境
文章出處:【微信號:Embeded_IoT,微信公眾號:嵌入式IoT】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論