【ARM Cache 与 MMU 系列文章 7.7 – ARMv8/v9 MMU Table 表分配原理及其代码实现 1】

文章目录

    • MMU Table 表分配原理及其代码实现
      • 虚拟地址空间 Region的配置
      • 系统物理地址位宽获取

MMU Table 表分配原理及其代码实现

假设当前系统中需要映射多个region,其中第一个要映射的region虚拟地址范围是0x0000_0000 -- 0x8000_0000 一共2G的大小。MMU默认最大支持48bit的虚拟地址,由前面文章可知 如果按照颗粒度为4K大小进行映射,且按照4级映射的方式进行映射(9bit-9bit-9bit-9bit-12bit),那么:

  • Level0 table 一个entry对应的大小为512G;
  • Level1 table 一个entry对应的大小为1G;
  • Level2 table 一个entry对应的大小为2M;
  • Level3 table 一个entry对应的大小为 4K

由于每个Level 又由9bit组成,所以每个Level 有 29 = 512 个entry。由于 Level0 的一个entry对应的地址范围是512G,所以通常用不到 Level0,虽然用不到Level0, 但是低级 table的地址都是由 Level0 table寻址而来的,所以仍然需要给Level0 的 table分配地址,其中Level0 table 也就是 root table,最终会被配置到 ARM 系统寄存器TTBR0或者TTBR1中。

每个 Entry 占 8bytes 空间

root table 通常会被分配4K大小的地址,root table(level0 table) 中的 每个entry 都会指向 level1 的 一个 table (当然 level0 table entry也可以是一个block,但是很少这样用),同样 level1 table 中的每个entry都会执行 level2 的 table …

在 table 分配期间 MMU 还没有开始运行,所以所使用的地址都是物理地址。

虚拟地址空间 Region的配置

通常虚拟地址空间的配置都是按照region进行分配的,也即将整个虚拟地址空间分为多个region,如下一共配置了5个region虚拟地址空间:

struct mmu_region {
        uint64_t phy_base;
        uint64_t vir_base;
        uint64_t len;
        uint64_t attr;
        uint32_t id;
};
static struct mmu_region mem_region[] = {
        {
                .phy_base = 0x00000000,
                .vir_base = 0x00000000,
                .len      = 0x80000000,
                .attr     = 0x00000008,
                .id       = 0,
        },
        {
                .phy_base = 0x80000000,
                .vir_base = 0x80000000,
                .len      = 0x06000000, // 96M
                .attr     = 0x00000002,
                .id       = 1,
        },
        {
                .phy_base = 0x86000000,
                .vir_base = 0x86000000,
                .len      = 0x02000000, // 32M
                .attr     = 0x00000000,
                .id       = 3,
        },
        {
                .phy_base = 0x88000000,
                .vir_base = 0x88000000,
                .len      = 0x18000000, // 384M
                .attr     = 0x00000002,
                .id       = 5,
        },
        {
                .phy_base = 0xA0000000,
                .vir_base = 0xA0000000,
                .len      = 0xF0000000,
                .attr     = 0x00000002,
                .id       = 6,
        },
        {
                .phy_base = 0x00000000,
                .vir_base = 0x00000000,
                .len      = 0x00000000,
                .attr     = 0x00000008,
                .id       = 8,
        },
};

如上面代码所示,当给出一段虚拟地址空间后首先需要判断每个 region 需要多少个 level table,比如需要多少个level1 table,多少个 level2 table …,

那么如何计算出需要多少个 level table 及每个table中有多少个entry 呢? 很明显 需要知道要映射的起始地址及其长度。如前面说到 0x0000_0000 -- 0x8000_0000 假如一共要映射2G的虚拟空间,我们知道 level1 table 中的一个entry 对应1G的大小,所以对于这段虚拟空间的映射只需在level1 table中填充两个entry就可以了, 其中 Level0 table 只使用到了entry0,如下图1-1所示:
在这里插入图片描述

图 1-1

Level0 Table 最大支持 256T 范围空间

我们知道,table 表中的一个entry对应一段地址,当给出一段地址后,我们需要知道这段地址在 table 表中的 entry 索引,那么 怎么计算出 entry 在 table 中的索引值呢? Entry 索引的计算由 level 等级的不同而不同,如下图 1-2 所示, level0 table的索引从bit39开始计算,level1 的table索引从bit30开始计算,level2的table的索引从bit21开始计算。
在这里插入图片描述

