深入学习Cache系列2:Cache是如何工作的?概念以及工作过程

原创 Linux阅码场 2022-04-11 08:00

作者简介

baron (网名:代码改变世界ctw),九年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计和开发



1.cache是多级相连的


cache是多级的,在一个系统中你可能会看到L1、L2、L3, 当然越靠近core就越小,也是越昂贵。一般来说,对于 big.LITTLE架构中,在L1是core中,L1又分为L1 data cache和 L1 Instruction cache, L2 cache在cluster中,L3则在BUS总线上。



2.cache一般是和MMU结合在

一起使用的


很多时候cache都是和MMU一起使用的(即同时开启或同时关闭),因为MMU页表的entry的属性中控制着内存权限和cache缓存策略等



在ARM架构中,L1 cache都是VIPT的,也就是当有一个虚拟地址送进来,MMU在开始进行地址翻译的时候,Virtual Index就可以去L1 cache中查询了,MMU查询和L1 cache的index查询是同时进行的。如果L1 Miss了,则再去查询L2,L2还找不到则再去查询L3。注意在arm架构中,仅仅L1 cache是VIPT,L1L2和L3都是PIPT。




3.硬件架构基础介绍


big.LITTLE架构 和 DynamIQ架构 的cache是有区别的



  • 在 big.LITTLE 架构中,大核小核在不同的cluster中,做为两个不同的ACE或CHI Master,连接到缓存一致性总线上(CCI或CMN)。大核cluster和小核cluster的缓存一致性,也需要通过一致性总线来解决。

  • 到了 DynamIQ 架构中,大核和小核都是一个DSU cluster中,一个DSU cluster最多可以支持8个core。如果你的系统是8个core,那么一个DSU就够了,那么系统中也就只有一个ACE或CHI Master,大核和小核之间的一致性,都在DSU cluster内完成了。

3.1 big.LITTLE架构的cache

big.LITTLE的架构中,L1是在core中的,是core私有的;L2是在cluster中的,对cluster中的core是共享的;L3则对所有cluster共享。big.LITTLE的架构的一个cache层级关系图如下所示:



3.2 DynamIQ架构架构的cache

dynamIQ的架构中,L1和L2都在core中的,都是core私有的;L3则是在cluster中的,对cluster中的core是共享的;如有L3或system cache,则是所有cluster共享。dynamIQ的架构的一个cache层级关系图如下所示。注意,一般来说一个DSU Cluster就可以做到支持8个core,以下只是举一个极端的例子,在硬件设计时,我非要放置两个DSU cluster 可不可以?两个DSU Cluster做为两个ACE Master连接到了CCI一致性总线上。


3.3 缓存一致性总线-CCI

用于ACE Master缓存一致性总线有 CCI-550CCI-500CCI-400



它的主要作用是可以互联多个 ACEMasterACE-liteMaster,然后通过ACE接口协议,做到多个Master之间的缓存一致性。CCI最多支持2个 ACEMaster,共计支持8个 ACEMaster+ ACE-liteMaster。所以呢,如果是 big.LITTLE架构的,那么最多支持两个cluster互联,每个cluster 8个core,所以最多支持8个core;如果是 dynamIQ架构的,那么最多支持两个DSU cluster互联,每个cluster 8个core,所以最多支持16个core


3.4 缓存一致性总线-CMN

用于CHI Master缓存一致性总线有 CMN-700CMN-600.



它的主要作用是可以互联多个 CHIMasterACE-liteMaster,然后通过CHI接口协议,做到多个Master之间的缓存一致性。CCI-600最多支持8个 CHIMaster,共计支持8个 CHIMaster+ ACE-liteMaster


3.5 big.LITTLE架构中的cluster interface

big.LITTLE架构中,cluster连接到一致性总线的接口,可以是ACE,也可以是CHI,所以big.LITTLE cluster既可以做为ACE Master连接到总线,也可以做为CHI Master连接到总线。



3.6 dynamIQ架构中的DSU interface

