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


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


文章目录

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

在这里插入图片描述

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寄存器中写入正确的值

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

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

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

相关文章

mysql引入表名称的注意事项

1、遇到问题 mapper中的文件是这样的 解析出来的sql是这样的 sql显示为:select * from ‘tableName’ 2、解决方法 mapper文件种使用${tableName}而不是#{tableName}

网工内推 | 联通公司,云计算售前,AWS认证优先

01 联通数字科技有限公司 🔷招聘岗位:云计算售前工程师 🔷职责描述: 1.了解私有云,公有云,混合云等云计算技术知识,了解云计算行业现状及发展趋势。 2.承担区域项目售前工作支持,为…

【iOS】UI学习——UITableView

UI学习(四) UITableView基础UITableView协议UITableView高级协议和单元格 UITableView基础 dateSource:数据代理对象 delegate:普通代理对象 numberOfSectionInTableView:获得组数协议 numberOfRowsInSection:获得行数协议 cellForRowAtIndexPath:创建单…

ORPC-851(工业级)晶体管光耦,兼容替代LTV-851、PC851

提供隔离反馈 逻辑电路之间的接口 带基极引脚高可靠晶体管输出光耦 电平转换 DC和AC输入 SMPS中的调节反馈电路 消除接地环路 特征 电流传输比 ( CTR : 最低 50% IF 5mA, VCE 5V ) 宽工作温度范围 -55~100C 高输入输出隔离…

【python010】获取任意多边形区域内的经纬度点并可视化

1.熟悉、梳理、总结项目研发实战中的Python开发日常使用中的问题、知识点等,如获取任意多边形区域内的经纬度点并可视化,找了N篇文章没发现有效的解决方案。 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 3.欢…

【一步一步了解Java系列】:重磅多态

看到这句话的时候证明:此刻你我都在努力 加油陌生人 个人主页:Gu Gu Study专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者:小闭…

低代码开发平台一般都有哪些功能和模块?

在当今快速变化的数字化时代,企业对于高效、灵活且经济的软件开发解决方案的需求愈发迫切。低代码开发平台应运而生,成为众多企业实现数字化转型的首选工具。本文将详细探讨低代码开发平台一般具备的主要功能和模块,以及它们如何助力企业提升…

6月5日 C++day3

#include <iostream>using namespace std;class Per { private:string name;int age;int *high;double *weight; public:Per(){cout << "Per的无参构造" << endl;}Per(string name,int age,int high,double weight):\name(name),age(age),high(new…

trace32 显示用户进程用户态调用栈

在只加载了linux vmlinux符号表的情况下&#xff0c;trace32 只能显示内核态的调用栈函数信息&#xff0c;无法显示用户态调用栈的函数信息&#xff1a; 查看进程maps 确认地址0x40616C为进程/bin/box的虚拟地址&#xff1b;而0xFFFF904E12FC为/lib/libc-2.30.so的地址&#x…

字节跳动Seed-TTS文本到语音模型家族

字节跳动的SEED TTS&#xff08;Seed-TTS&#xff09;是一系列大规模自回归文本转语音&#xff08;TTS&#xff09;模型&#xff0c;能够生成与人类语音几乎没有区别的高质量语音。该模型在语音上下文学习方面表现出色&#xff0c;尤其在说话者相似度和自然度方面的表现&#x…

特惠电影票api接口文档,宜选影票接口文档不断优化

宜选影票接口文档的优化是一个持续的过程&#xff0c;旨在提高API的易用性、稳定性和安全性。以下是根据参考文章和相关经验&#xff0c;对宜选影票接口文档优化的一些建议&#xff0c;采用分点表示和归纳的方式&#xff1a; 1. 明确接口目标和功能 清晰定义&#xff1a;在接…

css动画案例练习之会展开的魔方和交错的小块

这里写目录标题 一级目录二级目录三级目录 下面开始案例的练习&#xff0c;建议第一个动手操作好了再进行下一个一、交错的小块效果展示1.大致思路1.基本结构2.实现动态移动 2.最终版代码 二、会展开的魔方1.大致思路1.基本结构;2.静态魔方的构建3.让静态的魔方动起来 2.最终版…

【MySQL】表的基本操作

&#x1f30e;表的基本操作 文章目录&#xff1a; 表的基本操作 创建查看表       创建表       查看表结构 表的修改       表的重命名       表的添加与修改       删除表结构 总结 前言&#xff1a; 在数据库中&#xff0c;数据表是存储和组…

鸿蒙状态管理-@Builder自定义构建函数

Builder 将重复使用的UI元素抽象成一个方法 在build方法里调用 使其成为 自定义构建函数 Entry Component struct BuilderCase {build() {Column(){Row(){Text("西游记").fontSize(20)}.justifyContent(FlexAlign.Center).backgroundColor("#f3f4f5").hei…

性能测试-测试方法总结(压力/负载)超详细

前言 并发/负载/压力理解 负载测试&#xff1a;通过不断加压使系统达到瓶颈&#xff0c;为调优提供参考数据 压力测试&#xff1a; 稳定性压力测试&#xff1a;在不同的给定的条件下&#xff08;比如内存的使用&#xff0c;一定时间段内有多少请求等&#xff09;&#xff0c…

IEAD常用快捷键

如题 网页图片不清晰&#xff0c;可下载后查看

NXP i.MX8系列平台开发讲解 - 3.14 Linux 之Power Supply子系统(一)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 1. Power Supply子系统介绍 2. Power Supply子系统框架 3. Power Supply代码分析 本章节主要介绍Linux 下的P…

vs2019 c++20 规范的头文件 <future> 源码注释和几个结论

&#xff08;1 探讨一&#xff09;在多线程中&#xff0c;需要线程返回值的可以用该头文件中的类。该头文件中模板类和模板函数定义很多&#xff0c;用一幅图给出模板类之间的关系&#xff0c;方便从整体上把握和记忆&#xff1a; &#xff08;2&#xff09;

6.5 作业

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std; class Stu { privat…

GNN与Transformer创新结合!模型性能起飞!

前言 近年来&#xff0c;图神经网络&#xff08;GNN&#xff09;和Transformer模型分别凭借其独到的优势&#xff0c;在处理复杂数据结构和识别序列间的相互依赖性方面取得了突破性进展&#xff0c;这些优势使得GNN和Transformer的结合成为图表示学习领域的一个有前景的研究方…