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,以及官网。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/724422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mapbox鼠标滑到气泡中不关闭气泡。

贴个群号 WebGIS学习交流群461555818,欢迎大家 效果图 像官网这样的例子,我们并不能鼠标移动到上面的popup内容中,但是有时候是有这样的需求的,比如复制里面的值,或者里面加个按钮,可以点击出现弹窗&…

Vue3:使用setup实现组合式开发

一、情景说明 首先,我们应该知道,Vue3中,可以用Vue2的语法,进行配置式开发。 在这里,我们用Vue3的新语法,实现组合式开发 二、案例 1、组件中使用setup代替Vue2中的data、methods等vc配置项 关键配置&a…

declare 模块声明

示例代码: declare module *.css; declare module *.less; declare module *.png;这些代码行是 TypeScript 的模块声明,用于告诉 TypeScript 编译器如何处理某些类型的模块导入。TypeScript 是一种基于 JavaScript 的静态类型检查语言,它允许…

STM32(19)I2C模块 主机发数据

发送数据: 等待空闲: 发送起始位: 发送地址: 发送数据:

鸿蒙中Text组件的展开和收起效果

前言: DevEco Studio版本:4.0.0.600 效果: 原理分析: 通过效果图我们知道,可以将‘...展开’ 盖在文本内容的的右下角来实现这个效果。那么要实现盖上的效果可以通过层叠布局(Stack)来实现&am…

基于ceph-deploy部署Ceph 集群

Ceph分布式存储一、存储基础1、单机存储设备1.1 单机存储的问题 2、分布式存储(软件定义的存储SDS)2.1 分布式存储的类型 二、Ceph简介1、Ceph优势2、Ceph架构3、Ceph 核心组件4、OSD 存储后端5、Ceph 数据的存储过程6、Ceph 版本发行生命周期 三、Ceph 集群部署1、 基于 ceph-…

【Vue3】Ref 和 ShallowRef 的区别

目录 什么是 Ref什么是 ShallowRef区别对比示例代码 什么是 Ref Ref 是 Vue 3 中的一个新的基本响应式数据类型,它允许我们包装任意的 JavaScript 值,并且在数据变化时发出通知。Ref 提供了一个 .value 属性来访问其内部的值,同时还提供了一…

【前端捉鬼记】记录两个js中非常基础的小白问题

写逻辑时,遇到两个js代码里非常基础的小白问题,用简单的代码测试并记录一下: 1、一个对象 a 有个数组类型的属性 b,将这个数组取出保存到另一个变量 m,修改 m,对象 a 中的属性 b 是否跟随变化?…

【Java EE初阶二十七】深入了解cookie

1. 简单了解cookie Cookie是http请求里header 中的一个属性,浏览器持久化存储数据的一种机制,网页无法访问主机的文件系统,要想存储数据就得通过其他的方式; 且cookie中保存的数据也是键值对的形式,最终还是要把这个键…

移动开发:网格视图

一、在新建GridView模块下添加图片以及创建cell.xml文件 1.粘贴图片时选择红框中的路径,点击“OK” 2.在路径后添加-mdpi后缀,再点击“OK” 二、相关代码块 1.MainActivity.java文件代码 package com.example.gridview;import androidx.appcompat.app.AppCompatAc…

供应链优化:降本增效的核心战略——张驰咨询

在当今这个高度竞争的商业环境中,企业为了保持竞争力,不断寻求降低成本和提升效率的策略变得至关重要。有效的成本控制和效率提升不仅能够增加企业的利润率,还能增强其市场地位和客户满意度。以下是一些实用的策略,旨在帮助企业实…

HCIE之MPLS练习(六)

MPLS练习 一、静态LSP1、IGP构建FEC2、全网运行MPLS3、打通LSP通道3.1、静态LSP配置3.2、转发过程3.3、验证标签转发过程 4、利用LSP传递任意流量4.1、配置4.2、验证 二、LDP协议1、IGP构建FEC2、全网运行mpls、ldp3、mpls ldp邻居关系、LIB表4、转发过程5、验证mpls转发过程6、…

从嵌入式Linux到嵌入式Android

最近开始投入Android的怀抱。说来惭愧,08年就听说这东西,当时也有同事投入去看,因为恶心Java,始终对这玩意无感,没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业,所以只能回过头又来学。 首先还是…

leetcode——异或运算—— 只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : 输入&#xff…

Python(NetOps)前传-网络设备开局配置

背景 我们知道用Python在cli配置网络设备的前提是: 网络设备与Python主机网络可达网络设备已开启并完成ssh相关配置 目标 本文已华为S5720S-52P-LI-AC交换机为例,完成: 完成网络设备开局配置;用Python脚本验证ssh登录 配置 …

深入理解nginx负载均衡round-robin算法

目录 1. 概述2. 如何启用round-robin算法3. 初始化round-robin算法3.1 设置算法上下文环境初始化回调函数3.2 加载服务器列表4. 初始化负载均衡请求上下文5. 获取peer6. 释放peer1. 概述 nginx为我们提供了强大的HTTP代理功能,而负载均衡算法是实现后端多Real Server代理的一个…

系统认识数据分析

数据分析的全貌 包括应用、观测和实验 观测 分为两部分观察和测量 观察 采集数据: 解析系统日志 : 产生日志、解析日志、得到数据 埋点获取新数据 :日志记录新信息、解析日志、得到新数据 通过传感器收集:例如天气数据收集 爬虫&…

uniapp——信号值组件(vue3)

组件代码 <template><view><view class"signals"><view v-for"(item, index) in signals" :key"index" class"signal" :style"item"></view></view></view> </template>&…

ros2+nav2中常用的概念

一.sdf文件 Simulation Description File&#xff0c;描述Gazebo中机器人模型的文件&#xff0c;一般在models文件夹下。该文件描述了组成机器人的物理属性、关节、碰撞对象、视觉效果和插件的集合。 Links: 链接包含模型的一个实体的物理属性。 这可以是一个轮子&#xff0c…

Android工程师必备知识,2024Android面试

前言 职场的金九银十跳槽季火热进行中&#xff0c;不同的是&#xff0c;今年的竞争比往年会更加激烈一些&#xff0c;形式更加严峻一些。 对于求职者来说&#xff0c;面试是一道坎&#xff0c;很多人会恐惧面试&#xff0c;即使是工作很多年的老鸟&#xff0c;也可能存在面试…