2017年引入dynamIQ架构, 在DSU(dynamIQ Share Unit)规范中,连接到一致性总线的接口,可以是ACE,也可以是CHI,所以DSU cluster既可以做为ACE Master连接到总线,也可以做为CHI Master连接到总线。



而在DSU-110中, 连接到一致性总线的接口可以是CHI ,但不再有ACE了。如果你使用的是DSU-110,DSU Cluster做为CHI Master了,那么你一定是采用CMN的总线互联方式。



3.7 架构图示例

所以呢,你看到的系统架构图(也是近几年最常用的),可能是下面这个样子的,所有的core都在一个DSU cluster中,所有core共享L3 cache,DSU接到CCI或CMN缓存互联一致性总线上,可以和其它ACE-Lite Master(如 GPU)共享缓存数据



当然了,举个稍微极端的例子,如下连接架构图也不是不可能,系统中有两个DSU cluster,DSU接到CCI或CMN缓存互联一致性总线上。



事实上big.LITTLE架构的cluster,也是可以做为CHI Master。下面这种超极端的例子,技术理论上也是可行的(当然可能不会有人用)。



4.L1/L2/L3 cache的大小


可以参考ARM文档,

  • 对于 big.LITTLE架构的core,其cache大小基本是固定的。

  • 对于 dynamIQ架构的core,其L1和L2 cache大小基本是固定的。但对于L2 cache 则是可选择可配置的 


     

    另外查阅DSU TRM文档,可以看到L3 Cache可以配置 0 - 16MB的大小。 


5.cache的组织形式(index, way, set)


cache的组织形式有:

  • 全相连

  • 直接相连

  • 多路组相连(如4路组相连)



在一个core中一个架构中一个SOC中,所有cache的组织形式并不是都一样的。即使L1 D-cache和L1 I-cache的组织形式,也都可能不是一样的的。具体的组织形式是怎样的,需要查询你的core trm手册。

例如我们查询到Cortex-A53的cache信息如下:


L1 I-Cache

  • 可配:8KB, 16KB, 32KB, or 64KB

  • cacheline:64bytes

  • 2路组相连

  • 128-bit的读L2 memory的接口

L1 D-Cache

  • 可配:8KB, 16KB, 32KB, or 64KB

  • cacheline:64bytes

  • 4路组相连

  • 256-bit的写L2 memory的接口

  • 128-bit的读L2 memory的接口

  • 64-bit的读L1到datapath

  • 128-bit的写datapath到L1

L2 cache

  • 可配置的: 128KB, 256KB, 512KB, 1MB and 2MB.

  • cacheline:64bytes

  • Physically indexed and tagged cache(PIPT)

  • 16路组相连的结构


因为有了多路组相连这个cache,所以也就有了一些术语概念:

  • index :用白话理解,其实就是在一块cache中,一行一行的编号(事实是没有编号/地址的)

  • Set :用index查询到的cache line可能是多个,这些index值一样的cacheline称之为一个set

  • way:用白话来说,将cache分成了多个块(多路),每一块是一个way

  • cache TAG :查询到了一行cache后,cachelne由 TAG + DATA组成

  • cache Data :查询到了一行cache后,cachelne由 TAG + DATA组成

  • cache Line 和 entry 是一个概念



6.cache的种类(VIVT,PIPT,VIPT)


cache一般是有如下种类;

  • PIPT

  • VIVT

  • VIPT

在一个core中一个架构中一个SOC中,你所使用的cache是哪种类型的,都是固定的,是软件改不了的。 在ARM架构中,一般L1 cache都是VIPT的,其余的都是PIPT的。VIPT和PIPT的原理,基本也都是一样的,只是硬件查询时稍微有一丁点的区别,在后续讲cache查询时会再次介绍。

那么,你还学什么VIVT?你为什么还要去理解VIVT的原理?你为什么还要去分析cache同名、重名的问题?这样的问题,在armv7/armv8/armv9架构中都是不存在的


