3.2 Cortex-A9处理器 APU实现双核Cortex-A9 MP配置。每个处理器有自己的SIMD媒体处理引擎NEON、存储器管理单元(Memory Management Unit,MMU)和独立的32KB L1指令和数据高速缓存。每个Cortex-A9处理器提供了两个64位的AXI主接口用于到SCU的独立指令和数据交易。取决于地址和属性,这些交易连接到OCM、L2高速缓存、DDR存储器或者通过PS互联到PS内其他的从设备,或者互联到PL。每个带有SCU的处理器接口包含所要求的侦测信号,用于提供处理器内的L1数据缓存和用于共享存储器的共享L2缓存的一致性。Cortex-A9和它的子系统也提供了完整的Trustzone扩展,用于用户的安全性。 Cortex-A9处理器实现必要的硬件特性,用于程序调试和跟踪调试生成支持。处理器也提供了硬件计数器,用于处理器和存储器系统操作时搜集统计数据。 Cortex-A9内的主要子模块包括中央处理单元CPU、L1指令高速缓存和数据高速缓存器、存储器管理单元、NEON协处理器和内核接口。 3.2.1 中央处理器图3.3给出了Cortex-A9处理器的内核结构。每个Cortex-A9的CPU能在一个周期给出两个指令,并且以无序的方式执行。CPU实现动态地分支预测和可变长度的流水线,性能达到2.5DMIPs/MHz。Cortex-A9处理器实现ARM v7-A的结构、支持充分的虚拟存储器、能执行32位的ARM指令、16位及32位的Thumb指令和在Jazelle状态下的一个8位Java字节码。 图 3.3 Cortex-A9处理器的内核结构 1. 流水线 Cortex-A9 CPU内所实现的流水线,采用了高级取指和指令预测技术,它将潜在的存储器延迟引起的指令停止和分支解析分开。在Cortex-A9 CPU中,预加载最多四个指令缓存行,用于降低存储器延迟对指令吞吐量的影响。CPU取指单元能在每个周期连续发送2~4条指令到指令译码缓冲区,以保证高效地使用超标量流水线。CPU实现一个超标量解码器,能在一个周期内解码两个完整的指令。四个CPU流水线中的任何一个流水线都能从发送队列中选择指令。并行流水线支持每个周期贯穿下面单元的并行执行: 全部两个算术单元、加载-保存单元和任何分支的解析单元。 Cortex-A9 CPU采用了预测地执行指令,这样使能动态地重命名物理寄存器到一个虚拟可用的寄存器池中。CPU使用这个虚拟寄存器重命名来消除寄存器之间的依赖性,但不会影响到程序正确地执行。这个特性通过一个基于循环展开的有效硬件,允许代码的加速。同时,通过在相邻指令间消除数据的依赖性提高流水线的利用率。 Cortex-A9 CPU中的存储器系统内,提交相互依赖的加载-存储指令用于解析。这样,大大降低了流水线的停止。通过自动或者用户驱动地预取操作,Cortex-A9 CPU核支持最多四个数据缓存行填充要求。 CPU的一个关键的特性就是指令的无序写回。这样,就可以释放流水线资源,而不依赖于系统提供的、所要求数据的顺序。 在指令条件或者前面分支解析之前,或者需要写的数据可用之前,能预测地发出加载/保存指令。如果用于执行加载/保存的条件失败,可能产生的任何不利影响,例如刷新修改寄存器的行为。 思考题 3-3: ARM Cortex-A9双核处理器内采用了流水线结构,其特点主要体现在哪些方面?
2. 分支预测 为了减少在高度流水的CPU内分支所造成的不利影响,Cortex-A9内实现静态和动态地分支预测。由指令提供静态分支预测,在编译时候确定。动态地分支预测使用前面一个指定指令的执行结果,以确定是否采用分支。动态分支预测逻辑使用一个全局分支历史缓冲区(Global Branch History Buffer,GHB)。GHB是一个4096入口的表,包含用于指定分支的2位预测信息。当每次执行分支时,更新预测信息。 分支执行和整体的指令吞吐量也得益于分支目标地址缓存(Branch Target Address Cache,BTAC)的实现。BTAC保存着最近分支的目标地址。这个512入口的地址缓存的结构是2路×256入口。基于计算的有效地址和转换的物理地址,在产生真正的目标地址前,用于指定分支的目标地址提供给预加载单元。此外,如果一个指令循环适配四个BTAC入口,关闭指令缓存访问,以降低功耗。 Cortex-A9 CPU能预测条件分支、无条件分支、间接分支、PC目的数据处理操作和在ARM和Thumb状态之间切换的分支。然而,不能预测下面的分支指令: (1) 在状态之间切换的分支(除了ARM到Thumb转换和Thumb到ARM转换以外); (2) 当它们用于从异常返回时,不能预测带有S后缀的指令,因为它们可能改变特权模式和安全性状态,对程序的执行有不利的影响; (3) 所有用于改变模式的指令。 通过将CP15 c1控制寄存器的Z比特设置为1,使能程序流预测。在打开程序流预测前,必须执行一个BTAC刷新操作。其额外的效果是将GHB设置为一个已知状态。 Cortex-A9也用一个8入口的返回堆栈缓存,保存了32位子程序的返回地址。这个特性大大降低了执行子程序调用带来的不利影响,可以寻址最大8级深度的嵌套例程。 思考题 3-4: 分支预测是指什么?在Cortex-A9双核处理器内采用了什么分支预测策略?
3. 指令和数据对齐 ARM的结构指定了ARM指令为32位宽度,要求其为字对齐方式。Thumb指令是16位宽度,要求半字对齐。Thumb-2指令是16位或者32位宽度,也要求半字对齐。数据访问可以是非对齐的,CPU内的保存/加载单元将其分解为对齐地访问。当要求的时候,将来自这些访问的数据插入并发送到CPU内的寄存器文件中。 注: 应用处理单元APU和PS整体,只支持用于指令和数据的小端结构。
4. 跟踪和调试 Cortex-A9处理器实现ARM v7调试结构。处理器的调试接口由下面构成: (1) 一个基准CP14接口,用于实现ARM v7调试结构和ARM结构参考手册上所描述的一套调试事件; (2) 一个扩展的CP14接口,实现这个处理器指定的一套调试事件(ARM结构参考手册上进行了解释); (3) 通过一个调试访问端口DAP,一个外部的调试接口连接到外部的调试器。 Cortex-A9包含一个程序跟踪模块,该模块提供了ARM CoreSight技术,用于其中一个Cortex-A9处理器程序流跟踪能力,并且提供了观察处理器真实指令流的能力。Cortex-A9程序跟踪宏(Programm Trace Module,PTM)使得对所有代码分支和带有周期计数使能统计分析的程序流变化可见。PTM模块和CoreSignt设计工具使得软件开发者,能够非强制性地跟踪多个处理器的执行历史。并且,通过标准的跟踪接口,将带有校正时间戳的这些历史信息保存到片上缓冲区或者片外存储区。这样,就提高了开发和调试过程的可视性。 Cortex-A9处理器也实现程序计数器和事件监控器,用于搜集处理器和存储器操作时的统计信息。 3.2.2 L1高速缓存两个Cortex-A9处理器中的每一个处理器,都有独立的32KB L1指令高速缓存和数据高速缓存。L1缓存的公共特性包括: (1) 使用系统控制协处理器,能独立地禁止每个缓存; (2) 所有L1缓存的缓存行长度为32个字节; (3) 所有的缓存是4路组关联结构; (4) L1缓存支持4KB、64KB、1MB和16MB的虚拟存储器页; (5) 两个L1缓存不支持锁定特性; (6) L1缓存有64位的接口与整数核和AXI主接口相连; (7) 缓存替换策略为伪轮询或者伪随机,在缺失时,读取淘汰计数器,如果没有分配,则在分配时,递增,在组中,优先使用淘汰计数器替换一个无效的行; (8) 当缓存缺失时,首先执行关键字填充缓存; (9) 为了降低功耗,利用许多缓存操作为连续性质的优势,减少读全部缓存的次数,如果一个缓存读和前面的缓存读是连续的,并且是在一个相同的缓存行内读取,则只访问之前所读取的数据RAM组; (10) L1缓存支持奇偶校验; (11) 所有存储器的属性输出到外部存储器系统; (12) 支持TrustZone安全性,将安全或者不安全的状态输出到缓存和存储器中; (13) 在复位时,清除L1缓存内容,以遵守安全性要求。 注: 用户在使用指令缓存、数据缓存和BTAC前,必须使它们无效。即使为了安全性的原因,也不要求无效主TLB。这样保证兼容未来处理器的版本。
L1指令一侧的缓存负责给Cortex-A9处理器提供一个指令流。L1缓存直接和预取单元接口。预取单元包含一个两级预测机制。L1指令缓存为虚拟索引和物理标记。 L1数据一侧的缓存负责保留Cortex-A9处理器所使用的数据。L1数据缓存的关键特性包括: (1) 数据缓存为物理索引和物理标记; (2) 数据缓存是非阻塞的,因此加载/保存指令能连续地命中缓存,同时执行由于先前读/写缺失所产生的来自外部存储器的分配,数据缓存支持4个超前地读和4个超前地写; (3) CPU能支持最多4个超前的预加载指令,然而明确的加载/保存指令有较高的优先级; (4) Cortex-A9 加载/保存单元支持预测的数据预加载,用于监视程序顺序的访问,在请求开始前开始加载下一个期望的行,使用cp15辅助控制寄存器(DP位),使能这个特性,在分配前可以不使用这个预取行,预加载指令有较高的优先级; (5) 数据缓存支持两个32字节行填充的缓冲区和一个32字节的替换(淘汰)缓冲区; (6) Cortex-A9 CPU有一个带64位槽和数据合并能力的保存缓冲区; (7) 所有数据读缺失和写缺失是非阻塞的,支持最多4个超前数据读缺失和4个超前数据写缺失; (8) APU数据缓存使用MESI算法,完整地侦听一致性控制; (9) Cortex-A9内的数据缓存包含本地保存/加载互斥监视程序,用于LDREX/STREX同步,这些指令用于实现信号量,互斥监控程序只管理带有8个字或者一个缓存行颗粒度的一个地址,因此避免交错的LDREX/STREX序列,并且总是执行一个CLREX指令,作为任何上下文切换的一部分; (10) 数据缓存只支持写回/写分配策略,不实现写通过和写回/非写分配策略; (11) 对于L2缓存,L1数据缓存支持互斥操作,互斥操作是指只有在L1或者L2内的一个缓存行是有效的,一行填充到L1,引起该行在L2内标记为无效,同时淘汰L1中一行,将使得该行分配到L2中(即使它不是“脏”的),来自L2脏的一行填充到L1时,将淘汰该行到外部存储器中,默认时禁止互斥操作,这样使得增加缓存的利用率和减少功耗。 思考题 3-5: 请说明Cortex-A9的L1结构特点,以及替换策略。 3.2.3 存储器管理单元ARM结构中的存储器管理单元(Memory Management Unit,MMU)主要负责存储器保护和地址转换。在虚拟地址到物理地址的转换过程中,MMU与L1和L2存储器系统一起密切地工作。它也控制对外部存储器的访问,以及接受来自外部存储器的访问。 MMU和虚拟存储器系统结构版本7(VMSAv7)兼容,要求支持4KB、64KB、1MB和16MB页表入口和16个访问域。该单元提供了全局和应用程序指定的标识符,因此免除在上下文切换时需要对TLB进行刷新地操作; 同时,提供了用于扩展许可检查的能力。 处理器实现ARMv7-A MMU,提供了扩展的安全性和多处理器扩展。这种扩展提供地址转换和访问许可检查。MMU控制表搜索硬件,该硬件用于访问主存内的转换表。通过一组虚拟地址到物理地址映射,以及保存在指令和数据转换表TLB内的存储器属性,MMU提供了对存储器系统更好的颗粒度控制。 MMU负责下面的操作: (1) 检查虚拟地址和地址空间标识符(Address Space Identifer,ASID); (2) 检查区域访问许可; (3) 检查存储器属性; (4) 虚拟地址到物理地址转换; (5) 支持4个页面(区域)大小; (6) 访问缓存或者外部存储器映射; (7) 可锁定主TLB内的4个入口。 图3.4给出了MMU的块图结构。 图 3.4 MMU块图结构 1. 存储器访问顺序 当处理器产生一个存储器访问后,MMU执行下面的步骤: (1) 在相关的指令或者数据microTLB中,查找于所要求虚拟地址、当前地址空间标识符和安全状态; (2) 如果在microTLB中缺失,则在主TLB内,查找所要求的虚拟地址、当前地址空间标识符和安全状态; (3) 如果在主TLB中缺失,则执行一个硬件转换表搜索。 MMU可能没找到全局映射,或者用于当前所选择地址空间标识符的映射,这个空间标识符带有一个匹配的用于TLB内虚拟地址的不安全TLB ID(NSTID)。在这种情况下,如果使能TLB控制寄存器硬件内的PD0和PD1位,则进行一个转换表的搜索。否则,如果禁止,则处理器返回一个部分转换故障。 如果MMU找到一个匹配的TLB入口,它使用入口内的如下信息: (1) 访问许可位和区域决定是否使能访问。如果匹配入口没有通过许可检查,MMU发出一个存储器退出信号。 (2) 在TLB入口和CP15 c10重映射寄存器内指定的存储器区域属性,控制缓存和写缓冲区。并且决定访问是: ①安全或不安全的; ②共享或者非共享; ③普通的存储器、设备或者强顺序的。 (3) MMU将虚拟地址转换为物理地址,用于存储器访问。 如果MMU没有找到匹配的入口,则产生硬件表搜索。 2. TLB的结构和匹配 Cortex-A9 MMU包含两级TLB,包含用于指令和数据统一的TLB和用于每一个的单独的micro TLB。第1级TLB的micro TLB,每个都有32个全关联的入口。如果在一个相应的micto TLB内,缺失一个取指或者加载/保存地址,则访问统一的主TLB。统一的主TLB提供了一个2路关联的2×64入口的表(128个入口)。通过使用入口锁定模型,支持4个可锁定的入口。TLB使用一个伪轮询替换决策策略。当出现缺失时,决定应该替换TLB中的哪个入口。 不像其他处理器要求软件负责更新驻留在主存内的页转换表TLB,Cortex-A9支持硬件页表的搜索,以执行L1数据缓存内的查找。这样允许缓存页表。 通过设置转换表基地址寄存器(Translation Table Base Register,TTBR)内IRGN位,可以配置MMU执行可缓存区域内的硬件转换表搜索。如果对IRGN比特编码是写回,则执行一个L1数据缓存查找。这样,从数据缓存读取数据。如果对IRGN比特编码是写通过或者非缓存,则访问外部存储器。 TLB入口可以是全局的,或者通过使用与那些进程相关的ASID,将TLB入口分配到一个特殊的进程或者应用程序。ASID使得在上下文切换时,保持驻留TLB入口,以避免要求随后重新加载它们。 注: ARM Linux内核,不是基于每个CPU,而是贯穿所有的CPU全局来管理8位的TLB ASID空间。对ASID递增,用于每个新的进程。当回卷ASID(ASID=0)时,TLB的刷新请求发送给所有的CPU。然而,只有在一个上下文切换中间的CPU立即更新它当前ASID上下文,而其他的CPU使用它当前回卷前的ASID继续运行,直到发生一个调度间隔为止。随后,上下文切换到一个新的进程。
通过集成在核内的专门协处理器-CP15,控制TLB的维护和配置。这个协处理器提供一个标准的机制,用于配置L1存储器系统。 每个TLB入口包含一个虚拟地址、一个页面大小、一个物理地址和一套存储器属性。标记每个TLB入口正在关联一个特殊的应用程序空间,或者其作为一个全局用于所有的应用程序空间。如果与被修改的虚拟地址(Modified Virtual Address,MVA)的比特[31:N] 匹配,则与一个TLB入口匹配。其中,N=log2(页面大小)。它或者标记为全局,或者ASID匹配当前的ASID。 当下面条件为真时,匹配一个TLB入口: (1) 它虚拟的地址,匹配所要求的地址; (2) 它不安全的TLB ID(NSTID)匹配MMU请求的安全或者不安全状态; (3) 它的ASID匹配当前的ASID,或者它是全局的。 在任意时刻,操作系统必须保证大多数情况下匹配一个TLB入口。基于下面的块大小,一个TLB可以保存入口: (1) Supersections: 16MB存储器块。 (2) Sections: 1MB存储器块。 (3) Large pages: 64KB存储器块。 (4) Small pages: 4KB存储器块; 支持Supersections、Sections和Large pages,只使用TLB内的一个单个的入口,允许映射大的存储区域。如果在TLB内没有找到地址映射,则硬件自动读转换表,将映射放在TLB内。 思考题 3-6: 请说明Cortex-A9双核处理器的存储器管理单元的结构和功能。 思考题 3-7: 请说明Cortex-A9双核处理器的TLB的结构和替换策略。 3.2.4 接口1. AXI和一致性接口 每个Cortex-A9处理器提供两个64位的伪AXI主接口,用于独立的指令加载和数据交易。这些接口工作时,与处理器核(CPU_6x4x时钟)具有相同的速度。当复制数据穿过一个缓存的存储器区域时,能在每5个处理器时钟周期支持4个双字写操作。指令侧接口是只读接口,没有写通道。这些接口实现一个扩展版本的AXI协议,它提供了到L2缓存的多重优化,其中包括支持L2预取提示和预测的存储器访问。 基于它们的地址,AXI交易通过SCU连接到OCM或者L2缓存控制器。每个Cortex-A9也提供了一个到SCU的高速缓存一致性总线(Cache Coherency Bus,CCB),用于提供L1和L2缓存间的所要求的一致性管理信息。 2. 调试和跟踪接口 每个Cortex-A9处理器有一个标准的32位APB从接口,该接口工作在CPU_1x时钟频率。通过SOC调试模块内的调试APB总线主设备,访问这个接口。 Cortex-A9处理器也包含一对接口,用于跟踪产生和交替触发控制。来自每个核的跟踪源接口是一个32位CoreSight标准的ATB主接口,其工作在PS互连的速度(CPU_2x Clock)下,该接口连接到SOC调试模块的漏斗形通道上。每个核有一个4位标准的CoreSight交叉触发器接口,其工作在互连时钟频率(CPU_2x Clock)上,该接口连接到SOC调试模块内的交叉触发器开关阵列(Cross Trigger Matrix,CTM)上。 3. 其他接口 每个Cortex-A9处理器有多个控制位,这些位由系统级控制寄存器(System Level Control Register,SLCR)驱动。其中包括: (1) 一个4位的接口,用于驱动CoreSight标准安全信号; (2) 用于控制CP15和软件的可编程性的静态配置信号。 3.2.5 NEONCortex-A9 NEON MPE扩展了Cortex-A9的功能,提供了对ARM v7高级SIMD和向量浮点(VFPv3)指令集的支持。Cortex-A9 NEON MPE支持所有的寻址模式和数据处理操作。Cortex-A9 NEON MPE的特性主要包括: (1) SIMD向量和标量单精度浮点计算: ①无符号和有符号整数; ②单比特系数多项式; ③单精度浮点值。 (2) NEON 协处理器支持的操作: ①加法和减法; ②带有可选累加的乘法; ③最大或者最小值驱动通道选择操作; ④平方根倒数的估计; ⑤广泛的数据结构加载指令,包含寄存器组驻留表查找。 (3) 标量双精度浮点计算。 (4) SIMD和标量半精度浮点转换。 (5) 8位、16位、32位和64位有符号和无符号整数SIMD计算。 (6) 用于单比特系数的8位或16位多项式计算。 (7) 结构化数据的加载能力。 (8) Cortex-A9处理器执行两个ARM或者Thumb指令。 (9) 独立的流水线用于VFPv3和高级SIMD指令。 (10) 大的,共享的寄存器文件,可寻址作为: ①32个32位的S(单)寄存器; ②32个64位的D(双)寄存器; ③16个128位的Q(四)寄存器。 3.2.6 性能监视单元Cortex-A9处理器包含一个性能监视单元(Performance Monitoring Unit,PMU),该单元提供了6个计数器来搜集处理器和存储器系统操作时的统计数字。每个计数器能计数任何在Cortex-A9处理器中可用的58个事件中的一个。通过来自CP15的接口和DAP接口,访问PMU计数器和它们相关的控制寄存器。 3.3 侦听控制单元SCU模块将两个Cortex-A9处理器连接到存储器子系统,并且管理两个处理器和L2缓存之间的缓存一致性。这个模块负责管理互联仲裁、通信、缓存和系统存储器传输,以及Cortex-A9处理器的缓存一致性。APU也将SCU的能力开放给通过ACP接口所连接的、PL内所实现的加速器。这个接口允许PL主设备共享和访问处理器的缓存“层次”(不同的缓存结构)。所提供的系统一致性不但改善了性能,也减少了软件的复杂度(否则需要在每个操作系统的驱动程序中负责维护软件的一致性)。 SCU模块通过一个缓存一致总线(Cache Coherency Bus,CCB)与每个Cortex-A9处理器通信,并且负责L1和L2缓存一致性管理。SCU支持MESI侦听,通过避免不必要的系统访问,改善了功耗和系统性能。模块实现复制4路关联标记RAM,其用作一个本地目录。该目录列出了保存在CPU L1数据缓存的一致性缓存行。该目录允许SCU高速地检查数据是否是L1数据缓存内的数据。并且,不会打断CPU的工作。此外,过滤访问,这个访问只能是共享数据的处理器。 SCU能将一个处理器缓存的干净数据复制到另一个处理器的缓存,这样不需要主存访问来执行这个任务。而且,它能在处理器间移动脏的数据,扫描共享状态和避免写回操作带来的延迟。 注: Cortex-A9处理器不能直接修改L1缓存的内容,因此不保证L1指令缓存间的一致性。 3.3.1 地址过滤SCU的一个功能是基于它们的地址,过滤处理器和ACP产生的交易。并且,将其连接到相应的OCM或者L2控制器。SCU内的地址过滤的颗粒度是1MB。因此,所有用于处理器的访问或者通过ACP的访问,当地址在1MB窗口内时,其目标只能是OCM或者L2控制器。在SCU内默认的地址过滤设置是将4G地址空间内的高1MB和低1MB地址连接到OCM,剩余的地址连接到L2控制器。 3.3.2 SCU主设备端口每个连接到L2或者OCM的SCU AXI主端口有下面的写和读发布能力: 1) 写发布能力 (1) 每个处理器10个写交易: ①8个非缓存写; ②2个来自L1中的替换。 (2) 2个额外的写用于来自SCU的替换流量。 (3) 来自ACP多于3个的写交易。 2) 读发布能力 每个处理器14个读交易: ①4个指令读; ②6个行填充读; ③4个非缓存读; ④来自ACP多于7个读交易。 思考题 3-8: 请说明Cortex-A9双核处理器的SCU的功能和结构特点。 3.4 L2高速缓存L2高速缓存基于ARM PL310,包含一个8路组关联的512KB缓存,用于Cortex-A9双核处理器。L2是物理可寻址和物理标记的,支持固定的32字节行大小。L2缓存的主要特点包括: (1) 支持使用MESI算法的侦测一致性控制。 (2) 提供用于L2缓存存储器的奇偶校验。 (3) 支持SMP模式下的预测读操作。 (4) 提供L1/L2互斥模式(如数据可以存在其中的一个,但并不是全部)。 (5) 每个主设备可以基于主设备、行或者路锁定L2。 (6) 实现16个入口深度的预加载引擎,用于加载数据到L2缓存存储器。 (7) 为改善延迟,支持关键字首行填充。 (8) 使用带有决策选项的伪随机替换选择策略: ①写通过和写回; ②读分配、写分配、读和写分配。 (9) 在复位的时候,清除L2的数据和标记RAM的内容,遵守所要求的安全性。 (10) L2控制器实现多个256位行缓冲区,以改善缓存的效率: ①用于外部存储器的行填充缓冲区(Line Fill Buffer,LFB),在L2缓存存储器内创建一个完整的缓存行,4个LFB用于支持AXI交替读; ②两个256位缓存行读缓冲区,用于每个从端口,当命中缓存时,这些缓冲区保存来自L2缓存的一个缓冲行; ③三个256位的替换缓冲区保存着来自L2缓存淘汰的缓存行,这些缓存行将要写回到主存储器中; ④在送到主存储器或者L2缓存以前,三个256位的保存缓冲区保存着可缓冲的写。这样,可以将到相同缓存行的多个写合并在一起。 (11) 在4k边界内,控制器实现可选择的缓存行预取操作。 (12) L2缓存控制器将来自L1的互斥请求提交给DDR、OCM或者外部存储器。 注: SCU不能保证在指令和数据L1缓存之间的一致性,所以需要使用软件保持其一致性。
L2高速缓存实现TrustZone安全性扩展,用来提供扩展的操作系统安全性。在标记RAM上添加一个不安全NS的标记位,用来作为一个地址比特位,用于在相同的路内进行查找。NS标记也添加在所有缓冲区内。标记RAM内的NS比特位,用来确定到DDR和OCM的淘汰的安全性。控制器限制非安全访问控制、配置和维护寄存器,限制其对安全数据的访问。 缓存控制器通常的行为取决于Cortex-A9的交易。下面给出了不同类型交易的描述。 1) 可缓冲的 在到达交易的目的地时,互联或者任何一个它的元件可以将交易延迟任意数量的周期。这通常只和写相关。 2) 可缓存的 最终目的的交易不必出现原始交易的特征。对于写,这意味着可以将很多写合并在一起。对于读,这意味着可以预加载一个位置,或者对于多个读只加载一次。确定是否应该缓存一个交易,这个属性应该和读分配和写分配属性一起使用。 3) 读分配 对于一个读传输,如果在缓存中缺失,则应该为它分配缓存。如果传输是不可缓存的,则这个属性无效。 4) 写分配 对于一个写传输,如果在缓存中缺失,则应该为它分配缓存。如果传输是不可缓存的,则这个属性无效。 在ARM的结构中,内在属性用来控制L1缓存和写缓冲区的行为,外部的属性输出到L2或者外部存储器系统。 类似大多数的现代处理器,在Cortex-A9处理器系统中,为了改善性能和功耗,执行很多级的系统优化。这些优化不能完全地隐藏(不被外部看到),这可能引起所希望顺序执行模型的冲突,这些优化例子有: (1) 发出的多个预测和无序执行; (2) 合并加载/保存操作,用于最小化加载/保存延迟; (3) 在一个多核处理器内,基于硬件的一致性管理可能引起缓存行在处理器之间透明的迁移,这样导致不同的处理器核以不同的顺序看到对缓存存储器位置的更新; (4) 当通过ACP将外部主设备被包含在一致性系统内时,外部系统特性可以产生新的额外竞争。 因此,定义一个规则是至关重要的,这个规则用于限制一个CPU核访问存储器的顺序。这个访问的顺序涉及周围的指令,或者能被多核处理器系统的另一个处理器所观察到。典型地,存储器分成以下几类: 1) 标准的 典型的,这种存储器类型应用于所有的数据和可执行的代码。并且,允许预测地读、合并访问和重复地写(当一个异常打断写过程时)。但是,并没有任何不利的影响。当访问标准的存储器时,总是能进行缓冲操作。并且,在大多数条件下,总能缓存这些操作。但是,它们可以被配置成非缓存的。除了有单纯的地址依赖性和控制依赖性外,访问标准的存储器并不需要有固有的顺序。 2) 强顺序的 典型地,这种存储器应用于存储器映射的外设或者控制寄存器。根据程序所指定的次数访问这些类型的存储器。然而,在存储器访问不同的外设或者在访问不同存储器类型时,并不保证顺序。 3) 设备 这个存储器类型类似于强顺序存储器类型。不同之处在于,设备存储器可以是共享或者是非共享的。 3.4.1 互斥 L2-L1高速缓存配置互斥的缓存配置模式中,Cortex-A9处理器的L1数据缓存和L2缓存是互斥的。在任何时候,将一个给定的地址缓存在L1数据缓存或者L2缓存内,但不是所有(也就是说,L1和L2是互斥的)。这样增加了L2缓存的可用空间和使用效率。当选择互斥的缓存配置时: (1) 修改数据缓存替换行策略,这样在L1内的淘汰缓存行总是被淘汰到L2(即使它是干净的); (2) 如果L2缓存的一行是脏的,则来自处理器的对这个地址的读请求,引起写回到外部存储器,以及到处理器的行填充。 必须将所有的L1和L2缓存行配置成互斥的。通过使用L2的辅助控制寄存器的12比特位和Cortex-A9内的ACTLR寄存器的7比特,将L2和L1缓存配置成互斥操作。 对于读,行为如下: (1) 对于一个命中,缓存行标记为非有效的(复位标记RAM的有效位),“脏”位比特不变,如果设置“脏”比特位,未来的访问仍然能命中这个缓存行,但是该行是未来替换的首选; (2) 对于一个缺失,不分配到该行L2缓存。 对于写,取决于SCU的属性值。该属性值用来指示写交易是否是一个来自L1存储器的替换,以及是否是一个干净的替换。AWUSERS[8]属性表示一个替换,AWUSERS[9]表示一个干净的替换。行为总结如下: (1) 对于一个命中,该行标记为“脏”,除非AWUSERS[9:8]=11。这种情况下,“脏”位不变; (2) 对于一个缺失,如果缓存行被替换(AWUSERS[8]=‘1’),则分配缓存行。取决于它是否是“脏”的替换,来确定它的“脏位”状态。如果缓存行存在“脏”的替换(AWUSERS[8]=‘0’),则只有在它被写分配时,才为其分配缓存行。 3.4.2 高速缓存替换策略辅助控制寄存器的比特[25]用于配置替换策略。该策略是基于轮询或者伪随机的算法。 (1) 轮询替换策略: 首先填充无效的和未锁定的路。对于每一行,当路都是有效或者锁定时,替换下来的将选作下一个未锁定的路。 (2) 伪随机替换策略首先填充无效的和未锁定的路; 对于每一行,当路都是有效或者锁定时,在未锁定的路之间随机选择替换者。 当要求一个确定的替换策略时,使用锁定寄存器阻止对路进行分配。例如,由于L2缓存是512KB和8路组关联的,每路为64KB。使用一个确定性的替换策略时,如果一段代码要求驻留在两个路(128KB),则在代码填充到L2缓存前,必须锁定1~7路。如果开始的64KB只分配给第0路,则必须锁定第0路,将第1路解锁,这样剩下的64KB能分配给第1路。 这里有两个锁定寄存器,一个用于数据,另一个用于指令。如果要求的话,一个锁定寄存器就能将数据和指令分割到L2缓存内各自的路。 3.4.3 高速缓存锁定允许按照行、路或者主设备(包括CPU和ACP主设备),锁定L2缓存控制器入口。可以同时实现行锁定和路锁定。然而,路锁定和主设备锁定是互斥的。这是由于路锁定是主设备锁定的子集。 1. 行锁定 当使能时,标记所有新分配的缓存行为锁定状态。控制器认为已经锁定新分配的缓存行,并且不会自然替换这些新分配的缓存行。通过设置行使能寄存器(LER)的[0]比特位,使能行锁定。标记RAM的[21]比特位给出了每个缓存行的锁定状态。 注: 一个行锁定使能的例子是,当一个关键部分的软件代码加载到L2缓存中。
后台对所有的行进行解锁操作,解锁所有由行锁定机制标记为锁定的行。这个操作的状态通过读解锁所有行寄存器(Unlock All Line Register,UALR)进行检查。当正在执行对所有行进行解锁的操作时,用户不能启动一个后台缓存维护操作。如果尝试这样操作,将返回一个SLVERR错误。 2. 路锁定 L2缓存是8路组关联的,允许用户将基于路的策略用于锁定替换算法。使能设置计数从8路所有的路数减少到直接的映射。32位的缓存地址由下面的域构成: [Tag Field],[Index Field],[Word Field],[Byte Field]当查找一个缓存时,索引定义了所要查找的缓存路的位置。路数定义了带有相同索引的位置个数,称之为一个组。因此,一个8路组关联缓存有8个位置。这些位置存在带有索引A的地址。在512K L2缓存内,有211或者2024个标记。 锁定格式C,正如ARM结构参考手册所描述的那样,提供了一种方法,这种方法用于约束替换策略。该策略用于在组内分配缓存行。这种方法使得: (1) 提取代码或者加载数据到L2中; (2) 保护由于其他访问,导致的替换; (3) 这个方法也能减少缓存污染。 L2缓存控制器内的锁定寄存器,用于锁定L2缓存内8路中的任意一路。为了使用锁定,用户设置每个比特位为1,用于分别锁定每一路。例如,设置[0]比特用于0路,[1]比特用于1路。 3. 主设备锁定 主设备锁定特性是路锁定特性的超集。它使能多个主设备共享L2缓存,以及使L2行为好像是这些主设备有专用较小的L2缓存。这个特性使得用户L2,为特定的主设备ID号保留缓存的路。 由主设备实现的L2缓存控制锁定,最多只能区分8个不同的主设备。然而,在Cortex-A9 MP核内最多有64个AXI主设备ID号。表3.1给出了将64个主ID值分组为8个可锁定的组。 表 3.1 主设备ID组锁定
ID组 描述
A9核0 来自核0的所有8个读/写请求
A9核1 来自核1的所有8个读/写请求
A9核2 为将来保留
A9核3 为将来保留
ACP组0 ACP ID={000,111}
ACP组1 ACP ID={010,011}
ACP组2 ACP ID={100,101}
ACP组3 ACP ID={110,111}
|