【ARM Cache 及 MMU 系列文章 6 -- Cache 寄存器 CTR_EL0 | CLIDR | CCSIDR | CSSELR 使用详解 1】


请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】
及【嵌入式开发学习必备专栏】


文章目录

  • Cache 常用寄存器
    • Cache CSSELR 寄存器
      • Cache CSSELR 使用场景
      • Cache CSSELR 操作示例
    • Cache CLIDR 寄存器
      • LoUU 介绍
        • LoUU 使用
      • LoUIS 介绍
      • CLIDR 使用
    • Cache CCSIDR 寄存器
    • Cache CTR_EL0

在这里插入图片描述

Cache 常用寄存器

ARM Cache 常用到寄存器有以下几个:

  • CSSELR, Cache Size Selection Register
  • CLIDR, Cache Level ID Register
  • CTR, Cache Type Register
  • CCSIDR, Current Cache Size ID Register

Cache CSSELR 寄存器

在这里插入图片描述
CSSELR(Cache Size Selection Register)是ARM架构中用于选择当前缓存大小ID寄存器(CCSIDR)的寄存器。通过指定所需的缓存级别和缓存类型(指令缓存或数据缓存),可以让处理器知道当前操作的是哪一级和类型的缓存。如果实现了FEAT_CCIDX特性,CSSELR还可以用来选择当前的CCSIDR2寄存器。

寄存器映射:

  • 对于AArch32状态,CSSELR寄存器的位[31:0]直接映射到AArch64状态的CSSELR_EL1寄存器的位[31:0]。

此寄存器仅在EL1能够使用AArch32状态时存在。如果不支持AArch32,直接访问CSSELR将是未定义的。

字段解释:

  • Level (位[3:1]): 所需缓存的缓存级别。如果CSSELR中的{level, ind}被设置为一个未实现的缓存级别,那么读取CSSELR时,这个字段的值是未知的。
    • 0b000 Level 1 cache.
    • 0b001 Level 2 cache.
    • 0b010 Level 3 cache.
    • 0b011 Level 4 cache.
    • 0b100 Level 5 cache.
    • 0b101 Level 6 cache.
    • 0b110 Level 7 cache.

  • IND (位[0]): 指令非数据位。它指示选择的是指令缓存还是数据(或统一)缓存。允许的值有:
    • 0b0:数据缓存或统一缓存。
    • 0b1:指令缓存。

Cache CSSELR 使用场景

通过编程CSSELR寄存器,软件可以查询CCSIDR(或CCSIDR2,如果使用feat_ccidx)以获取特定级别和类型的缓存的详细配置信息,包括缓存的大小、行大小、关联性等。这对于理解和优化系统性能至关重要,因为不同级别和类型的缓存可能具有不同的特性和性能影响。

例如,在性能调优或者系统初始化时,了解具体的缓存参数可以帮助开发者更好地设计数据结构和算法,以减少缓存未命中(misses)和提高数据访问效率。

Cache CSSELR 操作示例

例如要操作 L1 Dcache,可以这样编程CSSELR寄存器:

MOV X0, #0  			  // 选择L1数据缓存,Level = 0b001, IND = 0b0
MSR CSSELR_EL1, X0  	  // 写入CSSELR_EL1寄存器
ISB              		  // 确保更新立即生效

接下来,就可以通过读取CCSIDR_EL1寄存器来获取L1数据缓存的配置信息了。这种灵活的选择和查询机制为软件提供了强大的工具,以便根据系统的实际缓存配置进行优化和调试

Cache CLIDR 寄存器

CLIDR(Cache Level ID Register)是ARM架构中用以识别每个级别上实现的缓存类型的寄存器,以及通过set/way方式操作缓存可以管理的缓存级别,最多可达七个级别。此外,CLIDR还标识了cache level结构的一致性级别(Level of Coherence, LOC)和 Level of Unification, LOU。
在这里插入图片描述

寄存器映射

  • 对于AArch32状态,CLIDR寄存器的位[31:0]直接映射到AArch64状态的CLIDR_EL1寄存器的位[31:0]。

该寄存器仅在EL1能够使用AArch32状态时存在。否则,直接访问CLIDR将是未定义的。