7.cache的分配策略(alocation, write-through, write-back)


  • 读分配(read allocation) 当CPU读数据时,发生cache缺失,这种情况下都会分配一个cache line缓存从主存读取的数据。默认情况下,cache都支持读分配。

  • 写分配(write allocation) 当CPU写数据发生cache缺失时,才会考虑写分配策略。当我们不支持写分配的情况下,写指令只会更新主存数据,然后就结束了。当支持写分配的时候,我们首先从主存中加载数据到cache line中(相当于先做个读分配动作),然后会更新cache line中的数据。

  • 写直通(write through) 当CPU执行store指令并在cache命中时,我们更新cache中的数据并且更新主存中的数据。cache和主存的数据始终保持一致。

  • 写回(write back) 当CPU执行store指令并在cache命中时,我们只更新cache中的数据。并且每个cache line中会有一个bit位记录数据是否被修改过,称之为dirty bit(翻翻前面的图片,cache line旁边有一个D就是dirty bit)。我们会将dirty bit置位。主存中的数据只会在cache line被替换或者显示的clean操作时更新。因此,主存中的数据可能是未修改的数据,而修改的数据躺在cache中。cache和主存的数据可能不一致 




8.架构中定义的cache的范围(inner, outer)


对于cacheable属性,inner和outer描述的是cache的定义或分类。比如把L1/L2看做是inner cache,把L3看做是outer cache。

通常,内部集成的cache属于inner cache,外部总线AMBA上的cache属于outer cache。例如:

  • 对于big.LITTLE架构(A53为例)中,L1/L2属于inner cache,如果SOC上挂了L3的话,则其属于outer cache

  • 对于DynamIQ架构(A76为例)中,L1/L2/L3属于inner cache,如果SOC上挂了System cache(或其它名称)的话,则其属于outer cache

然后我们可以对每类cache进行单独是属性配置,例如:

  • 配置 inner Non-cacheable 、配置 inner Write-Through Cacheable 、配置 inner Write-back Cacheable

  • 配置 outer Non-cacheable 、配置 outer Write-Through Cacheable 、配置 outer Write-back Cacheable 



对于shareable属性,inner和outer描述的是cache的范围。比如inner是指L1/L2范围内的cache,outer是指L1/L2/L3范围内的cache



9.架构中内存的类型


在arm架构中,将物理内存分成了device和normal两种类型




而是每种的内存下(device和normal)又分出了多种属性。ARM提供一个 MAIR寄存器, 将一个64位的寄存器分成8个attr属性域,每个attr属性域有8个比特,可配置成不同的内存属性。也就是说,在一个arm core,最多支持8中物理内存类型。



而我们在MMU使用的页表的entry中的属性位中,BIT[4:2]占3个比特,表示index,其实就是指向MAIR寄存器中的attr。(Attribute fields in stage 1 VMSAv8-64 Block and Page descriptors)



  • PBHA, bits[62:59] :for FEAT_HPDS2

  • XN or UXN, bit[54] :Execute-never or Unprivileged execute-never

  • PXN, bit[53] :Privileged execute-never

  • Contiguous, bit[52] :translation table entry 是连续的,可以存在一个TLB Entry中

  • DBM, bit[51] :Dirty Bit Modifier

  • GP, bit[50] :for FEAT_BTI

  • nT, bit[16] :for FEAT_BBM

  • nG, bit[11] :缓存在TLB中的翻译是否使用ASID标识

  • AF, bit[10] :Access flag, AF=0后,第一次访问该页面时,会将该标志置为1. 即暗示第一次访问

  • SH, bits[9:8] :shareable属性

  • AP[2:1], bits[7:6] :Data Access Permissions bits,

  • NS, bit[5] :Non-secure bit

  • AttrIndx[2:0], bits[4:2]


也就是说,页表的每一个entry中,都指向MAIR寄存器中的一个属性域。也就是页表的每一个entry都配置了一种内存类型。如下所示,便很好的展示了,MMU页表的每一个page descriptor(也叫entry)都指向一个内存属性类型。



10.cache的查询原理


高速缓存控制器(cache controller )是负责管理高速缓存内存的硬件块,其方式对程序来说在很大程度上是不可见的。它自动将代码或数据从主存写入缓存。它从core接收读取和写入内存请求,并对高速缓存或外部存储器执行必要的操作。

