Arm-v8/v9虚拟化原理---aarch64_virtualization_guide

news2024/12/25 12:49:07

一、相关参考(请仅参考,任意一篇足矣)

1.https://www.cnblogs.com/LoyenWang/p/13584020.html

2.https://zhuanlan.zhihu.com/p/470045640

3.万字剖析 Armv8 架构虚拟化-腾讯云开发者社区-腾讯云

4.https://zhuanlan.zhihu.com/p/529084234

二、虚拟化原理部分知识点----持续更新

2.0 说明

其实上部分的几篇链接文章,基本上已经把armv8虚拟化原理说的挺清楚了,为什么我还要写一篇?重复造轮子没有意义和价值,其实这几篇文章重复率极高,不排除时一个人撰写或多个人直接抄袭搬运。所以再写一篇原因有下:

        1)之前文章只讲原理,没有相关验证,可能理解起来不直观;

        2)有几处原理出现标识错误,而且是全部错在同一个点,可能是他们参考老版本导致(更有甚者,尼玛第一个人写错了导致后面所有人都抄错了)。

所以,本篇文章直接追本溯源,只参考arm官方给的文章,然后针对前人错误的地方辅以佐证,文章是虚拟化中的一个个模块,想要连贯性还是读官方文档,当然英语不好的可以直接看参考连接。

接下来,进入正文……

2.1 寄存器重定向

VHE开启后(HCR_EL2.H2E == 1),可以通过寄存器重定向,使得host os在访问EL1层的寄存器是被重定向到EL2层面(访问到el2的寄存器),这样就可以使得kernel二进制可以不做任何修改。此时只需要HCR_EL2.H2E == 1这一比特被置位,即vhe使能,那Host OS对所有EL1寄存器的访问操作都被硬件转换为对相应EL2寄存器的访问,如OS访问ttbr0_el1寄存器,则会按下图方式被重定向到ttbr0_el2:

可以看到上图中验证的,在HCR的第34bit=1时,即VHE使能,此时host在el2层面访问ttbr_el1的值(被重定向到el2)就等于el2的值!

但重定向访问寄存器会引入一个新的问题,Hypervisor为了实现任务切换(如EL2层面处理完后返回到EL1的Guest)需要访问真正的EL1寄存器。为了解决这个问题,Arm架构引入了一种新的别名机制,以_EL12或_EL02结尾。如需要访问实际的ttbr0_el1时,则可通过访问ttbr0_el12的方式实现。

上述文章无一例外的指明此时需要置位ECH==1,以使得在EL2层面访问TTBR0_EL12就是访问TTBR0_EL1,奈何我在官方UM中搜遍了armv8所有寄存器的所有字段,也没发现有个ECH的比特的。最终只能怀疑他们借鉴的可能是老版本,或者说写错了,而且后来者又一遍遍抄错了。(其实弄清楚这个问题很简单,直接找个机器验证一遍就可以了)后来我直接去官网找,最终找到了第一手资料Documentation – Arm Developer,这个功能其实就是要求E2H==1,而不是所谓的ECH,哪有这个字段。

验证此功能时,首先读取el12的值,目前读取为全0,以为出错了。但转念一想,因为此时Host在EL2,根本不会跑到EL1,那EL1的页表基地址确实就用不上了。Guest的ttbr0是ok的,多个vm的基地址也千差万别。此处先留个疑问吧。

2.1.2 关于寄存器读写工具

上述实验中的regtool为自写工具,如果没有类似工具的话,可以考虑写一个模块然后去读reg。具体操作就跟之前写的linux kernel单独编译某项驱动----网卡驱动_kernel-devel-CSDN博客单独编译某一驱动一样。

其中就俩文件:1)Makefile:

PWD = $(shell pwd)
KDIR ?= /lib/modules/$(shell uname -r)/build
 
obj-m += regRead.o       #有时候MODNAME识别不了,则直接用原始名字即可
 
all:
	make -C $(KDIR) M=$(PWD) src=$(PWD) modules      #复制的话可能会使Tab变成空格,记得修改
 
clean:
	make -C $(KDIR) M=$(PWD) src=$(PWD) clean

2)readReg.c

arm架构下关于reg的定义以及读写函数可见 linux-5.10/arch/arm64/include/asm/sysreg.h,写头文件时去掉include之前的路径即可。

然后以模块进行编译、装载、然后验证……

本来还想验证下第二个ttbr0_el12重定向的功能,奈何我司的机器上CPU显示这个寄存器不支持,估计是cpu设计的问题了。

2.2 待续

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

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

相关文章

Docker——常用命令

1.Docker是做什么的? Docker 是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。它可以帮助我们下载应用镜像,创建并运行镜…

SSM宠物领养系统-计算机毕设定制-附项目源码(可白嫖)55139

目 录 摘要 1 绪论 1.1 意义 1.2国内外研究现状 1.3ssm框架 1.4Vue.js 主要功能 1.4论文结构与章节安排 2 2 宠物领养系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1功能性分析…

泰坦尼克号 - 从灾难中学习机器学习/Titanic - Machine Learning from Disaster(kaggle竞赛)第一集(了解赛题)

