arm64高速缓存基础知识
高速缓存的替换策略
-
随机法:随机地确定替换的高速缓存行,由一个随机数产生器产生随机数来确认替换行
-
FIFO法:选择最先调入的高速缓存行进行替换
-
LRU法:最少使用的行优先替换。
高速缓存的共享属性
-
内部共享的高速缓存通常指的是CPU内部集成的高速缓存,它们最靠近CPU内核
-
外部共享的高速缓存指的是通过系统总线扩展的高速缓存
-
高速缓存可以分成4个共享域------不可共享域、内部共享域、外部共享域以及系统共享域
-
不可共享域:只能被一个处理器访问,其他处理器不能访问
-
内部共享:这个区域里的处理器可以访问
-
外部共享:这个区域里的处理器以及具有访问内存能力的硬件单元可以访问
-
系统共享:所有访问内存的单元都可以访问和共享这个区域
4. 共享域的目的:指定其中所有可以访问内存的硬件单元实现缓存一致性的范围,主要用于高速缓存维护指令以及内存屏障指令
5. 一个处理器系统中,除了处理器,还有其他的可以访问内存的硬件单元,这些硬件单元(如DMA设备,GPU等)通常具有访问内存总线的能力。
6. PoU和PoC的区别
-
全局缓存一致性角度(PoC):系统中所有可以发起内存访问的硬件单元(如处理器、DMA设备、GPU等)都能保证观察到的某一个地址上的数据是一致的或者是相同的副本,通常PoC表示站在系统的角度来看高速缓存的一致性问题
-
处理器缓存一致性角度(PoU):表示站在处理器的角度来看高速缓存的一致性问题,例如看到的指令高速缓存、数据高速缓存、TLB、MMU等都是同一份数据的副本,数据是一致的,PoU有两个观察点。
-
站在处理器角度来看,也就是针对单个处理器
-
站在内部共享的属性的范围来看(同属于内部共享属性的一组处理器)
高速缓存的维护指令
-
高速缓存的管理主要有如下3种情况
-
失效(invalida)操作:使整个高速缓存或者某个高速缓存行失效。之后,丢弃高速缓存上的数据
-
清理(clean)操作:把标记为脏的整个高速缓存或者某个高速缓存行写回下一级高速缓存或者内存中,然后清理高速缓存中的脏位,使得高速缓存行的内容与下一级高速缓存或者内存中的数据保存一致
-
清零(zero)操作:在某些情况下,用于对高速缓存进行预取和加速,例如:当程序需要使用较大的临时内存时,如果在初始化阶段对这块内存进行清0操作,高速缓存控制器就会主动把这些零数据写入高速缓存行中,如果程序主动使用高速缓存的清零操作,那么将大大的减少系统内部总线的带宽
2. ARM64还提供一种混合的操作,即清理并使其失效,会先执行清理,然后再使高速缓存行失效。
3. 对于高速缓存的操作可以指定如下不同的范围
-
整个高速缓存
-
某个虚拟地址
-
特定的高速缓存行或组或路。
4. ARMV8指令
数据缓存指令: DC <operation>, <Xt>
指令缓存指令: IC <operation>, <Xt>
-
操作码可以分为4部分
-
功能:包括高速缓存指令的功能,例如清理等
-
类型:用来指定指令操作的类型,例如,VA是针对单个虚拟地址的操作,SW表示针对高速缓存中的路和组进行操作,ALL表示针对整个高速缓存
-
观察点:表示站在哪个角度来对高速缓存进行操作,U表示站在处理器一致性角度,C表示站在全局缓存一致性角度
-
共享:IS表示内部共享属性

例: ic ialluis 使内部共享域中的所有处理器的指令高速缓存都失效
··········································ARMV8体系结构的高速缓存指令
| 指令类型 | 辅助操作符 | 描述 |
|---|---|---|
| ·····DC | cisw | 清理并使指定的组和路的高速缓存失效 |
| civac | 站在PoC,清理并使指定的虚拟地址对应的高速缓存失效 | |
| csw | 清理指定的组或路的高速缓存 | |
| cvac | 站在PoC,清理指定的虚拟地址对应的高速缓存 | |
| cvau | 站在PoU,清理指定的虚拟地址对应的高速缓存 | |
| isw | 使指定的路或组的高速缓存失效 | |
| ivac | 站在PoC,使指定的虚拟地址中对应的高速缓存失效 | |
| zva | 把虚拟地址中的高速缓存清零 | |
| ·····IC | ialluis | 站在PoU,使所有的指令高速缓存失效,这些指令高速缓存是内存共享的 |
| iallu | 站在PoU,使所有的指令高速缓存失效 | |
| ivau | 站在PoU,使指定的虚拟地址对应的指令高速缓存失效 |
-
CLIDR_EL1
用来标识高速缓存的类型以及系统最多支持几级高速缓存