当它收到来自core的请求时,它必须检查是否能在缓存中找到所请求的地址。这称为缓存查找(cache look-up)。它通过将请求的地址位的subset(index)与与缓存中的physical TAG 进行比较来做到这一点。如果存在匹配,称为命中(hit),并且该行被标记为有效,则使用高速缓存进行读取或写入。

当core从特定地址请求指令或数据,但与缓存标签不匹配或标签无效时,会导致缓存未命中,请求必须传递到内存层次结构的下一层,即 L2缓存或外部存储器。它还可能导致缓存行填充。缓存行填充会导致将一块主内存的内容复制到缓存中。同时,请求的数据或指令被流式传输到core。这个过程软件开发人员不能直接看到。在使用数据之前,core不需要等待 linefill 完成。高速缓存控制器通常首先访问高速缓存行内的关键字。例如,如果您执行的加载指令在缓存中未命中并触发缓存行填充,则内核首先检索缓存行中包含所请求数据的那部分。这些关键数据被提供给core流水线,而缓存硬件和外部总线接口随后在后台读取缓存线的其余部分。



总结一下就是:先使用index去查询cache,然后再比较TAG,比较TAG之后再检查valid标志位。但是这里要注意:TAG包含了不仅仅是物理地址,还有很多其它的东西,如NS比特位等,这些都是在比较TAG的时候完成。


11.cache的查询示例



假设一个4路相连的cache(如cortex-A710),大小64KB, cache line = 64bytes,那么 1 way = 16KB,indexs = 16KB / 64bytes = 256 (注: 0x4000 = 16KB、0x40 = 64 bytes)


0x*4000 -- index 0 0x4040 -- index 1 0x4080 -- index 2 ...... 0x*7fc0 -- index 255

0x*8000 -- index 0 0x8040 -- index 1 0x8080 -- index 2 ...... 0x*bfc0 -- index 255


细心的同学可以发现,这里就有了一个很大的问题,你用于cache look-up的index是vaddr[15:6], 如果granue size是4KB,那么vaddr[11:0] = paddrr[11:0] , 但是vaddr[15:12]比特并不等于paddrr[15:12] ,那么你这样的index查询的cache有效吗?会不会发生同名、歧义 ?

其实大可不必担心,因为对于每个core,L1是VIPT的,其实它们的L1 Cache TAG中,已经规定了physical address[39:12],正好是到BIT12。所以只要TAG比较之后,就不会出现同名和歧义。



连载文章第一篇:深入学习Cache系列 1: 带着几个疑问,从Cache的应用场景学起


如有兴趣与作者进一步沟通交流,可扫描下方二维码进群



Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
评论
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 68浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-12 10:13 34浏览
  • 应用环境与极具挑战性的测试需求在服务器制造领域里,系统整合测试(System Integration Test;SIT)是确保产品质量和性能的关键步骤。随着服务器系统的复杂性不断提升,包括:多种硬件组件、操作系统、虚拟化平台以及各种应用程序和服务的整合,服务器制造商面临着更有挑战性的测试需求。这些挑战主要体现在以下五个方面:1. 硬件和软件的高度整合:现代服务器通常包括多个处理器、内存模块、储存设备和网络接口。这些硬件组件必须与操作系统及应用软件无缝整合。SIT测试可以帮助制造商确保这些不同组件
    百佳泰测试实验室 2024-12-12 17:45 40浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 74浏览
  • 全球智能电视时代来临这年头若是消费者想随意地从各个通路中选购电视时,不难发现目前市场上的产品都已是具有智能联网功能的智能电视了,可以宣告智能电视的普及时代已到临!Google从2021年开始大力推广Google TV(即原Android TV的升级版),其他各大品牌商也都跟进推出搭载Google TV操作系统的机种,除了Google TV外,LG、Samsung、Panasonic等大厂牌也开发出自家的智能电视平台,可以看出各家业者都一致地看好这块大饼。智能电视的Wi-Fi连线怎么消失了?智能电
    百佳泰测试实验室 2024-12-12 17:33 46浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-12 10:27 46浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 83浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 109浏览
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 63浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 86浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 82浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 110浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