qemu 对 ARMv8的支持

2023-10-31

qemu 可以支持 ARMv8 
且支持的 boot 包括
	1. 从 ATF启动
	2. 从 UEFI启动
	3. 从 u-boot启动
	4. 从 linux 启动
这里打算用以下平台 qemu-system-aarch64 -M virt -cpu 

qemu virt 平台 // https://qemu.readthedocs.io/en/latest/system/arm/virt.html
	1.硬件平台
		1. 可配置项
			1. cpu微架构,个数 // cortex-a53/57/72 // many CPUs (up to 512 if using a GICv3 and highmem)
			2. 内存大小  // large amounts of RAM (at least 255GB, and more if using highmem)
			3. flash镜像 // -bios xxx , xxx 被装在到 flash 0x0000 0000 开始的地方
			4. RAM 镜像  // -drive if=pflash,format=raw,index=1,file=flash.img // flash.img 装在到 0x4000 0000 的地方
		2. 不可配置项 
			1. Flash memory starts at address 0x0000_0000 , 支持 XIP ,可配置
			2. RAM starts at 0x4000_0000
			3. One PL011 UART
			4. 其他配置项
				All other information about device locations may change between QEMU versions, so guest code must look in the DTB.
				qemu-system-aarch64 -machine virt,dumpdtb=virt.dtb -cpu cortex-a57 -smp 1 -m 2G -nographic
	2.boot
		QEMU supports two types of guest image boot for virt, and the way for the guest code to locate the dtb binary differs:
			1.For guests using the Linux kernel boot protocol (this means any non-ELF file passed to the QEMU -kernel option) 
				the address of the DTB is passed in a register (r2 for 32-bit guests, or x0 for 64-bit guests)
			2.For guests booting as “bare-metal” (any other kind of boot)
				the DTB is at the start of RAM (0x4000_0000) // 类似 u-boot.bin 或者 UEFI.bin

  • qemu 的boot
qemu-system-aarch64 -M virt -cpu cortex-a57 -nographic -smp 4
qemu-system-aarch64 支持bios ,但是必须显式设置,否则不使用bios
但是qemu-system-aarch64 在 不显式设置 bios 的时候,会去看share/qemu/efi-virtio.rom 是否为存在,是否为空,如果存在且不空, 才可正常走下去.否则,会自动结束
但是qemu-system-aarch64 并不会 读 share/qemu/efi-virtio.rom 中的内容

share/qemu/efi-virtio.rom 的格式
	bin/../share/qemu/efi-virtio.rom: BIOS (ia32) ROM Ext. (135*512)
	// aarch64-linux-gnu-objdump  -D -b binary -m aarch64  efi-virtio.rom   > efi-virtio.asm
	// 但是好像 efi-virtio.asm 并不像代码


不显式设置-bios // 例如-kernel xxx.elf
	直接跑kernel
-bios none 
	不支持
-bios xxx.bin
	 会去找 xxx.bin 文件,并以其为 bios 运行
	-bios QEMU_EFI.fd // 从UEFI启动
	-bios u-boot.bin // 从U-boot 启动

qemu-system-aarch64/qemu-system-x86/qemu-system-riscv64 都有自己的 bios // 对应不显示 传入 "-bios xxx" 的情况
对应 arm64 virt板 来说是  不跑bios
对应 x86 来说是 UEFI.fd ? // TODO
对应 rv 来说 是 opensbi-riscv64-generic-fw_dynamic.bin
// -kernel选项 ,如果有则跑完(或不跑)bios,就跑kernel, 目前不知道 bios 和 kernel 是怎么衔接的
-kernel  xxx.elf // 跑完不跑bios只跑xxx.elf
  • qemu从UEFI启动
UEFI + ubuntu-16.04.3-server-arm64.iso
	http://doc.okbase.net/69908250/archive/258251.html
	https://blog.csdn.net/chenxiangneu/article/details/78955462