添加图片注释,不超过 140 字(可选)
-
Ctype<n>, bits [3(n-1)+2:3(n-1)], for n = 7 to 1,Cache Type字段,描述各个缓存等级的的类型。比如Ctype1字段,描述的是Level1缓存的类型。可以有以下值:

-
LoUIS:标识内部共享PoU的边界所在的高速缓存级别
-
LoC字段表示PoC的边界所在的高速缓存级别
-
LoUU字段表示单处理器PoU边界所在的高速缓存级别
-
ICB字段表示内部缓存边界,ICB字段的编码如下:
-
0b001:L1是最高级别的内部共享的高速缓存
-
0b010:L2是最高级别的内部共享的高速缓存
-
….
-
0b111:L7是最高级别的内部共享的高速缓存
2. CTR_EL0
记录了高速缓存的相关信息,例如高速缓存行的大小、高速缓存策略等

-
L1Ip, bits [15:14]:Level 1中的指令缓存(instruction cache)的缓存策略。指示了index和tag的生成方式。可能包含的值如下,其中,VIPT和PIPT较常使用:
0b00---表示通过VMID指定的高速缓存策略位物理索引物理标记(VPIPT)
0b01---表示通过ASID指定的高速缓存策略为虚拟索引虚拟标记 (AIVIVT)
0b10---Virtual Index, Physical Tag (VIPT) 虚拟索引物理标记
0b11---Physical Index, Physical Tag (PIPT)物理索引物理标记
-
DminLine字段表示数据高速缓存或者联合高速缓存的缓存行大小
-
ERG字段表示独占访问的最小单位,用于独占加载和存储指令
-
CWG字段表示高速缓存回写的最小单位,
-
IDC字段表示清理数据高速缓存时是否要求指令对数据的一致性
-
DIC字段表示无效指令高速缓存时是否要求数据与指令的一致性
-
TminLine字段表示缓冲行中标签的大小。
3. CSSELR_EL1

-
InD, bit [0]:选择的高速缓存类型
0b0 Data or unified cache.数据高速缓存或者联合高速缓存
0b1 Instruction cache. 指令高速缓存
-
Level, bits [3:1]:指定要查询的高速缓存的层次

-
TnD字段用来指定高速缓存标记的类型
0b0:表示数据、指令或者联合高速缓存
0b1:表示独立分配标记的高速缓存
5. CCSIDR_EL1

-
LineSize:(Log2(Number of bytes in cache line)) - 4,表示一个cache line的大小为多少个字节。它的值需要进行换算:如果LineSize = 0,2^(0+4) = 16,表明此时的cache line大小为16个字节。相反,如果cache line大小为64 bytes,此时LineSize = log2(64) - 4 = 6 - 4 = 2 =0x10。
-
Associativity:Number of ways in cache -1,如果Associativity = 3,则说明有4个way。
-
NumSets:(Number of sets in cache)-1,组的数量-1,也就是说该字段的数值加1,才是当前cache的set数量。
6. DCZID_EL0寄存器

