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相关推荐

  1. qemu 规范路径_在 QEMU 上运行 RISC-V 64 位版本的 Linux

    前言 参考[参考 1]网页版 "Running 64- and 32-bit RISC-V Linux on QEMU"Running 64- and 32-bit RISC-V ...

  2. qemu 规范路径_EVE-NG镜像添加技巧(以思科虚拟化产品为例)

    EVE-NG 目录结构 EVE-NG平台可以使用 Dynamics(从GNS3继承).IOL(从WebIOU继承).QEMU 镜像等.镜像在部署时需要严格遵守目录和命名规则,后文会按照镜像的类别记录添 ...

  3. scp 命令 路径_基于SSH的文件传输:scp命令

    日常开发中,经常需要在服务器和本地之间进行文件传输.这里来介绍一种基于SSH的文件传输方法--scp命令 命令格式 scp(secure copy,remote file copy program), ...

  4. python 3d游戏记录路径_基于osg的python三维程序开发(五)------沿路径运动

    在上一节中, 我们演示了如何更新节点的状态, 这是动画的基本的技巧. 这一小节里,我们看一个稍微复杂一点的例子------让物体沿着固定的路径运动. 在osg 中,使得物体沿着固定路径运动, 会用到几 ...

  5. cmake 构建路径_基于CMake构建系统的MLIR Example扩展

    上一篇文章讲了把pybind11的示例程序嵌入到了MLIR的Example中,但是在构建的过程中有一定运气成分,并不知道具体是怎么通过CMake构建系统编译出的共享库文件.在分析了MLIR各层级的CM ...

  6. docker $PWD路径_基于Docker搭建Nacos集群

    准备机器3台 192.168.1.160 192.168.1.161 192.168.1.162 docker安装 CentOS 7下安装Docker及基础操作 安装 mysql 基于docker安装 ...

  7. bat文件指定jdk路径_配置点击就能运行Python程序的bat批处理脚本(Windows)

    0,需求说明 在编写和调试程序时,一般我们会在集成编辑环境里写代码和运行,但如果程序比较完善需要快速运行,或者让同事在其他电脑上快速运行时,再打开IDE(Integrated Development ...

  8. 计算机网络实验_三层架构企业网络_基于Cisco Packet Tracer模拟器

    三层架构企业网络_基于Cisco Packet Tracer模拟器 一.实验目的 1.了解一般企业网络的三层架构模型: 2.了解三层架构企业网络内部的通信流程: 3.理解双核心路由的热备份和负载均衡. ...

  9. 11 编译2022年最新的Linux kernel 6.1源码,并用QEMU模拟器运行

    编译2022年最新的Linux kernel源码,并用QEMU模拟器运行 作者 将狼才鲸 创建日期 2022-11-26 Gitee源码和工程地址:才鲸嵌入式 / 嵌入式QEMU教程 CSDN文章地址 ...

最新文章

  1. [BZOJ 2054]疯狂的馒头(并查集)
  2. 微信支付:小微商户申请入驻第二步:图片上传
  3. 区块链:新经济蓝图及导读
  4. 选择Data类型在Access与Sql中的区别
  5. 串行 spi Flash 跨页编程的注意点
  6. 常量、变量、数据类型
  7. 初学Java,如何成为年薪50万的程序员?
  8. win10查看pcie设备_壹拓网科技解密WIN10系统使用向日葵开机棒远程开机需要设置几个地方...
  9. python 文件写入多个参数_pandas 把数据写入txt文件每行固定写入一定数量的值方法...
  10. sqrt()函数的注意事项
  11. 继承Javadoc方法注释
  12. gitee如何搭建mysql_Windows基于gitee使用hexo搭建个人博客笔记
  13. KinedEditor特性
  14. 手把手式介绍 ADNI 影像数据下载
  15. GDPR 和个人信息保护的小知识
  16. VS2008创建C++项目
  17. 粘包问题和struck解决
  18. 人工智能守护青山绿水 内蒙古环保厅引入阿里云ET环境大脑
  19. soff被判3年,软件业是福是祸?
  20. 云平台车载终端开发项目日志

热门文章

  1. 深度学习基础1(神经网络)
  2. vba根据内容调整word表格_给你的word提速
  3. 计算机网络技术通识试题,超星计算机网络技术章节答案
  4. Rancher 2.0正式发布:简化、加速企业Kubernetes落地
  5. C#进阶系列——WebApi 异常处理解决方案
  6. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数...
  7. Geek爱旅行 - 穿越时间的旅行
  8. 一、spring mvc简介
  9. js 获取 本周、上周、本月、上月、本季度、上季度的开始结束日期
  10. PowerDesigner 16安装注意事项