当前位置: 首页 > news >正文

TinyEMU编译与使用

TinyEMU编译与使用

  • 1 介绍
  • 2 准备工作
  • 3 编译TinyEMU
    • 3.1 安装依赖库
    • 3.2 编译
  • 4 运行TinyEMU
    • 4.1 在线运行
    • 4.2 离线运行
  • 5 共享目录
    • 5.1 修改root_9p-riscv64.cfg
    • 5.2 启动TinyEMU
    • 5.3 执行挂载命令
  • 6 TinyEMU命令帮助

1 介绍

原名为riscvemu,于2018-09-23,改为TinyEMU。

TinyEMU是Fabrice Bellard写的一个RISC-V和X86模拟器,它的目的是小而简单,同时又完整。Fabrice Bellard正是开发鼎鼎大名QEMU的作者。
官网:https://bellard.org/tinyemu/

主要特点:

  • 支持RV128IMAFDQC基本ISA(用户级ISA版本2.2,特权架构版本1.10)的RISC-V系统仿真器包括:
  • 32/64/128位整数寄存器
  • 32/64/128位浮点指令(使用SoftFP库)
  • 压缩指令
  • 动态XLEN变化
  • 基于KVM的x86系统仿真器
  • 虚拟控制台、网络、块设备、输入和9P文件系统
  • 带SDL的图形显示
  • JSON配置文件
  • 远程HTTP块设备和文件系统
  • 代码小,易于修改,外部依赖性少
  • Javascript版本运行Linux和Windows 2000。

2 准备工作

通过官网,下载以下内容。

  • TinyEMU源码:tinyemu-2019-12-21.tar.gz
  • RISC-V boot loader、Linux kernel、filesystem:diskimage-linux-riscv-2018-09-23.tar.gz

3 编译TinyEMU

本文环境为Ubuntu 20.04。

3.1 安装依赖库

需要安装 libcurl、OpenSSL 和 SDL 库,TinyEMU源码对这些库函数有依赖。

以下为,其他情况,可忽略。

  • 如果环境中实在缺少这些库,也可以通过注释掉Makefile中的CONFIG_FS_NET或CONFIG_SDL,来编译TinyEMU。
  • 如果在32位主机上编译,可以通过编辑Makefile,以禁止编译为128位目标(对于生成128位RISCV目标,编译器必须支持__int128 C扩展)。

3.2 编译

进入源码目录tinyemu-2019-12-21中,编译TinyEMU源码:

make

编译成功,可执行程序为temu。
也可以选择,通过以下命令,将temu程序,安装到 /usr/local/bin 系统路径下:

make install

编译时,若报错:“fatal error: curl/multi.h: No such file or directory”
原因:缺少libcurl库
解决办法:sudo apt-get install libcurl4-openssl-dev,安装libcurl。

4 运行TinyEMU

根据RISC-V boot loader、Linux kernel、filesystem文件获取方式的不同,TinyEMU可以有2种运行方式:

  • 在线运行(无需下载);
  • 离线运行。

4.1 在线运行

在官网https://bellard.org/jslinux/index.html,有如下OS镜像:
在这里插入图片描述
图中标识,表示在riscv64 CPU运行的,不带图形界面的Linux Kernel系统,这样环境的TinyEMU配置文件,在“TEMU Config”列的“url”链接处。打开后,如下所示:
在这里插入图片描述
buildroot-riscv64.cfg文件中,记录了RISC-V boot loader、Linux kernel、filesystem这些文件的名称及路径配置。
因此,我们可通过如下命令,在线加载相关文件:

./temu https://bellard.org/jslinux/buildroot-riscv64.cfg

需要等待几分钟,加载快慢,取决于网络环境。
linux内核加载,并启动完成,如下所示:
在这里插入图片描述
打印Welcome信息,当前目录下有hello.c,我们使用gcc hello.c -o hello编译,可能也需要等一会。
在这里插入图片描述
编译与执行成功,说明linux内核,已经在TinyEMU上成功跑起来了。
上述列表中,其他OS也可以通过这样的方式,运行起来,这里不再赘述。

4.2 离线运行

在准备工作中,我们下载的diskimage-linux-riscv-2018-09-23.tar.gz文件,这里才发挥作用。

解压后,如下内容:
在这里插入图片描述
该目录下,有RISC-V boot loader、Linux kernel、filesystem等文件,这次,我们使用root-riscv64.cfg配置文件。

将可执行程序temu,拷贝至diskimage-linux-riscv-2018-09-23目录下,然后执行:

./temu -ctrlc root-riscv64.cfg

-ctrlc,参数表示可以使用Ctrl+C快捷键,退出模拟器;未加此选项的话,Ctrl+C无效。