// ubuntu-16.04.3-server-arm64.iso 是ubuntu 官方发布的镜像文件
// 这种方式 是 一种 安装系统的方式,类似于 X86的系统安装
// ubuntu-16.04.3-server-arm64.iso 中有 u-boot ,kernel ,rootfs
// 这种启动方式, 第一个启动代码是 UEFI
// 启动流程 UEFI -> grub -> kernel -> rootfs

我之前搭好了一个从 UEFI 启动的平台 : https://blog.csdn.net/u011011827/article/details/120601147

qemu-system-aarch64 \
    -M virt \
    -cpu cortex-a57  -smp 1 \
    -m 1024M \
    -bios QEMU_EFI.fd \
    -drive if=none,file=xenial-server-cloudimg-arm64-uefi1.img,format=qcow2,id=hd0 -device virtio-blk-device,drive=hd0 \
    -netdev user,id=hostnet0,hostfwd=tcp::2222-:22 -device virtio-net-device,netdev=hostnet0 \
    -nographic

  • qemu从U-Boot启动

// 这种启动方式,要手动制作 u-boot , kernel , rootfs
// 这种启动方式, 第一个启动代码是 u-boot
// 启动流程 u-boot -> kernel -> rootfs

qemu virt 的启动有没有参考资料???
// 为什么可以从
我们探索从 u-boot 启动 ,可参考 https://stdrc.cc/post/2021/02/23/u-boot-qemu-virt/

qemu-system-aarch64  \
    -M virt \
    -cpu cortex-a57 -smp 1 \
    -m 2G \
    -bios u-boot.bin \
    -drive if=pflash,format=raw,index=1,file=flash.img \
    -nographic

  • 默认
从 EL1 boot
  • 虚拟化
-machine virt,virtualization=on
  • 安全
使用QEMU(3.0版本以上)模拟一个arm64 virt平台,virt平台上有两个cfi flash。
	// -machine virt,secure=on

启动过程为 : BootRom(BL1) 从Flash1 FIP中加载BL2,BL2再加载BL3, BL33(u-boot)

Flash0当成Boot使用,用于烧录 ATF(arm trust firmware)的BL1; 
	// -bios bl1.bin
Flash1上 用于烧录 格式为ATF FIP的Image 
	// 包含了BL2,BL31,BL33(uboot)
	// 注意 : BL33 可以为 Image ,即 不需要 uboot 的参与
	// BL33 在 ATF 配置为 ARM_LINUX_KERNEL_AS_BL33 是 Image 
	// 注意 : BL33 也可以为 QEMU_EFI.fd
	// QEMU_EFI.fd 可以完全替代 u-boot ,即 QEMU_EFI.fd 直接加载 Image

qemu-system-aarch64

-machine virt,secure=xxx 和 -machine virt,virtualization=yyy 的关系
总结:
	virtualization 可单独存在
	secure 存在时, virtualization 必须存在

在这里插入图片描述

在这里插入图片描述

