ARMv8-A编程指导之Caches(3)

2 cache控制器

        Cache控制器为负责管理cache内存的硬件模块,它是以一种程序不可见的方式。它自动从主存中将代码或数据写到cache中。它从core中获取读写内存请求,并对cache内存或外部内存发起必要的行为。

        当它接受到来自core的请求时,它必须检查请求的地址是否在cache中。这就是cache查找过程。它是通过将请求的地址位的子集与cache中tag值做比较。若匹配即命中,cache line被标记为有效,可以使用cache中的内存进行读或写。

        当core请求某个地址的指令或数据时,在cache tag中没有匹配,或tag无效,cache没有命中,请求必须被传递到内存层次的下一级,如L2 cache或外部内存。它也会造成cache line的填充。同时请求的数据或指令被发送到core。这个过程是透明的且对软件开发者不可见。core不需要在使用数据前等待cache line填充的完成。cache控制器通常访问cache line中的critical word。比如,你发送一个加载指令,但在cache中没有命中,会触发cache line的填充,core首先取出包含请求的数据的部分cache line。这些critical数据被发送到core的流水线,同时cache硬件和外部总线接口然后在后台读取剩下的cache line。

3 cache策略

        当一个cache line被分配为数据cache,cache策略描述了当store指令执行且在数据cache中被命中时应该如何做。

        cache分配策略如下:

Write allocation(WA):

        一个cache line在写未命中时分配。这意味着在处理器上执行store指令可能会导致突发读产生。对于cache line,在写发出前通过linefill来获取数据。cache包含整个cache line,它是加载的最小单元,即使你仅在cache line写单个byte。

Read allocation(RA)

        一个cache line在读未命中时分配。

        cache更新策略如下:

Write-back(WB):

写只更新cache且将cache line标识为脏。当cache line被回收或明确的清除时才更新外部的内存。

Write-through(WT)

        写同时更新cache和外部内存系统,这不会标记cache line为脏。

        数据读在cache中命中的行为在WT和WB cache模式中一样。

        正常内存的cacheable属性可分为inner和outer属性。Inner和outer的分界线由实现决定的,这在Memory Ordering中最更详细的描述。通常,inner属性用于集成cache,outer属性用于外部cache使用的处理器内存总线。

        正常内存可能被处理器预测性访问,这意味着它可以自动将数据加载到cache中,而无需程序员显示的请求特定的地址。这也在Memory Ordering中最更详细的描述。

        但是它也可以让程序员提供暗示给core在将来那些数据可以被使用。ARMv8-A提供提前加载的暗示指令。它是由实现来定义是否cache支持预测和提前加载。下列指令有效:

  1. AArch64:PRFM PLDL1KEEP,[Xm, #imm]; 这表示提前从Xm+offset中加载到L1 cache中作为临时预取,这意味着数据可能被多次使用。
  2. AArch32:PLD Rm; 从Rm地址中提前加载数据到cache中

        更普遍的,A64指令用于预取内存的有如下形式:

PRFM <prfop>, addr

        这里,<prfop>  <type><target><policy> | #uimm5

<type> PLD对加载做预取,PST对store做预取

<target> L1/L2/L3

<policy> 用于保留和临时预取的KEEP意味着正常分配在cache中;用于streaming或非临时预取的STRM意味着内存只使用一次

Uimm5 表示暗示被编码为5bit。它是可选的。

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【课程简介】本课程是《Armv8/Armv9架构从入门到精通 第二期》中的第四章。建议购买大课程。本课程以为armv8-aarch64、armv9为基准,不涉及armv7及其以前的版本,也不涉及aarch32。本课程包含但不限于以下内容MMU的基础学习:啥是MMU?工作原理?MMU和cache之间的关系?及其怎样相互影响的?哪些是MMU硬件自动的行为?哪些是软件可配置的行为?地址空间基础:啥是虚拟地址空间?啥是物理地址空间?啥时memory-map? 代码程序中的虚拟地址空间是怎样的?arm core硬件决定的物理地址空间是怎样的?SOC memory-map时的地址空间是怎样的?具体的外设又是怎样的地址空间?Translation Regime:系统里有多少个MMU?系统里有多少个Translation Regime?他们之间的关系是怎样的?页表翻译:MMU是怎样翻译的?页表有几级?这些信息是怎么告诉MMU的,MMU又是怎样工作的,软件又需要怎样设计?stage1和stage2的区别和使用?Descriptor:啥是Descriptor、页表项、entry、条目、页表条目? Descriptor的格式是怎样的?每一个属性位是怎样的?MMU除了完成地址转换,属性权限的控制/cache的缓存策略是怎样配置的?optee中使用MMU的示例MMU深度思考篇:开启MMU瞬间可能出现的问题以及多种常用的解决方案。注意这里提到的是多种方案,绝大多数人只知道第一种,除此之外还有没有其它的设计方式? MMU关闭时cache的缓存策略会怎样?【思考】01、一个大系统中有多少个MMU ?02、一个ARM Core中有多少个Translation regime?03、EL1&0 Translation regime Stage2、EL2 Translation regime stage1、EL2&0 Translation regime stage1 这三者的区别是什么?04、TTBR1_EL2寄存器有啥特殊性,这个寄存器是给谁使用的?05、有没有TTBR1_EL3寄存器?为什么?06、什么是memory-map? 一个ARM的系统中,有几套物理地址空间?07、页表到底有几级? 页表最少可以有几级?页表最多可以有几级?08、页表有多大? 页表存放在哪里?页表由谁来管理?09、页表是否能放在cache中?10、什么是Translation Table walk? 什么是TLB?11、请简述页表查询的过程?12、在一个大系统中,物理地址是多少位的? 物理地址是多少位指的是什么?虚拟地址又是多少位的? 物理地址的位数和虚拟地址的位数都是由谁来决定的?13、请说明entry、descriptor、页表项、条目 这个四个词汇的由来?14、TCR中有缓存属性和共享属性、页表的entry中也有缓存属性和共享属性,这俩有什么区别?15、请简述TTBR0和TTBR1的概念和意义?16、请简述cacheability和shareability属性的含义?17、stage1和stage2有何区别?18、stage1和stage2的descriptor中,有很多重复的属性,当两者属性有冲突了怎么办?19、L1、L2、L2的descriptor中也有部分相同的属性,重复时怎么办?20、Descriptor的格式有哪几种?21、Descriptor的类型有哪几种?22、简述您所观察到的系统软件中(操作系统或hypervisor)的shareability和cacheability一般都是怎样配置的?23、开启一个MMU的步骤是怎样的?24、啥是flat map? 啥是full level table?25、页表中的AF属性位、DBM属性位分别是干啥的?26、页表中的nG属性位是干啥的?27、页表中的Contiguous属性位是干啥的?28、在开启MMU的瞬间会考虑哪些事情?【课程目录】当前21节课,6.8小时

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值