非常快,秒进OS,如下所示:
在这里插入图片描述
随便执行几条命令,如下所示:
在这里插入图片描述
说明linux内核,已经在TinyEMU上成功运行。

5 共享目录

TinyEMU中运行的linux虚拟机,如何与TinyEMU所在的主机,进行文件共享和传输呢?

TinyEMU也是支持的,主要有以下三个步骤。

5.1 修改root_9p-riscv64.cfg

官方提供的root_9p-riscv64.cfg,文件内容,如下:

/* VM configuration file */
{version: 1,machine: "riscv64",memory_size: 128,bios: "bbl64.bin",cmdline: "console=hvc0 root=/dev/vda rw",drive0: { file: "root-riscv64.bin" },/* Also access to the /tmp directory. Use mount -t 9p /dev/root /mntto access it. */fs0: { tag: "/dev/root", file: "/tmp" },eth0: { driver: "user" },
}

需在bios行后,添加内容kernel: "kernel-riscv64.bin",

5.2 启动TinyEMU

然后,再启动TinyEMU:

./temu -ctrlc root_9p-riscv64.cfg

如果未按上述要求,修改cfg文件,则启动时,会报如下错误:
在这里插入图片描述

5.3 执行挂载命令

在TinyEMU中执行的linux虚拟机(Guest)上,执行挂载命令:

mount -t 9p /dev/root /mnt

到此,主机(Host)上的 /tmp 目录下内容,在linux虚拟机的 /mnt 中已经可见了。

基于此功能,可在Host和Guest之间,传输文件。

6 TinyEMU命令帮助

TinyEMU命令使用形式,如下所示:

temu [options] config_file

其各项参数含义,如下所示:

  • options可为以下任一或多个选项。
    • -m ram_size:设置内存大小,单位为MB
    • -rw:允许对磁盘镜像(default=snapshot)进行写访问,打开之后,在虚拟机中对文件系统做的修改,可以被保存(比如,保存到root-riscv64.bin中),下次启动后,该修改依然存在。
    • -ctrlc:拦截Ctrl+C按键,以便退出TinyEMU模拟器
    • -append cmdline:将cmdline附加到内核命令行
    • -no-accel:禁用虚拟机加速(仅限KVM、x86机器)
    • -h:打印帮助信息
  • config_file为*.cfg文件名。

更多帮助信息,可参考diskimage-linux-riscv-2018-09-23和tinyemu-2019-12-21目录下的readme.txt,以及官网。

相关文章:

  • 二分以及练习题目
  • wordpress外贸独立站
  • laravel-admin 头部添加操作
  • openssl3.2 - exp - 产生随机数
  • 本地部署websocket服务端并结合内网穿透实现固定公网地址连接
  • 文本溢出隐藏 显示省略号,鼠标悬浮展示 el-tooltip(TooltipIsShowMixin封装)
  • 智能驾驶规划控制理论学习07-规划算法整体框架
  • Ps:历史记录面板
  • 前端常见的安全问题以及处理措施
  • STC89C52串口通信详解
  • 虚拟化相关面试题集锦(1)—— 如何在QEMU/KVM中跑通AI相关训练
  • docker安装php7.4安装(swoole)
  • Qt 类的前置声明和头文件包含
  • 【MATLAB源码-第157期】基于matlab的海马优化算法(SHO)机器人栅格路径规划,输出做短路径图和适应度曲线。
  • Redis(5.0)
  • @jsonView过滤属性
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Bootstrap JS插件Alert源码分析
  • const let
  • JDK9: 集成 Jshell 和 Maven 项目.
  • PHP CLI应用的调试原理
  • PHP的Ev教程三(Periodic watcher)
  • Promise初体验
  • python docx文档转html页面
  • 阿里云应用高可用服务公测发布
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 首页查询功能的一次实现过程
  • 微服务入门【系列视频课程】
  • 详解移动APP与web APP的区别
  • 由插件封装引出的一丢丢思考
  • 自定义函数
  • #13 yum、编译安装与sed命令的使用
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #每日一题合集#牛客JZ23-JZ33
  • #在 README.md 中生成项目目录结构
  • $$$$GB2312-80区位编码表$$$$
  • (2020)Java后端开发----(面试题和笔试题)
  • (二)丶RabbitMQ的六大核心
  • (算法)求1到1亿间的质数或素数
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)Sql Server 保留几位小数的两种做法
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .Net6 Api Swagger配置
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .Net转前端开发-启航篇,如何定制博客园主题
  • /var/lib/dpkg/lock 锁定问题
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @EnableConfigurationProperties注解使用
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [C++随笔录] 红黑树
  • [ccc3.0][数字钥匙] UWB配置和使用(二)
  • [CF]Codeforces Round #551 (Div. 2)
  • [CF543A]/[CF544C]Writing Code
  • [CQOI 2011]动态逆序对