$ qemu-system-aarch64  -machine virt,help  
virt-6.1-machine options:
  acpi=<OnOffAuto>       - Enable ACPI
  append=<string>        - Linux kernel command line
  confidential-guest-support=<link<confidential-guest-support>> - Set confidential guest scheme to support
  default_bus_bypass_iommu=<bool> - Set on/off to enable/disable bypass_iommu for default root bus
  dt-compatible=<string> - Overrides the "compatible" property of the dt root node
  dtb=<string>           - Linux kernel device tree file
  dump-guest-core=<bool> - Include guest memory in a core dump
  dumpdtb=<string>       - Dump current dtb to a file and quit
  firmware=<string>      - Firmware image
  gic-version=<string>   - Set GIC version. Valid values are 2, 3, host and max
  graphics=<bool>        - Set on/off to enable/disable graphics emulation
  highmem=<bool>         - Set on/off to enable/disable using physical address space above 32 bits
  initrd=<string>        - Linux initial ramdisk file
  iommu=<string>         - Set the IOMMU type. Valid values are none and smmuv3
  its=<bool>             - Set on/off to enable/disable ITS instantiation
  kernel=<string>        - Linux kernel image file
  mem-merge=<bool>       - Enable/disable memory merge support
  memory-backend=<string> - Set RAM backendValid value is ID of hostmem based backend
  memory-encryption=<string> - Set memory encryption object to use
  mte=<bool>             - Set on/off to enable/disable emulating a guest CPU which implements the ARM Memory Tagging Extension
  phandle-start=<int>    - The first phandle ID we may generate dynamically
  ras=<bool>             - Set on/off to enable/disable reporting host memory errors to a KVM guest using ACPI and guest external abort exceptions
  secure=<bool>          - Set on/off to enable/disable the ARM Security Extensions (TrustZone)
  smp=<SMPConfiguration> - CPU topology
  suppress-vmdesc=<bool> - Set on to disable self-describing migration
  usb=<bool>             - Set on/off to enable/disable usb
  virtualization=<bool>  - Set on/off to enable/disable emulating a guest CPU which implements the ARM Virtualization Extensions
  x-oem-id=<string>      - Override the default value of field OEMID in ACPI table header.The string may be up to 6 bytes in size
  x-oem-table-id=<string> - Override the default value of field OEM Table ID in ACPI table header.The string may be up to 8 bytes in size
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qemu 对 ARMv8的支持 的相关文章

  • RS485收发切换多0x00数据影响bootload升级程序

    串口升级使用RS485接口 RS485收发切换多0x00数据 部分有问题电路板在app程序中输入调试指令有响应 app通过ULINK下载 而使用ymodem在bootloader中升级程序失败 通过printf打印捕捉到数据包头多0x00数

