【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

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

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

相关文章

http协议,tomcat的作用

HTTP 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 特点: 1.基于TCP协议:面向连接,安全 2. 基于请求-响应模型的:一次请求对应一次响应 3HTTP协议是无状态的协议:对于事务处理没有记忆能…

大模型应用:基于Golang + 大模型构建简易的电商售前对话服务

1.背景 某X互联网电商公司为了解决当前大量用户的售前咨询问题,需要建设一个不需要客服介入的简易电商售前机器人,用于回答用户的售前问题,并给出基本可靠的咨询回答。 当前大模型如gpt、baichuan、文心等均有开放使用的OpenAPI接口&#xf…

单片机+TN901非接触式红外测温设计

摘要 温度测量技术应用十分广泛,而且在现代设备故障检测领域中也是一项非常重要的技术。但在某些应用领域中,要求测量温度用的传感器不能与被测物体相接触,这就需要一种非接触的测温方式来满足上述测温需求。本论文正是应上述实际需求而设计的…

【Autopilot】没有自动添加本地管理员的问题处理

【问题】某公司选用了D记的笔记本电脑,约定出厂就预配置好Autopilot,当时向D记提供了三个信息: 1. M365的租户ID 2. 公司域名信息 3. Group Tag (某公司为跨国公司,通过Group Tag来区分国家,比如CHN-中国,L…

2024 IDEA最新永久使用码教程(2099版)

本篇文章我就来分享一下2024年当前最新版 IntelliJ IDEA 最新注册码,教程如下,可免费永久,亲测有效,适合Windows和Mac。 本教程适用于 J B 全系列产品,包括 Pycharm、IDEA、WebStorm、Phpstorm、Datagrip、RubyMine、…

Web LLM 攻击技术

概述 在ChatGPT问世以来,我也尝试挖掘过ChatGPT的漏洞,不过仅仅发现过一些小问题:无法显示xml的bug和错误信息泄露,虽然也挖到过一些开源LLM的漏洞,比如前段时间发现的Jan的漏洞,但是不得不说传统漏洞越来…

[Cloud Networking] Layer Protocol (continue)

文章目录 1. STP / RSTP / MSTP Protocol1.1 STP的作用1.2 STP 生成树算法的三个步骤1.3 STP缺点 2. ARP Protocol3. DHCP Protocol3.1 DHCP 三种分配方式3.2 DHCP 攻击 4. IPSEC / MACSEC 1. STP / RSTP / MSTP Protocol 1.1 STP的作用 消除二层环路:通过阻断冗余…

分享一个 .NET Core Console 项目使用依赖注入的详细例子

前言 依赖注入(Dependency Injection,简称DI)是一种软件设计模式,主要用于管理和组织一个软件系统中不同模块之间的依赖关系。 在依赖注入中,依赖项(也称为组件或服务)不是在代码内部创建或查…

Vitis HLS 学习笔记--global_array_RAM初始化及复位

目录 1. 简介 2. 示例代分析 2.1 源代码 2.2 URAM 不可用 2.3 代码功能解释 2.4 综合报告 2.4.1 顶层控制接口 2.4.2 软件 IO 信息 2.4.3 存储绑定 3. 对比两种 solution 3.1 solution_A 3.2 solution_B 4. 总结 1. 简介 在C程序中,数组是一种基本的…

每日5题Day18 - LeetCode 86 - 90

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:86. 分隔链表 - 力扣(LeetCode) /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;…

为下一波创新做准备:人工智能和元宇宙

人工智能和元宇宙的发展带来了独特的可能性和挑战。随着这些技术的发展,我们进入了一个沉浸式虚拟体验和智能系统的时代,我们正站在一个历史性的时刻。为迎接下一波创新,采取必要的措施是很重要的。 我们正在见证两项变革性技术的激动人心的发…

【TB作品】msp430f5529单片机,dht22,温湿度传感器,OLED显示屏

使用DHT22温湿度传感器和OLED显示屏的单片机项目 博客名称 利用MSP430单片机读取DHT22并显示温湿度 作品功能 本项目利用MSP430单片机读取DHT22温湿度传感器的数据,并将温湿度信息显示在OLED显示屏上。通过这个项目,您可以学习如何使用单片机与传感器…

计算机二级Access操作题总结——简单应用

查询设计 创建一个查询,能够在客人每次结账时根据客人的姓名提示统计这个客人已住天数和应交金额,并显示“姓名”、“房间号”、“已住天数”和“应交金额”,所建查询命名为“qT2”。 注:输入姓名时应提示“请输入姓名”。已住天…

vscode输出控制台中文显示乱码最有效解决办法

当VSCode的输出控制台中文显示乱码时,一个有效的解决办法是通过设置环境变量来确保编码的正确性。以下是解决方式: 首先,设置环境变量以修正乱码问题: 如果上述方法没有解决乱码问题,请继续以下步骤: 右键…

编译原理-语法分析(实验 C语言)

语法分析 1. 实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析 2. 实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析 2.1 待分析的简单语言的语法 用扩充的BNF表示如下: …

Spring AOP(实现,动态原理)详解版

Spring AOP 1.什么是AOP?1.1引入AOP依赖1.2编写AOP程序 2.Spring AOP核⼼概念2.1 切点(Pointcut)2.2连接点(Join Point)2.3通知(Advice)2.4 切⾯(Aspect) 3.通知类型3.1顺序3.2切⾯优先级 Order3.3 ⾃定义注解 MyAspect 4. Spring AOP 原理5 动态代理怎么实现5.1 JD…

BeagleBone Black入门总结

文章目录 参考连接重要路径系统镜像下载访问 BeagleBone 参考连接 镜像下载启动系统制作:SD卡烧录工具入门书籍推荐:BeagleBone cookbookBeagleBone概况? 重要路径 官方例程及脚本路径:/var/lib/cloud9BeagleBone Cookbook例程…

03-3.5.1~4 特殊矩阵的压缩存储

👋 Hi, I’m Beast Cheng👀 I’m interested in photography, hiking, landscape…🌱 I’m currently learning python, javascript, kotlin…📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

最新区块链论文速读--CCF A会议 CCS 2023 共25篇 附pdf下载(3/4)

Conference:ACM Conference on Computer and Communications Security (CCS) CCF level:CCF A Categories:network and information security Year:2023 Num:25 第1~7篇区块链文章请点击此处查看 第8~13篇区块链文…

【介绍下什么是Kubernetes编排系统】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…