这个寄存器用来指定清零(DC ZVA)的数据块大小
-
DZP: 0b0 Instructions are permitted. 0b1 Instructions are prohibited.
-
BS, bits [3:0] :Log2 of the block size in words. The maximum size supported is 2KB (value == 9)
相关文章:
arm64高速缓存基础知识
高速缓存的替换策略 随机法:随机地确定替换的高速缓存行,由一个随机数产生器产生随机数来确认替换行 FIFO法:选择最先调入的高速缓存行进行替换 LRU法:最少使用的行优先替换。 高速缓存的共享属性 内部共享的高速缓存通常指的…...
物管王 物业管理系统软件
物管王 物业收费管理系统软件 网络版...
YOLOv10改进:CA注意力机制【注意力系列篇】(附详细的修改步骤,以及代码,目标检测效果优于SE和CBAM注意力)
YOLOv10改进:CA注意力机制【注意力系列篇】(附详细的修改步骤,以及代码) 如果实验环境尚未搭建成功,可以参考这篇文章 ->【YOLOv10超详细环境搭建以及模型训练(GPU版本)】 文章链接为&…...
使用go语言获取海南七星彩历史开奖记录并打印输出
效果如下 : 1.引用json与http模块 import ("encoding/json""fmt""github.com/nahid/gohttp" ) 2.创建请求: req := gohttp.NewRequest()resp, err := req.Get("这里填写请求地址")if err != nil {panic(err)} 3.处理响应结果 : if…...
使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统
引言 在企业级应用开发中,数据库操作是非常重要的一环。Spring Data JPA提供了一种简化的方式来进行数据库交互,它使得开发者无需编写复杂的JPA代码就可以完成常见的CRUD操作。此外,设计模式如单例模式可以帮助我们更好地管理和控制对象的创…...
记录ssl epoll的tcp socket服务端在客户端断开时崩溃的问题
文章目录 当客户端关闭后,Epoll 的 TCP socket 服务端会收到两次断开事件可能有以下原因及解决方法:原因分析解决方法 问题ssl socket服务端代码出错现象第一次尝试修改正确改法附上客户端代码 记录ssl epoll的tcp socket服务端在客户端断开时接收到多次…...
ubuntu任何版本 卡死 解决办法
首先,我们一定要记得ubuntu一定不要强制关机,一定,一定 因为90% 的可能你的电脑从此就会黑屏开不了机了,然后你就可以按照我的方法去卸载,重装ubuntu系统了。/(ㄒoㄒ)/~~ (如果能解决您的问题,…...
算法-合并区间(56)
这道题可以用列表来写,首先对所有的数组区间依据第一个数字进行排序,然后创建一个数组列表存放合并重叠后的结果。 如果列表为空,或者当前区间的起始位置大于列表中区间的最后一个位置,则不重叠直接插入列表,否则合并…...
港科夜闻 | 叶玉如校长出席2024科技+新质生产力高峰论坛发表专题演讲,贡献国家科技强国战略...
关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、叶玉如校长出席“2024科技新质生产力高峰论坛”,做了题为“三个创新:培育和发展新质生产力、贡献国家科技强国战略”的主题演讲。该论坛于9月2日在香港召开。论坛围绕夯实基础科研、推动源头创新、…...
一文读懂IPv6v6地址的配置方式
在数字化浪潮的推动下,互联网正以前所未有的速度发展,而IPv6作为新一代网络协议,以其庞大的地址空间、增强的安全性和灵活的地址配置机制,成为了支撑这一发展的关键技术。本文将深入解析这两种配置方式的工作原理、应用场景及操作…...
【设计模式】设计模式的八大原则
设计模式的八个原则: 依赖倒置原则: 高层次的代码(稳定)不应该依赖低层次的代码(变化)抽象的代码不应该依赖具体的代码。 开放封闭原则:类模块应该开放扩展的,而其原先的代码尽量封…...
【Github项目推荐】DataLoom
项目推荐 - DataLoom 项目背景 在数据驱动的时代,越来越多的企业和个人用户需要从复杂的数据中提取出高价值的信息。然而,传统的数据处理和分析流程复杂且耗时,需要技术人员的深度参与。那么,有没有一种工具能够简化这一过程&am…...
重磅!布拉德皮特移居法国?据称与他和安吉丽娜朱莉生养的6个孩子有关!皮特一直为自己与孩子们如此亲近却又如此遥远而苦恼
对于那些不知道的人来说,布拉德皮特似乎已经正式离开洛杉矶前往欧洲。虽然这有很多原因,我们将逐一介绍,但主要原因据称与他和前前妻安吉丽娜朱莉所生养的六个疏远的孩子有关。 知情人士告诉《InTouch Weekly》,皮特搬到了法国&a…...
.net MAUI应用生命周期
.NET Multi-platform App UI (.NET MAUI) 应用通常有四种执行状态:“未运行”、“运行中”、“已停用”和“已停止”。 当应用从未运行状态转换为运行状态、从运行状态转换为已停用状态、从已停用状态转换为已停止状态、从已停止状态转换为运行状态,以及…...
Nginx 安装教程
一、安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel 二、首先要安装 PCRE PCRE 作用是让 Nginx 支持 Rewrite 功能。 1、下载 PCRE 安装包,下载地址: http://downloads.sourceforge.net/project/p…...
vue axios发送post请求跨域解决
跨越解决有两种方案,后端解决,前端解决。后端解决参考Django跨域解决-CSDN博客 该方法之前试着可以的,但是复制到其他电脑上报错,所以改用前端解决 1、main.js做增加如下配置 import axios from axios Vue.prototype.$axios a…...
MIT线性代数
本文链接的原创作者为 浊酒南街https://blog.csdn.net/weixin_43597208 第1讲 MIT_线性代数笔记:第 01 讲 行图像和列图像-CSDN博客 第2讲 MIT_线性代数笔记:第 02 讲 矩阵消元_矩阵first pivot-CSDN博客 第3讲 MIT_线性代数笔记:第 03…...
打工人自救指南!2024年数据恢复工具,清空回收站也能秒回数据
嘿,各位上班的朋友们,有没有手抖或者不小心,把重要的东西给拖到回收站,然后又不小心把回收站清空了?别慌,今天我就来给你们支招,用数据恢复工具,让你们在丢数据的倒霉时候也能找到救…...
MyBatis 缓存机制
分布式系统中不建议使用mybatis缓存机制,建议通过redis来解决数据缓存。 MyBatis 缓存机制包括一级缓存和二级缓存,它们在提高数据库查询效率方面发挥着重要作用。 1. **一级缓存**(Local Cache): - 一级缓存是 M…...
10个神级Python自动化脚本助力轻松工作
大家好,Python自动化简化了日常编程任务,同时更激发了探索创新解决方案的热情。本文将介绍10个精心挑选的自动化脚本,帮助大家提升工作效率和优化操作流程。 1.Speakify Speakify 是专注于语音交互的人工智能助手,可以帮助用户通过语音进行…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