此次目的: 准备出几期博客来记录我学习kaggle数据科学入门竞赛的过程,顺便也将其中所学习到的知识分享出来。这是第一集(了解赛题),后面还会更新更详尽的代码和讲解等。(所学主要的内容来自与b站大学恩师“…

从数据分析到智能生产:AI在工业中的应用与未来

导语 | 人工智能技术的迅猛发展,正在引领第四次工业革命悄然而至。尽管 AI 技术在工业领域的部署仍有诸多难题亟待解决,但这并不能阻挡历史趋势的车轮滚滚向前,AI 正在为工业领域带来新的变革。今天,我们特邀了上海腾展长融董事 &…

MybatisPlus使用指南

MybatisPlus 1. 快速入门1.1 入门案例1.2 常见注解1.3 常见配置 2. 核心功能2.1 条件构造器2.2 自定义SQL2.3 Service接口 3. 扩展功能3.1 代码生成3.2 静态工具3.3 逻辑删除 4. 插件功能4.1 分页插件4.2 通用分页实体 1. 快速入门 1.1 入门案例 步骤一:引入Mybat…

初阶数据结构排序之插入排序

排序01 插⼊排序 基本思想 直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是:把待排序的记录按其关键码值的⼤⼩逐个插 ⼊到⼀个已经排好序的有序序列中,直到所有的记录插⼊完为⽌,得到⼀个新的有序序列 。 实际中我们玩扑克牌…

uniapp 日常业务 随便写写 源码

现成的组件 直接用 <template><view style"margin: 10rpx;"><view class"tea-header"><text class"tea-title">礼尚往来</text><view class"tea-view-all"><text>查看全部</text>&l…

Redis 如何实现高并发

Redis 如何实现高并发 1、架构概述2、读写分离的优势3、注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Redis&#xff0c;作为一个高性能的键值对存储系统&#xff0c;通过其独特的设计和优化策略&#xff0c;能够有效地支持高并发…

关于TM611AWLCOR连续液位检测传感器的使用明细

1. 前言 本文只做软件协议相关的使用说明&#xff0c;对于硬件设计相关不做讨论。 本使用明细中涉及到的所有文档均来自诺泰官方技术支持并征得同意进行技术公开交流。其中涉及的代码均由我本人编写&#xff0c;仅供交流学习。 2. 数据手册 经由淘宝“青岛诺泰微电子有限公司”…

【添加与搜索单词 - 数据结构设计】python刷题记录

R4-位运算 Trie树BFS处理. class WordDictionary:def __init__(self):self.root{}def addWord(self, word: str) -> None:nodeself.rootfor c in word:if c not in node:node[c]{}nodenode[c]node["#"]{}def search(self, word: str) -> bool:word"#&quo…

MacOS上安装 Java

1.下载 oracle官网jdk下载地址 注意一下区分mac芯片版本&#xff0c;M1芯片选择Arm 64&#xff0c;Intel芯片选择x64 2.安装 傻瓜式安装&#xff0c;下载好后直接双击打开,一直下一步安装即可 3.查看安装路径 可通过以下命令查看安装路径(复制此输出路径&#xff0c;为后续…

Linux下ETCD安装、配置、命令详解

目录 1. 安装 Etcd 通过包管理器安装 从源代码编译安装 2. 配置 Etcd 3. 启动 Etcd 4. 使用 Etcd Etcd 是一个分布式的键值存储系统&#xff0c;主要用于服务发现、配置管理以及共享数据等场景。在 Linux 下安装、配置和使用 Etcd 涉及到几个步骤&#xff0c;下面我将详细…

DevExpress WPF中文教程:如何在GridControl中显示摘要?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

NLP实验-基于预训练模型的文本分类

使用BERT及其变体实现AclImdb情感分类 前言数据集介绍【Hugging Face】使用方法和如何挑选一个自己需要的模型 基于BERT预训练模型的本文分类数据预处理载入文本标记器将数据转化为模型可以接受的格式训练模型加载模型 基于RoBerta预训练模型的文本分类基于DeBerta预训练模型的…

使用STM32定时器的PWM功能控制电机

目录 概述 1 系统框架结构 1.1 框架结构介绍 1.2 STM32 Cube配置PWM参数 2 软件实现 2.1 STM32Cube生成项目 2.2 PWM功能的User函数接口 3 测试 3.1 编写测试函数 3.2 功能测试 概述 本文主要介绍使用STM32定时器TIMER-8功能生成4路PWM&#xff0c;用于控制两路电机…

五种Slowing Changing Dimensions(SCD)方法及案例

SCD Type Description Key Features Type 1 Overwriting the existing data with new data, without keeping any history of the previous values. 直接覆盖&#xff0c;不留痕迹 - Overwrites Existing Data - No Historical Data - Simple Implementation Type…

Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程

Composerize神器&#xff1a;自动化转换Docker运行命令至Compose配置&#xff0c;简化容器部署流程 在现代的微服务架构中&#xff0c;Docker Compose 是管理多容器应用的重要工具&#xff0c;它允许我们通过一个简单的 docker-compose.yml 文件来定义和运行多个关联的容器。然…

重发布实验

一、实验拓扑图 二、实验需求 1.如图搭建网络拓扑&#xff0c;所有路由器各自创建一个环回接口&#xff0c;合理规划IP地址 2.R1-R2-R3-R4-R6之间使用OSPF协议&#xff0c;R4-R5-R6之间使用RIP协议 3.R1环回重发布方式引入OSPF网络 4.R4/R6上进行双点双向重发布 5.分析网络…

CSP-CCF 202012-1 期末预测之安全指数

一、问题描述 二、解答 #include<iostream> using namespace std; int main() {int n;cin >> n;int w[100001] { 0 };int score[100001] { 0 };for (int i 1; i < n; i){cin >> w[i] >> score[i];}int y 0;for (int i 1; i < n; i){y y …

Java——反射(2/4):获取构造器对象并使用(获取类的构造器、并对其进行操作,获取类构造器的作用,代码实例)

目录 获取类的构造器 获取类的构造器、并对其进行操作 代码实例一 代码实例二 获取类构造器的作用 代码示例三 获取类的构造器 获取类的构造器、并对其进行操作 Class提供了从类中获取构造器的方法。 方法说明Constructor<?>[] getConstructors()获取全部构造器…