字段详解:

  • ICB, 位[31:30]:内部缓存边界(Inner Cache Boundary)。这个字段指示了内部可缓存内存区域的边界。

    • 0b00 Not disclosed by this mechanism.
    • 0b01 L1 cache is the highest Inner Cacheable level.
    • 0b10 L2 cache is the highest Inner Cacheable level.
    • 0b11 L3 cache is the highest Inner Cacheable level.
  • LOUU, bits[29:27]:缓存层次结构的单处理器统一级别(Level of Unification Uni-processor), 具体见下节内容。

  • LOC, bits[26:24]:缓存层次结构的一致性级别(Level of Coherence)。

  • LOUIS, bits[23:21]:缓存层次结构内部共享的统一级别(Level of Unification Inner Shareable)。当实现feat_s2fwb特性时,架构同样要求这个字段为0。

  • CType, bits[3(n-1)+2:3(n-1)], 对于 n = 7 到 1:缓存类型字段, 描述各个缓存等级的的类型。比如Ctype1字段,描述的是Level1缓存的类型。可以有以下值:

  • 0b000 No cache,表示无缓存

  • 0b001 Instruction cache only.表示只有指令缓存

  • 0b010 Data cache only.表示只有数据缓存

  • 0b011 Separate instruction and data caches.单独的指令缓存和数据缓存

  • 0b100 Unified cache.统一的缓存

  • 其他 保留字段

LoUU 介绍

LoUU(Level of Unification, Uniprocessor)是ARMv9架构中的术语,指在针对处理器元素(PE)执行PoU clean 或者 invalidate 时,必须clean或invalidate的最后一级缓存。与LOC(Level of Coherence,一致性级别)类似,LoUU的值也代表了一个缓存级别。

  • LoUU字段值为0x0时,意味着在执行到 PoU clean 或 invalidate 时,不需要clean 或者 invalidate任何缓存级别。这种情况下,可以认为所有的缓存操作都是在一个更紧密的层次结构内完成,不需要对外部cache level结构进行任何操作。
  • 如果LoUU字段值是一个非零值,且对应的缓存级别没有被实现,这表示所有已实现的缓存都位于PoU之前。这意味着,一旦数据到达了这个指定的缓存级别,就认为它已经处于一个对所有处理器核心来说,可视为统一的状态。
LoUU 使用

LoUU的概念主要用于处理器的缓存维护操作中,确保在执行某些特定的内存操作(如上下文切换、DMA操作前后或在运行关键任务代码之前)时,处理器可以正确地管理其缓存数据,保证数据的一致性和正确性。在多核处理器系统中,这一点尤为重要,因为不同核心间的数据共享和同步需要仔细控制。

假如一个系统,其LoUU值被设置为2,表示L2缓存是执行到 PoU clean 或者 invalidate操作时必须clean 或者 invalidate的最后一级缓存。这意味着,如果一个核心需要保证其修改对其他核心可见,它需要确保至少对 L2 缓存执行了clean 或者 invalidate操作。

关于PoC 和 PoU 的详细内容见:【ARM Cache 系列文章 2 – Cache Coherence及内存顺序模学习】

LoUIS 介绍

LOUIS 用于描述在内部共享的共享域(Inner Shareable Shareability Domain)执行统一点(Point of Unification)clean 或者 invalidate操作时,必须clean 或者 invalidate的最后一级缓存。

Inner Shareable Shareability Domain 是指可以在处理器的多个核心或处理单元间共享数据的特定区域。内部共享的共享域允许数据在不同的处理单元间高效共享,优化了数据同步和通信。

  • LOUIS字段值为0x0时,意味着在针对Inner Shareable Shareability Domain 执行到PoU的clean 或者 invalidate操作时,不需要对任何缓存级别进行clean 或者 invalidate。

  • 如果LOUIS字段值是非零且对应的缓存级别未被实现,这表明所有已实现的缓存都位于PoU之前。

CLIDR 使用

CLIDR_EL1寄存器为软件提供了一种机制来发现并理解系统中实现的cache level结构,包括:

  • 缓存的类型(如数据缓存、指令缓存或统一缓存)和级别。
  • 系统的缓存一致性和统一性特性。

通过检查CLIDR_EL1,系统软件(如操作系统或固件)可以确定如何有效地利用和维护缓存,优化性能,特别是在设计多线程和多核心处理的高效缓存一致性策略时。

Cache CCSIDR 寄存器

如果实现了 FEAT_CCIDX 则该寄存器定义如下:
在这里插入图片描述
否则定义如下:
在这里插入图片描述
CCSIDR(Current Cache Size ID Register)是ARM架构中用于提供当前选定缓存结构信息的寄存器。当实现了FEAT_CCIDX 特性时,该寄存器与CCSIDR2结合使用。在AArch32系统寄存器中,CCSIDR的位[31:0]在架构上映射到AArch64系统寄存器CCSIDR_EL1的位[31:0]。只有在EL1能够使用AArch32状态时,该寄存器才存在。否则,直接访问CCSIDR是未定义的。

  • bits [27:13] NUMSETS:定义了缓存中集合(Set)的数量。这个值是缓存中实际集合数减去1,因为它是从0开始计数的。
  • bits [12:3]ASSOCIATIVITY:定义了缓存的关联度。这个值同样是实际关联度减去1的结果, 比如 如果Associativity = 3,则说明有4个way。
  • bits [2:0] LINESIZE:定义了缓存行的大小。这个值是以字节为单位,实际大小为 2(LINESIZE+4) 字节。例如,如果LINESIZE字段的值是4,那么缓存行大小为 2(4+4) = 256字节。