随机推荐

  • 【机器学习】支持向量机SVM - 对SVM与核函数的理解及sklearn参数详解

    支持向量机是在深度学习流行开来之前 性能表现最好的一种机器学习方法 在看这篇blog之前 默认读者已经有了对支持向量机的基本概念的认识 一 支持向量机的进一步理解 支持向量机的优化目标在逻辑回归优化目标基础上进一步产生的 具体优化目标不说了
  • web标准化设计:常用的CSS命名规则

    头 header 内容 content container 尾 footer 导航 nav 侧栏 sidebar 栏目 column 页面外围控制整体布局宽度 wrapper 左右中 left right center 登录条 loginb
  • (二) three.js 导入模块

    导入模块 目录结构 示例 First html 导入three js 的模块 script 标签导入模块 红色框是导入three js 下面绿色框就不用加type module Import导入模块 同样注意红色框和绿色框的对应关系
  • es6面试题

    1 es5和es6的区别 说一下你所知道的es6 ECMAScript5 即ES5 是ECMAScript的第五次修订 于2009年完成标准化ECMAScript6 即ES6 是ECMAScript的第六次修订 于2015年完成 也称ES2
  • 常见的通讯协议总结(USART、IIC、SPI、485、CAN)

    目录 一 通讯的基本概念 1 串行通讯 2 并行通讯 3 串行通讯与并行通讯对比 4 传输模式 单工 半双工 全双工 二 USART 串口通讯 1 物理层 2 协议层 1 波特率 2 起始和停止信号 3 有效数据 4 数据校验 2 异步串行
  • 使用CSMA/CD协议一个计算题

    题干 首先计算一下A这个以太网所容许的最短的帧它的发送帧的长度时间为 8 前同步码为8 64 最短帧长 8 单位转换b到B 576比特 有关于单位转换 B是Byte的缩写 B就是Byte 也就是字节 Byte b是bit的缩写 b就是bit
  • 理解高内聚低耦合

    低耦合 耦合就是元素与元素之间的连接 感知和依赖量度 这里说的元素即是功能 对象 系统 子系统 模块 例如 现在有方法A和方法B 我们在A元素去调用B元素 当B元素有问题或者不存在的时候 A元素就不能正常的工作 那么就说元素A和元素B耦合
  • 【数据结构】实验六:图论

    文章目录 7 1 邻接矩阵表示法创建无向图 参考代码 代码解析 7 2 邻接表创建无向图 参考代码 代码解析 7 3 图深度优先遍历 参考代码 代码解析 7 4 单源最短路径 参考代码 代码解析 7 5 列出连通集 参考代码 代码解析 7
  • 在Servlet中使用开源fileupload包实现文件上传功能

    当我们在 HTML 表单中选择本地文件之后点击 提交 按钮则会将文件上传到服务器中 此时该 HTTP 请求正文的数据类型就是 multipart form data 型的 而在 Servlet 技术中 该 HTTP 请求会被 Servlet
  • 在Windows上使用clang编译器

    在Stackoverflow等网站上 经常出现各种编译器的对比的结果 其中clang是很常见的 那么 怎样在Windows上使用clang呢 没那么直观 直接去llvm官网上下载clang的发行包 解压 到bin下面 看到应该是我们想要的工
  • QTreeWidget实现的树形节点的添加+双击响应+删除详解

    承接该文http blog csdn net bzhxuexi article details 10054289 在该文基础上继续讲解QTreeWidget控件的使用 同时解决该文最后留下的问题 QTreeWidget是实现树形结构的类 在
  • 微信小程序map组件路线规划,腾讯地图sdk的应用案例

    腾讯地图WebService API 是基于HTTPS HTTP协议的数据接口 开发者可以使用任何客户端 服务器和开发语言 按照腾讯地图WebService API规范 按需构建HTTPS请求 并获取结果数据 目前支持JSON JSONP方
  • stm32f103单片机—编码器测速

    一 涉及资源 stm32f103ZET6开发板 非指定 MG513P3012V型号电机 带霍尔编码器 非指定 二 涉及概念 1 单片机资源要求 此种测速方法要求单片机的定时器具有编码器模式 对于stm32f1系列 具备编码器模式的定时器有T
  • mysql a foreign key constraint fails_MySQL删除表:Cannot delete or update a parent row: a foreign key co...

    MySQL库中有俩表 table1和table2 相互关联 在删除表的时候出错 Cannot delete or update a parent row a foreign key constraint fails 很明显这是表关联生成的强
  • MATLAB APP纯小白入门 两数相加

    万事开头难 最怕第一次 使用matlab APP 实现两数求和 如下图所示 c a b 输入数字后 按 就计算 步骤 拖拽三个 Edit Field Numeric 过来 并且双击名字分别改为 a b c 注意修改名字后右边会有点变化 程序
  • 标准二阶响应--佛朗哥

    如果一个电路对任何有界输入在响应中产生一个有界的输出 就说明这个电路是稳定的 判断一个电路是否稳定一种方法是将某些能量注入到它的电抗元件中的一个或者多个 然后在没有任何外加电源的情况下观察这个电路是如何作为的 这种情况下的响应为无源或者自然
  • STM32F103 GPIO输出模式2MHz,10MHz,50MHz波形对比

    在STM32F103中GPIO的输出模式有三种速度配置 如图所示 经过测试发现 这三种速度的输出模式与IO的翻转频率没有关系 它们影响的可能是驱动能力 下面是在IO极限频率 18MHz 下 三种模式的波形
  • bootstrap实现轮播图

    div class carousel slide style width 400px margin 30px auto ol class carousel indicators li class active li li li ol div
  • 数据库类型区分

    数据库类型主要可分为 网状数据库 Network Database 关系数据库 Relational Database 树状数据库 Hierarchical Database 面向对象数据库 Object oriented Database
  • qemu 对 ARMv8的支持

    qemu 可以支持 ARMv8 且支持的 boot 包括 1 从 ATF启动 2 从 UEFI启动 3 从 u boot启动 4 从 linux 启动 这里打算用以下平台 qemu system aarch64 M virt cpu qem