图 1-2

所以需要将虚拟地址的 bit[47:39] 的值剥离出来,它就是该虚拟地址在 Level0 table 中的索引值,因为 Level0 table的一个entry指向 512G的地址范围,所以通常 level0 table 只会用到一个 Table Entry。比如虚拟地址0x0000_0000 它在 Level0 table中的索引值为0,同样0x8000_0000 在 Level0 table 中的索引值也为0,只要虚拟地址范围不超出512G(0x80_0000_0000)那么它们在level0 table 中的索引都一样,都是为0.

下一步就是设定系统使用多少bit的虚拟地址空间了。在设置虚拟地址位宽前我们先看下如何获取当前系统支持的物理地址宽度

系统物理地址位宽获取

在ARMv8架构中,ID_AA64MMFR0_EL1是一个系统寄存器,用于提供有关内存管理单元(MMU)功能的信息。这个寄存器的全名是"A64 Memory Model Feature Register 0 at EL1",即在异常级别1(EL1)下的A64内存模型特征寄存器0。它包含的信息用于表明处理器支持的内存管理和地址转换的各种特征。
在这里插入图片描述
这里我们只先关注 bits [3:0],它定义了当前系统支持的物理地址位宽:

  • 0b0000 32 bits, 4GB.
  • 0b0001 36 bits, 64GB.
  • 0b0010 40 bits, 1TB.
  • 0b0011 42 bits, 4TB.
  • 0b0100 44 bits, 16TB.
  • 0b0101 48 bits, 256TB.
  • 0b0110 52 bits, 4PB.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索大模型技术及其前沿应用——TextIn文档解析技术

前言 中国图象图形大会(CCIG 2024)于近期在西安召开,此次大会将面向开放创新、交叉融合的发展趋势,为图像图形相关领域的专家学者和产业界同仁,搭建一个展示创新成果、展望未来发展,集高度、深度、广度三位…

劳动仲裁避坑指南(收集证据仲裁流程)

前言: 常在河边走,哪能不挨刀。 在大环境不好的滚滚洪流中,老实的IT打工人,一波波的被裁员。随时准备一些材料,特附上准备清单。 参考一些资料:2023年A股上市公司,裁员榜:1、 中国…

el-table动态配置显示表头

在实际工作中,会遇到动态配置e-table表头的情况,如下方法可以实现: // 要展示的列 column: [{prop: name, name: 名称 }, {prop: age, name: 年龄 }, {prop: sex, name: 性别 }, {prop: address, name: 地址 }, {prop: city, name: 城市 }]…

UFS协议—新手快速入门(二)【5-6】

目录 五、UFS协议栈 六、UFS技术演进与详解 1、UFS应用层 设备管理器 任务管理器 2、UFS传输层 3、UFS互联层 UFS协议—新手快速入门(一)【1-4】 五、UFS协议栈 UFS(Universal Flash Storage)协议是针对固态存储设备&…

【面试干货】 非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较

【面试干货】 非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较 一、引言二、非关系型数据库(NoSQL)2.1 优势 三、关系型数据库(RDBMS)3.1 优势 四、结论 💖The Begin…

深圳比创达|EMC与EMI测试整改:确保设备电磁兼容性的关键步骤

在当今电子产品日益普及的时代,电磁兼容性(EMC)已成为产品设计、制造和测试过程中不可忽视的重要环节。EMC问题不仅影响设备的正常运行,还可能对周围环境和其他设备产生干扰。因此,进行EMC与EMI(电磁干扰&a…

【python】修改目标检测的xml标签(VOC)类别名

需求: 在集成多个数据集一同训练时,可能会存在不同数据集针对同一种目标有不同的类名,可以通过python脚本修改数据内的类名映射,实现统一数据集标签名的目的。 代码: # -*- coding: utf-8 -*- # Time : 2023/9/11 1…

EE trade:通缩下什么最保值

通缩,即物价水平总体持续下降的现象,会对经济和投资产生深远影响。在通缩环境下,持有的资产类型和策略需要做出相应调整,以确保资产的保值和增值。以下是几类在通缩环境下通常最保值的资产及其原因: 1. 现金和现金等价…

二十三、 企业可能涉及的数据跨境传输场景有哪些?

(一)人力资源数据出境场景 1. 公司招聘(应聘者个人信息出境) 以外企为例,在公司招聘的过程中,可能被认定为涉及数据出境的典型场景如下: a) 境外总部企业官网统一招聘员工,由应聘…

