搭建qemu RISC-V運(yùn)行Linux環(huán)境
1.本文概述
2.工具介紹
2.1 riscv-gnu-toolchain
2.2 spike
2.3 RISC-V Porxy Kernel
2.4 編譯工具
3.編譯Linux Kernel
4.編譯busybox
5.制作根文件系統(tǒng)
6.編譯安裝qemu
7.啟動(dòng)基本Linux程序
8.運(yùn)行發(fā)行版本OS(fedora&ubuntu)
8.1 下載安裝fedora鏡像
8.2 下載安裝ubuntu鏡像
9.總結(jié)
1.本文概述目前雖然RISC-V的硬件開(kāi)發(fā)板能夠運(yùn)行Linux的十分難得,從探索RISCV的生態(tài)的角度上來(lái)看,使用模擬器也是一種非常好的方式。使用QEMU能夠很好的模擬RISCV的硬件資源,后期有實(shí)際的開(kāi)發(fā)板后將其軟件生態(tài)移植上去也并不復(fù)雜。
本文將演示QEMU上建立RISCV的環(huán)境,以及如何交叉編譯Linux,通過(guò)文章的描述,可以掌握RISC-V上的Linux的編譯開(kāi)發(fā)流程,文章也展示了在riscv64架構(gòu)上運(yùn)行fedora和ubuntu兩個(gè)Linux發(fā)行版本的過(guò)程。
2.工具介紹在進(jìn)行環(huán)境搭建之前,首先先來(lái)介紹一些目前開(kāi)源的比較熱門(mén)的RISCV工具項(xiàng)目。
2.1 riscv-gnu-toolchain
RISCV的GNU工具鏈,是編譯RISC-V程序的交叉編譯工具鏈。
https://github.com/riscv/riscv-gnu-toolchain
主要有兩個(gè)版本:
riscv64--unknown--elf-gcc是使用newlib,主要用于靜態(tài)編譯的獨(dú)立的程序或者單機(jī)嵌入式程序,RTOS等等。
riscv64-unknown--linux--gnu--gcc使用的glibc,可以編譯動(dòng)態(tài)鏈接程序,例如大型操作系統(tǒng)如Linux等等。
如果編譯選項(xiàng)加上-nostartfiles -nostdlib -nostdinc,兩個(gè)編譯版本一致
2.2 spike
spike是一個(gè)開(kāi)源的RISC-V的指令模擬器,實(shí)現(xiàn)了一個(gè)和多個(gè)RISC-V harts的功能,提供了豐富的系統(tǒng)仿真,其名稱來(lái)自于Golden Spike,是第一條橫貫美國(guó)大陸的鐵路。
https://github.com/riscv/riscv-isa-sim
在RISC-V架構(gòu)指令集擴(kuò)展層面有著非常好的實(shí)現(xiàn)。
2.3 RISC-V Porxy Kernel
RISC-V Proxy Kernel and Boot Loader,簡(jiǎn)稱RISCV-PK,是一個(gè)輕量級(jí)的應(yīng)用程序的可執(zhí)行環(huán)境,可以加載靜態(tài)的RISCV ELF的可執(zhí)行文件。主要兩個(gè)功能,代理和引導(dǎo)啟動(dòng),可以作為引導(dǎo)啟動(dòng)RISC-V的Linux的環(huán)境。
https://github.com/riscv/riscv-pk
2.4 編譯工具
如果要一次性部署這些工具,可以通過(guò)下面的倉(cāng)庫(kù)進(jìn)行操作
https://github.com/riscv/riscv-tools
在此之前,首先安裝必要的程序,本次使用的環(huán)境為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
當(dāng)安裝好必要的程序后,可以clone倉(cāng)庫(kù)。
git clone https://github.com/riscv/riscv-tools.git
git submodule update --init --recursive
export RISCV=~/riscv
。/build.sh
可能會(huì)遇到如下的錯(cuò)誤:
要解決這個(gè)問(wèn)題,首先需要安裝下載riscv64的交叉編譯工具鏈。
git clone https://github.com/riscv/riscv-gnu-toolchain
。/configure --prefix=$RISCV
其中配置項(xiàng)目--enable-multilib表示編譯32bit和64bit的gcc,支持,這里不選擇,只編譯32bit的交叉編譯工具鏈。
經(jīng)過(guò)測(cè)試最高版本的gcc交叉編譯工具鏈,編譯riscv-tools會(huì)出現(xiàn)異常,所以替換成低一點(diǎn)的版本。
riscv-gnu-toolchain/riscv-gcc
git checkout riscv-gcc-8.2.0
緊接著開(kāi)始編譯
make -j $(nproc)
表示編譯baremate版本的嵌入式交叉編譯環(huán)境。
make -j $(nproc) linux
編譯Linux版本的交叉編譯環(huán)境。
編譯完成后,可以看到編譯好的程序。
ls ~/riscv/bin
然后,返回去編譯riscv-tools。
最后導(dǎo)出環(huán)境變量
export PATH=/home/bigmagic/riscv/bin:$PATH
3.編譯Linux Kernel在編譯Linux Kernel之前,需要安裝相關(guān)的工具。
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制作生成根文件系統(tǒng),同時(shí)也提供了Linux下運(yùn)行的一些基本程序與控制臺(tái)。
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
需要選擇靜態(tài)link。
選擇靜態(tài)link
然后開(kāi)始編譯
CROSS_COMPILE=riscv64-unknown-linux-gnu- make -j $(nproc)
5.制作根文件系統(tǒng)下面來(lái)制作一個(gè)空的磁盤(pán),格式為ext2的文件系統(tǒng)。
dd if=/dev/zero of=root.bin bs=1M count=64
mkfs.ext2 -F root.bin
這樣就制作了一個(gè)空的,名稱為root.bin文件格式為ext2的文件系統(tǒng)。
接著只需要將busybox的程序加載進(jìn)去即可。
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
制作好的根文件系統(tǒng)目錄結(jié)構(gòu)如下:
如果要?jiǎng)?chuàng)建更加功能完善的Linux的根文件系統(tǒng),這里可以采用buildroot或者Yocto來(lái)進(jìn)行創(chuàng)建。
6.編譯安裝qemu可以直接安裝
sudo apt install qemu-system-misc
或者自己編譯
編譯之前需要安裝如下的庫(kù):
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
因?yàn)橐\(yùn)行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=后面的路徑是需要填寫(xiě)自己的路徑。
最后添加環(huán)境變量到自己的路徑。
export PATH=/home/bigmagic/riscv/qemu/bin/:$PATH
7.啟動(dòng)基本Linux程序事先準(zhǔn)備好編譯完成的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
此時(shí)可以看到Linux正常的啟動(dòng)。
第一階段是OpenSBI,后面一個(gè)階段才是
Linux啟動(dòng)后,無(wú)法正常輸入命令,需要輸入
/bin/busybox --install -s
可以看到RISCV64 的 Linux正常的運(yùn)行起來(lái)了。
8.運(yùn)行發(fā)行版本OS(fedora&ubuntu)根據(jù)之前的描述,如果在buildroot中選擇了qemu_riscv64_virt_defconfig,那么最后生成的可執(zhí)行腳本如下
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
上述的腳本可以作為基本的參考。如果要運(yùn)行fedora,那么可以按照下面的流程進(jìn)行。
首先安裝virt-builder,可以快速構(gòu)建虛擬機(jī)環(huán)境。
sudo apt install libguestfs-tools
接下來(lái)可以添加fedora的倉(cāng)庫(kù)。
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
通過(guò)列出riscv64支持的發(fā)行版鏡像
8.1 下載安裝fedora鏡像
下載fedora鏡像,所有的鏡像可以在下列的網(wǎng)站中找到
https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/
此時(shí)構(gòu)建一個(gè)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
接著下載啟動(dòng)文件
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
執(zhí)行的腳本如下
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
正常情況下,啟動(dòng)信息如下:
下面也列出了用戶名
login: riscv
password: fedora_rocks!
進(jìn)入環(huán)境后可以正常使用鏡像。
使用python。
這樣就可以在RISCV的架構(gòu)上開(kāi)發(fā)應(yīng)用程序了。
8.2 下載安裝ubuntu鏡像
安裝需要的工具
sudo apt install qemu-system-misc opensbi u-boot-qemu qemu-utils
到ubuntu官網(wǎng)上看到可以下載的鏡像
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
最后可以運(yùn)行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
執(zhí)行的現(xiàn)象如下:
登錄用戶名,密碼
username:ubuntu
password:ubuntu
然后修改新的密碼,最后可以正常進(jìn)入ubuntu。
9.總結(jié)本文從頭介紹了一個(gè)riscv64上運(yùn)行完整Linux的流程,也完成fedora&ubuntu兩個(gè)發(fā)行版本的RISC-V環(huán)境搭建。
越來(lái)越多的RISCV的發(fā)新版本的適配,也充分展示了RISCV架構(gòu)生態(tài)的繁榮。
目前越來(lái)越多的發(fā)新版OS開(kāi)始慢慢適配RISCV,但是由于硬件資源和開(kāi)發(fā)板的稀缺,導(dǎo)致很多軟件生態(tài)不能實(shí)際的構(gòu)建,此時(shí)可以通過(guò)qemu來(lái)進(jìn)行實(shí)驗(yàn)。
開(kāi)發(fā)板的出現(xiàn)只是遲早的,目前D1開(kāi)發(fā)板對(duì)標(biāo)樹(shù)莓派,想必出來(lái)后也可以運(yùn)行Linux的發(fā)行版,后期可以將其適配到各種Linux的發(fā)行版本上,在其進(jìn)行軟件生態(tài)建設(shè)也是一個(gè)不錯(cuò)的平臺(tái)。
原文標(biāo)題:搭建qemu RISC-V運(yùn)行Linux環(huán)境
文章出處:【微信公眾號(hào):嵌入式IoT】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
Linux
+關(guān)注
關(guān)注
87文章
11293瀏覽量
209340 -
RISC
+關(guān)注
關(guān)注
6文章
462瀏覽量
83711
原文標(biāo)題:搭建qemu RISC-V運(yùn)行Linux環(huán)境
文章出處:【微信號(hào):Embeded_IoT,微信公眾號(hào):嵌入式IoT】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論