在访问CCSIDR之前,必须先在CSSELR寄存器中写入正确的值

Cache CTR_EL0

这里及Cortex-A520 core 为例进行介绍,寄存器组成如下:
在这里插入图片描述
IminLine, bits [3:0]:指令缓存(Instruction Cache)中的一个cache line中,包含的字(word)的数量。其值做了一次log2的运算。若一个cache line中包含16个word(64bytes),则DminLine的值应为 0b100 = 4
L1Ip, bits [15:14]:Level1 中的指令缓存(instruction cache)的缓存策略。指示了index和tag的生成方式。可能包含的值如下,其中,VIPT和PIPT较常使用:

  • 0b00—VMID aware Physical Index, Physical tag (VPIPT)
  • 0b01—ASID-tagged Virtual Index, Virtual Tag (AIVIVT)
  • 0b10—Virtual Index, Physical Tag (VIPT)
  • 0b11—Physical Index, Physical Tag (PIPT)

DminLine, bits [19:16]:数据缓存(Data Cache)和统一缓存(Unified Cache)中的一个cache line中,包含的字(word)的数量。其值做了一次log2的运算。若一个cache line中包含16个word,则DminLine的值应为 0b100 = 4.
在这里插入图片描述

推荐阅读:
https://blog.csdn.net/luolaihua2018/article/details/119271704

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

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

相关文章

中科数安 |-公司办公透明加密系统,数据防泄漏软件

#数据防泄漏软件# 中科数安是一家专注于提供企业级数据防泄漏解决方案的公司,其办公透明加密系统是专为保护企业内部核心数据资料设计的。 PC地址:——www.weaem.com 该系统通过以下主要功能模块实现高效的安全防护: 文档透明加密&#xff1…

滴滴出行 大数据研发实习生【继任】

大数据研发实习生JD 职位描述 1、负责滴滴核心业务的数据建设,设计并打造适应滴滴一站式出行平台业务特点的数仓体系。 2、负责抽象核心业务流程,沉淀业务通用分析框架,开发数仓中间层和数据应用产品。 3、负责不断完善数据治理体系&#xff…

【数据结构】栈的应用

目录 0 引言 1 栈在括号匹配中的应用 2 栈在表达式求值中的应用 2.1 算数表达式 2.2 中缀表达式转后缀表达式 2.3 后缀表达式求值 3 栈在递归中的应用 3.1 栈在函数调用中的作用 3.2 栈在函数调用中的工作原理 4 总结 0 引言 栈(Stack)是一…

WPF视频学习-基础知识篇

1.简介WPF: C# 一套关于windows界面应用开发框架 2.WPF和winform的差别 ,(WPF比较新) 创建新项目使用模板: WPF使用.xaml后缀,双击可查看操作界面和设置代码,其文件展开之后中有MainWindow.xaml.cs为程序交互逻辑。…

linux笔记8--安装软件