高校实验室危险化学品及重大危险源安全管理系统

高校实验室危险化学品及重大危险源安全管理的重要性: 保障师生安全:通过严格管理,可以有效地降低这些风险,确保师生在实验室内的安全。 确保实验教学质量:良好的危化品管理能够确保实验材料的准确性和可靠性&#xff0…

从0开始学人工智能测试节选:Spark -- 结构化数据领域中测试人员的万金油技术(三)

分布式计算原理 分布式计算的原理总结一句话就是:分而治之。 把数据分片,存在不同的机器中,解决数据存储的压力。客户端和服务端之间通过相关协议来自动的完成在不同的机器之间进行数据的存取,用户并不感知数据的物理存储结构。 用…

【赠书活动】好书推荐—《详解51种企业应用架构模式》

导读: 企业应用包括哪些?它们又分别有哪些架构模式?世界著名软件开发大师Martin Fowler给你答案。 01 什么是企业应用 我的职业生涯专注于企业应用,因此,这里所谈及的模式也都是关于企业应用的。(企业应用…

在QML中调用 C++ 函数的方法(四)

文章目录 前言一、qml 和 c++ 交互的官方文档介绍二、QML 中调用 C++ 实现的函数的方法1. Exposing Attributes of C++ Types to QML1.1 暴露 Properties1.2 暴露 Methods(槽函数和Q_INVOKABLE 修饰的函数)1.3 暴露 Signals2. Defining QML Types from C++3. 代码实例3.1 创建一…

基因分析平台开发1 - Layui WebUI组件库快速地构建网页界面

介绍一个Web UI库,可快速实现基因分析平台前端部分的开发,借助帮助文档,快速实现自己想要效果。 1. Layui 简介 Layui 是一套免费的开源 Web UI 组件库,可用于更简单快速地构建网页界面,全部主流 Web 浏览器&#xf…

Springboot JVM监控 通过Promethus

Springboot内置了对Prometheus得支持,可以监测得点有: JVM各指标参数(GC,堆,非堆等)接口调用次数,延时系统内存,IO,CPU使用率 部署Prometheus和Grafana 准备一台2核4G…

抖音小店有哪些违规处罚?18处扣钱违规,商家赶紧收藏!

哈喽~我是电商月月 做抖音小店的商家最怕的事情就是店铺违规处罚了,那你们知道抖音小店的违规处罚都有哪些吗? 今天月月就给大家一次性讲清楚,抖店运营中包含的违规条例吧: 一.商品违规 1. 滥发信息:不贩卖违规的…

浅谈配置元件之计数器

浅谈配置元件之计数器 JMeter 的计数器(Counter)是一个非常实用的配置元件,它允许你在测试计划中生成并递增一个序列号或计数器。这对于需要在请求中包含唯一标识符、序列号或是进行循环控制等场景非常有用。下面是一份详细的使用指南&#…

js每日十题(二)

1. 6.3 js第6题 以下结语句中,返回true的是? A !![] B 1’1’ C nullundefined D !!’’ 答: A选项,由于数组属于对象类型,所以空的数组转换成布尔型是true,前置!!,两次取…

BLE芯片DA145XX系列:配置SDK支持多连接

Dialog的DA145XX系列BLE芯片可以配置允许多连接,需要修改SDK,下面主要说明如何实现多连接配置。 1、新增宏定义:__EXCLUDE_ROM_APP_TASK__ 用于取消ROM里关于APP部分函数的调用,改为使用自定义的函数 2、部分宏定义(DA…

人工智能专业现代学徒制人才培养质量评价体系构建

一、 引 言 随着信息时代的发展,人工智能(AI)技术的飞跃进步对各行各业产生了深远影响,对专业人才的培养提出了更高要求。现代学徒制作为一种创新人才培养模式,通过校企合作,强调理论与实践的深度结合&…