qemu 规范路径_基于qemu-riscv64模拟器运行debian
Debian Port已經可以提供risc-v體系結構的軟件包集合[https://wiki.debian.org/RISC-V]。
以下記錄基于qemu模擬risc-v平臺環境并運行debian的過程。
宿主機環境
宿主機ubuntu18.04.1 LTS(x86_64),安裝自帶gcc編譯器和riscv64交叉編譯器。
apt install gcc-riscv64-linux-gnu gcc binutils
qemu
從官網下載并編譯riscv64模擬器
git clone https://git.qemu.org/git/qemu.git --depth 1
./configure --target-list=riscv64-softmmu
make
編譯后生成模擬器riscv64-softmmu/qemu-system-riscv64。
qemu包含一個稱為virt的虛擬平臺,通過參數-machine virt(或-M virt)指定使用該類型board以模擬riscv64平臺。
注:不必執行make install安裝,后面直接在qemu源碼根目錄下運行,以便于跟蹤調試qemu代碼。
risc-v opensbi
開源項目opensbi實現符合RISC-V SBI規范的固件firmware,以該firmware(64位)作為引導的第一級。
git clone https://github.com/riscv/opensbi.git --depth 1
make PLATFORM=generic CROSS_COMPILE=riscv64-linux-gnu- PLATFORM_RISCV_XLEN=64
用opensbi自帶的測試payload驗證qemu和opensbi有效性。
在qemu源碼根目錄下執行測試腳本:
./riscv64-softmmu/qemu-system-riscv64 -M virt -m 256M -nographic \
-kernel /root/gitQemu/opensbi/build/platform/generic/firmware/fw_jump.elf \
-device loader,file=/root/gitQemu/opensbi/build/platform/generic/firmware/payloads/test.bin,addr=0x80200000
結果顯示OpenSBI的啟動畫面,最后一行是測試payload(test.bin)的顯示信息”Test payload running”。
u-boot
編譯u-boot,作為引導的第二級。
注意:為了讓u-boot運行在supervisor mode,選擇配置qemu-riscv64_smode_defconfig
git clone https://gitlab.denx.de/u-boot/u-boot.git --depth 1
make qemu-riscv64_smode_defconfig CROSS_COMPILE=riscv64-linux-gnu-
make CROSS_COMPILE=riscv64-linux-gnu-
生成u-boot.bin。現在再次執行如下測試,驗證u-boot是否可以被正常啟動。
./riscv64-softmmu/qemu-system-riscv64 -machine virt -m 256M -nographic \
-kernel /root/gitQemu/opensbi/build/platform/generic/firmware/fw_jump.elf \
-device loader,file=/root/gitQemu/u-boot/u-boot.bin,addr=0x80200000 &
相對于OpenSBI自帶的測試,只是更改了-device loader,file=指定的路徑。
執行成功將會顯示u-boot的啟動信息,同時由于沒有指定根文件系統,最后會報告找不到啟動設備或網絡。
debian
從[https://people.debian.org/~gio/dqib/]找到Images for riscv64-virt,下載debian預編譯的鏡像。
解開壓縮包,包括三個文件image.qcow2,initrd和kernel:
其中image.qcow2是完整的debian根文件系統鏡像,initrd和kernel是鏡像中臨時啟動盤和內核的拷貝。
通過guestmount掛載該鏡像并查看其內容。需要安裝libguestfs-tools。
apt install libguestfs-tools
通過guestmount掛載該鏡像到/mnt目錄,可以查看或修改根文件系統內容,然后用guestunmount解除掛載。
guestmount -a image.qcow2 -m /dev/sda1 /mnt/
ls /mnt
guestunmount /mnt
導出FDT
下步啟動內核時需要FDT,從qemu導出。
執行如下腳本:
./riscv64-softmmu/qemu-system-riscv64 -nographic -machine virt,dumpdtb=qemu-virt.dtb -m 1G \
-kernel /root/gitQemu/opensbi/build/platform/generic/firmware/fw_jump.elf \
-device loader,file=/root/gitQemu/u-boot/u-boot.bin,addr=0x80200000 \
-object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-device,rng=rng0 \
-append "console=ttyS0 rw root=/dev/vda1" \
-device virtio-blk-device,drive=hd0 -drive file=/root/gitQemu/images/image.qcow2,format=qcow2,id=hd0 \
-device virtio-net-device,netdev=brnet0,mac=00:16:3e:09:3d:58 -netdev tap,id=brnet0,vhost=on,vnet_hdr=on &
其中起作用的是-machine virt,dumpdtb=qemu-virt.dtb
這樣就可以得到qemu自定義的board類型virt的二進制fdt文件qemu-virt.dtb。
構造FIT Image
用u-boot的命令行工具mkimage構造FIT Image并替換debian鏡像中的原內核文件vmlinux。
1. 編輯kernel_fdt.its
從u-boot/doc/uImage.FIT/kernel_fdt.its拷貝一份進行修改。
修改內容包括kernel的路徑、壓縮格式加載地址和入口地址,以及dtb的路徑。
修改后內容:
/*
* Simple U-Boot uImage source file containing a single kernel and FDT blob
*/
/dts-v1/;
/ {
description = "Simple image with single Linux kernel and FDT blob";
#address-cells = ;
images {
kernel {
description = "Linux kernel";
data = /incbin/("./kernel");
type = "kernel";
arch = "riscv";
os = "linux";
compression = "none";
load = ;
entry = ;
hash-1 {
algo = "crc32";
};
hash-2 {
algo = "sha1";
};
};
fdt-1 {
description = "Flattened Device Tree blob";
data = /incbin/("./qemu-virt.dtb");
type = "flat_dt";
arch = "riscv";
compression = "none";
hash-1 {
algo = "crc32";
};
hash-2 {
algo = "sha1";
};
};
};
configurations {
default = "conf-1";
conf-1 {
description = "Boot Linux kernel with FDT blob";
kernel = "kernel";
fdt = "fdt-1";
};
};
};
注意:文件中”./kernel”是從前述debian壓縮包中解壓得到的kernel文件路徑,”./qemu-virt.dtb”是上一步得到的FDT。另外,load和entry也是關鍵,分別指定了內核加載地址和執行入口地址,這里都是0x81a00000。
執行如下腳本制作FIT Image并替換鏡像中的vmlinux:
guestmount -a image.qcow2 -m /dev/sda1 /mnt/
# make sure that the vmlinux and qemu-virt.dtb are all in local directory
../u-boot/tools/mkimage -f ./kernel_fdt.its ./vmlinux-5.5.0-1-riscv64
# override old vmlinux-5.5.0-1-riscv64 in 'image.qcow2'
cp ./vmlinux-5.5.0-1-riscv64 /mnt/boot/vmlinux-5.5.0-1-riscv64
guestunmount /mnt
正式啟動debian linux
執行如下腳本,啟動qemu模擬riscv64平臺,運行debian:
./riscv64-softmmu/qemu-system-riscv64 -nographic -machine virt -m 1G \
-kernel /root/gitQemu/opensbi/build/platform/generic/firmware/fw_jump.elf \
-device loader,file=/root/gitQemu/u-boot/u-boot.bin,addr=0x80200000 \
-object rng-random,filename=/dev/urandom,id=rng0 -device virtio-rng-device,rng=rng0 \
-append "console=ttyS0 rw root=/dev/vda1" \
-device virtio-blk-device,drive=hd0 -drive file=/root/gitQemu/images/image.qcow2,format=qcow2,id=hd0 \
-device virtio-net-device,netdev=net0,mac=52:54:00:12:34:58 -netdev user,id=net0
與上次執行命令行的區別僅僅是”-machine virt”后面沒有指定dumpdtb。
Debian啟動之后,用root登錄,口令為root。
由于網絡類型為user mode,ICMP被禁止,所以無法用ping命令。
直接執行apt測試網絡:
apt update
注意:默認的sources.list使用域名deb.debian.org,如果不通,可以更換為鏡像ftp.de.debian.org或ftp.kr.debian.org。
總結
以上是生活随笔為你收集整理的qemu 规范路径_基于qemu-riscv64模拟器运行debian的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 橙光游戏《师兄别这样!》攻略04-26
- 下一篇: 张学友最好听的一首歌