qemu bosc-kmh hvisor

hvisor 更改为单核

qemu参数 smp 改为1

const.rs 中的 MAX_CPU_NUM 改为1

qemu_riscv64.rs 中的

pub const ROOT_ZONE_CPUS: u64 = (1 << 0);

修改: hvisor的二阶段映射

//src/arch/riscv64/s2pt.rs
        attr |= Self::VALID | Self::USER | Self::ACCESSED | Self::DIRTY;//stage 2 page table must user

编译linux内核

git clone git@gitlab.bosoc.cc:openxiangshan/riscv-linux.git	# 下载源码仓库
git checkout -b devel origin/devel	# 切换分支到devel
# 注意: 发人员请基于上述主开发分支devel最新的HEAD进行开始工作
export CROSS_COMPILE=riscv64-unknown-linux-gnu-	# 指定编译器文件前缀
export ARCH=riscv  # 指定架构

export PATH=$PATH:/home/ran/toolchain/gcc12/riscv-toolchain-20230425/bin # 工具链路径  
make distclean	# 清理旧的编译产物, 此命令会导致重新编译所有文件, 请酌情使用
make defconfig xiangshan.config # 编译生成.config
gedit .config
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="~/fdisk/kvm/rootfs_kvm_riscv64.cpio"
make

包含文件系统的 Image 打包到 hvisor.bin 中​

打包完成后的fw_payload.bin有250M,更改内存布局缩小到78M

// config
#[link_section = ".img1"]
#[used]
pub static GUEST1_KERNEL: [u8; include_bytes!("../images/riscv64/kernel/Image").len()] =
    *include_bytes!("../images/riscv64/kernel/Image");
#[link_section = ".dtb1"]
#[used]
pub static GUEST1_DTB: [u8; include_bytes!("../images/riscv64/devicetree/linux.dtb").len()] =
    *include_bytes!("../images/riscv64/devicetree/linux.dtb");
    . = . + 0x2000000;
    gdtb = .;
    . = 0x82000000;
    .dtb1 : {
        KEEP(*(.dtb1))
    }
    . = ALIGN(4K);
    . = 0x83000000;
    .img1 : {
        KEEP(*(.img1))
    }

按照linker脚本和kmh_v2_1core.dtb的内容,修改内存布局,PLIC,串口配置

//src/platform/qemu_riscv64.rs
pub const ROOT_ZONE_DTB_ADDR: u64 = 0x82000000;
pub const ROOT_ZONE_KERNEL_ADDR: u64 = 0x83000000;
pub const ROOT_ZONE_ENTRY: u64 = 0x83000000;
pub const ROOT_ZONE_CPUS: u64 = 1 << 0;
...
pub const ROOT_ZONE_MEMORY_REGIONS: [HvConfigMemoryRegion; 2] = [
    HvConfigMemoryRegion {
        mem_type: MEM_TYPE_RAM,
        physical_start: 0x81000000,
        virtual_start: 0x81000000,
        size: 0x08000000,
    }, // ram
    HvConfigMemoryRegion {
        mem_type: MEM_TYPE_IO,
        physical_start: 0x310b0000,
        virtual_start: 0x310b0000,
        size: 0x10000,
    }, // serial
];

将hvisor.bin 嵌入opensbi fw_payload

FPGA上运行时,使用打包好的软件镜像opensbi fw_payload运行

	cd ~/source/opensbi && \
	make PLATFORM=generic \
    	FW_PAYLOAD_PATH=/home/dorso/work/hvisor/target/riscv64gc-unknown-none-elf/debug/hvisor.bin \
		FW_FDT_PATH=/home/dorso/source/opensbi/kmh-v2-1core.dtb

qemu bosc-kmh运行

QEMU := ~/source/qemu-devel/build/qemu-system-riscv64
# bosc的cpu不手动指定
QEMU_ARGS := -machine bosc-kmh
QEMU_ARGS += -nographic
QEMU_ARGS += -smp 1
QEMU_ARGS += -m 2G
# 指定制作好的fw_payload作为bios
QEMU_ARGS += -bios ~/source/opensbi/build/platform/generic/firmware/fw_payload.elf

FPGA 运行 hvisor

在opensbi目录下

./bin2fpgadata -i build/platform/generic/firmware/fw_payload.bin

执行成功后生成的软件镜像文件data.txt位于当前源码根目录

source /home/tools/Xilinx/Vivado/2020.2/settings64.sh
# 确认与FPGA相连的Linux 服务器已经通过上述source命令并执行了hw_server命令以启动相关服务, 然后本x86_64 Linux 电脑将使用下述命令中tcl脚本与后台服务器建立通信
vivado -mode batch -source ../onboard-ai1-fpga81-remote.tcl -tclargs <path to bitstream files>/  ./data.txt

其中<path to bitstream files>为使用的硬件镜像路径