文章目录 1. PMS和软件安装的介绍2. 安装、更新、卸载安装更新ubuntu20.04更新镜像源: 卸载 3. 其他发行版4. 安装第三方软件5. 推荐 1. PMS和软件安装的介绍 PMS(package management system的简称):包管理系统 作用:方便用户进行软件安装(也…

nginx mirror流量镜像详细介绍以及实战示例

nginx mirror流量镜像详细介绍以及实战示例 1.nginx mirror作用2.nginx安装3.修改配置3.1.nginx.conf3.2.conf.d目录下添加default.conf配置文件3.3.nginx配置注意事项3.3.nginx重启 4.测试 1.nginx mirror作用 为了便于排查问题,可能希望线上的请求能够同步到测试…

PyCharm QThread 设置断点不起作用

背景: 端午节回来上班第一天,不想干活,领导又再后面看着,突然想起一个有意思的问题,为啥我的程序在子进程QThread的子类里打的断点不好用呢?那就解决一下这个问题吧。 原因: 如果您的解释器上…

开发框架表单设计器办公效率高吗?

对于很多职场人来说,拥有一款可以提质、增效、降本的办公利器是大有裨益的。随着科技的进步和发展,低代码技术平台凭借可视化界面、易操作、好维护、高效率等多个优势特点,成为大众喜爱的办公利器。开发框架表单设计器是减少信息孤岛&#xf…

macbook本地部署 pyhive环境连接 hive用例

前言 公司的测试和生产环境中尚未提供基于Hive的客户端。若希望尝试操作Hive表,目前一个可行的方案是使用Python语言,通过借助pyhive库,您可以对Hive表进行各种操作。以下是一些示例记录供您参考。 一、pyhive是什么? PyHive是一…

从零到一建设数据中台(番外篇)- 数据中台UI欣赏

番外篇 - 数据中台 UI 欣赏 话不多说,直接上图。 数据目录的重要性: 数据目录是一种关键的信息管理工具,它为组织提供了一个全面的、集中化的数据资产视图。 它不仅记录了数据的存储位置,还详细描述了数据的结构、内容、来源、使…

细说ARM MCU的串口接收数据的实现过程

目录 一、硬件及工程 1、硬件 2、软件目的 3、创建.ioc工程 二、 代码修改 1、串口初始化函数MX_USART2_UART_Init() (1)MX_USART2_UART_Init()串口参数初始化函数 (2)HAL_UART_MspInit()串口功能模块初始化函数 2、串口…

批量申请SSL证书如何做到既方便成本又最低

假如您手头拥有1千个域名,并且打算为每一个域名搭建网站,那么在当前的网络环境下,您必须确保这些网站通过https的方式提供服务。这意味着,您将为每一个域名申请SSL证书,以确保网站数据传输的安全性和可信度。那么&…

面试-NLP八股文

机器学习 交叉熵损失: L − ( y l o g ( y ^ ) ( 1 − y ) l o g ( 1 − ( y ^ ) ) L-(ylog(\hat{y}) (1-y)log(1-(\hat{y})) L−(ylog(y^​)(1−y)log(1−(y^​))均方误差: L 1 n ∑ i 1 n ( y i − y ^ i ) 2 L \frac{1}{n}\sum\limits_{i1}^{n}…

【ai】openai-quickstart 配置pycharm工程

之前都是本地执行脚本【AI】指定python3.10安装Jupyter Lab环境为:C:\Users\zhangbin\AppData\Local\Programs\Python\Python310 参考之前创建的python工程 使用的是局部的私有的虚拟环境 pycharm给出的解释器 直接使用现有的,不new了 可以选择3.10 :可以选虚拟的:

Rust-02-变量与可变性

在Rust中,变量和可变性是两个重要的概念。 变量:变量是用于存储数据的标识符。在Rust中,变量需要声明其类型,例如: let x: i32 5; // 声明一个名为x的变量,类型为i32(整数)&#…

SpringCloud 前端-网关-微服务-微服务间实现信息共享传递

目录 1 网关获取用户校验信息并保存至请求头(前端-网关) 2 微服务获取网关中的用户校验信息(网关-微服务) 2.1 一般的做法是在公共的module中添加,此处示例为common 公共配置module中添加 2.2 定义拦截器 2.3 定义…

简单通用的系统安装、备份、还原方法,支持 ARM 系统【Ventory+FirePE+DiskGenius】

文章目录 0. 简介1. 制作 Ventory 启动盘1.1. 下载 Ventory1.2. 制作 Ventory 启动盘 2. 添加 FirePE 等系统镜像到启动盘2.1. 下载 FirePE2.2. 导出 .iso 系统镜像文件2.3. .iso 系统镜像文件添加至启动盘 3. 启动 FirePE 等系统镜像3.1. 在 bios 中选择启动盘启动3.2. 启动系…

# RocketMQ 实战:模拟电商网站场景综合案例(八)

RocketMQ 实战:模拟电商网站场景综合案例(八) 一、RocketMQ 实战:模拟电商网站场景综合案例–下单异常问题演示 1.png 1、如果订单在扣减库存、扣减优惠券、扣减余额后,在 未 确认订单 前,出现了异常&am…

vue+element el-select动态加减框数量及验证下拉框选项动态置灰(选中行的下拉框换个值后,原值没办法监控这个问题也解决了)

1效果: 2部分主要(HTML): 1:这个位置主要就是看看方法什么的吧,还有大概的结构 2:change"sort_Change(item,tablelists.orderbyList)这两个参数(都有大用): (1)item:代表每次你操作的这个数据 (2)tablelists.orderbyList:代表你这一共有几行数据(上边这个例子就会得到一个…

LCD电子广告牌课程设计

概述 1.1课程设计简介 亮丽实用的广告牌可以给我们的生活添加光彩、可以给店铺招揽生意。传统的广告牌都是固定的汉字,并且时间长了会掉色,使汉字模糊难认,这就给我的生活带来很多的不便。尤其到了晚上传统广告牌就会失去其该有的作用。所以在…