Intel系统编程指南第十一章——存储器Cache控制

这一章描述了Intel 64和IA-32处理器中的存储器Cache(译者注:C大写为名词)以及Cache控制机制、TLB、以及存储缓存。它也描述了在P6家族处理器中引入的存储器类型范围寄存器以及它们如何被用于控制物理存储器位置的cache(译者注:c小写作为动词使用,意思为快存,Cache映射)。

 

11.1 内部Cache、TLB和缓存

 

11.2 Cache术语

 

IA-32处理器(起始于奔腾处理器)和Intel 64处理器使用MESI(被修改的、排外的、被共享的、无效的)Cache协议来维护内部Cache和其它处理器中的Cache的一致性(见11.4小节)。

当处理器识别出正在从存储器被读的一个操作数可被Cache时,处理器读一整个Cache行到合适的Cache(L1、L2、L3或全部)。这个操作被称为一次Cache行填充。如果包含那个操作数的存储器位置在下一次处理器试图访问该操作数时仍然被Cache着,那么处理器可以直接从Cache而不是回到存储器读该操作数。这个操作被称为一次Cache命中

当处理器试图将一个操作数写到一个可被Cache的存储区域时,它首先检查那个存储器位置所对应的Cache行是否在Cache中存在。如果一个有效的Cache行存在,那么处理器(依赖于当前现行的写策略)可以将该操作数写到Cache,而不是写出到系统存储器。这个操作被称为一次写命中。如果一次写错过Cache(即,一个有效的Cache行不在正在被写的存储区域),那么处理器执行一次Cache行填充,写分配。那么它将该操作数写到Cache行,并且(依赖于当前现行的写策略)也可以将它写出到外部存储器。如果该操作数将被写出到存储器,它首先被写到存储缓存,然后从存储缓存再被写到存储器,当系统总线可用时。(注意,对于奔腾处理器,写失败并不会导致一次Cache行填充;它们总是导致一次对存储器的写。对于此处理器,只有读失败会导致Cache行填充)。

当在一个MP系统中操作时,IA-32处理器(开始于Intel486处理器)以及Intel 64处理器具有窥探其它处理器对系统存储器的访问以及对它们自己的内部Cache访问的能力。这些处理器使用这种窥探能力来保持它们内部Cache与系统存储器以及与总线上其它处理器中的Cache的一致性。比如,在奔腾以及P6家族处理器中,如果通过窥探一个处理器探测到另一个处理器打算写到一个存储器位置,而此位置,窥探处理器已经以共享状态cache了,那么窥探处理器将无效化其自己的Cache行,在下次自己访问相同的位置时,迫使自己执行一次Cache行填充。

从P6家族处理器开始,如果一个处理器探测到(通过窥探)另一个处理器正试图访问一个存储器位置,该位置窥探处理器已经在其Cache中修改了,但还没有写回到系统存储器,那么窥探处理器将对另一个处理器发出信号(利用HITM#信号),Cache行被保持为被修改状态,并将执行一次隐式的对被修改数据的写回。隐式的写回被直接传递到初始请求处理器并且由存储器控制器窥探,以确保系统存储器已被更新。这里,带有有效数据的处理器可以将数据传递给处理器,而不需要实际将此数据写到系统存储器;然而,存储器控制器负责窥探此操作并更新存储器。

 

11.3 可用的cache方法

 

11.4 Cache控制协议

 

以下小节描述了为Intel 64和IA-32架构当前定义的Cache控制协议。在L1数据Cache以及L2/L3统一Cache中,MESI(被修改的,排外的,共享的,无效的)Cache协议维护与其它处理器的Cache一致性。L1数据Cache和L2/L3统一Cache每个Cache行有两个MESI状态标志。每个行可以被标记为正处于表11-4所定义的其中一个状态中,MESI协议的操作对程序是透明的。

 

表11-4 MESI Cache行状态

 

Cache行状态                        M(Modified)              E(Exclusive)                   S(Shared)                      I(Invalid)

 

此Cache行是否有效                      是                               是                                     是                                    否

 

存储器拷贝为⋯⋯                     过期的                            有效的                              有效的                               ——

 

其它处理器的Cache中是否存在副本?    不                         不                                    可能                                 可能

 

一次对该行的写⋯⋯               不通往系统总线               不通往系统总线       使得处理器获得对该行的排外所有权   直接通往系统总线

 

在P6家族处理器中的L1指令Cache仅实现了MESI协议中的“SI”部分,因为指令Cache是不可写的。指令Cache监视器在数据Cache中改变以维护Cache之间的一致性,当指令被修改时。见11.6小节。

 

11.5 Cache控制

 

11.6 自修改代码

 

对当前被cache在处理器中的一个代码段中的一个存储器位置的写引起相关联的Cache行(或多个行)被无效化。这个检查基于指令的物理地址。此外,P6家族和奔腾处理器检查一次对一个代码段的写是否会修改一条已经被预取的指令。如果这个写影响了一条被预取的指令,那么这个预取队列被无效化。这后面的检查基于指令的线性地址。对于奔腾4和Intel至强处理器,对在一个代码段中的指令的一次写或一次窥探,而在这个代码段中,目标指令已经被译码并驻留在了踪迹Cache中,那么这会无效化整个踪迹Cache。后面的行为意味着对自修改代码的编程会导致严重的性能下降,当运行在奔腾4和Intel至强处理器上时。

实践上,对线性地址的检查不应该在IA-32处理器之间创建兼容性问题。包含自修改代码的应用使用同一线性地址用于修改和取指令。系统软件,诸如一个调试器可能使用不同的线性地址来修改一条指令,而不是用于取指令,将会执行一个串行操作,诸如一条CPUID指令,在被修改的指令被执行前,这将自动重新同步指令Cache和预取队列(见8.1.3小节)。

对于Intel486处理器,对在Cache中的一条指令的写将同时在Cache和存储器中修改它,但如果指令在写之前被预取,那么该指令的老的版本将会被执行。为了防止老的指令被执行,通过在任一对一条指令的修改的写之后立即编写一条jump指令来冲刷指令预取单元。

 

11.7 隐式cache(奔腾4、Intel至强以及P6家族处理器)

 

当一个存储器元素被弄成隐式可被Cache的时,隐式Cache发生,尽管此元素可能从没有以冯•诺伊曼顺序被访问过。隐式Cache发生在P6或更新的处理器家族上源于积极预取(译者注:硬件预取,包括指令和数据),分支预测,以及TLB缺失处理。隐式cache是已有的Intel386、Intel486和奔腾处理器系统行为的一个扩展,由于运行在这些处理器家族上的软件也还没能够确定性地预测指令预取的行为。

为了避免与隐式cache相关的问题,操作系统必须显式地无效化Cache,当对可被cache的数据做改变时,而Cache一致性机制又无法对这些可被cache的数据做自动处理。这包括写到双端口或物理上被混叠的存储器板,而这些不被处理器的窥探机制所探测,以及对存储器中页表条目的改变。

在例11-1中的代码展示了在隐式页表条目上的隐式cache的效果。线性地址F000H指向物理位置B000H(F000H的页表条目含有值B000H),而线性地址F000H的页表条目是PTE_F000。

 

因为在P6或更新处理器家族中的投机执行,最后的MOV指令将会把位于物理地址B000H处的值放在EBX中,而不是在新的物理地址A000H处的值。这种情况可以通过在加载和存储之间放一个TLB无效化来补救。

 

11.8 显式cache

 

奔腾III处理器引入了四条新的指令,PREFETCHh指令,给软件提供了针对数据cache的显式控制。这些指令给处理器提供了“暗示”,由一条PREFETCHh指令所请求的数据应该现在应该被读到Cache层级中,或越快越好,预先对其使用。这些指令提供了不同暗示的变种,允许选择数据将被读入哪个Cache层级。

PREFETCHh指令可以帮助减少与从存储器读数据相关联的长延迟,从而帮助防止处理器“延迟”。然而,这些指令应该被明智而谨慎地使用。过度使用会导致资源冲突并从而降低应用程序的性能。同时,这些指令应该仅被用于从存储器预取数据;它们不应该被用于预取指令。对于预取指令更详细的信息,请参考Intel优化文档的第七章。

 

11.9 无效化翻译后备缓存(TLB)

 

处理器对软件透明地更新其地址转换Cache(TLB)。然后,有若干个机制可以用来允许软件和硬件亦或显式地,要么作为另一个操作的副作用来无效化TLB。更多细节在4.10.4小节中给出。此外,以下操作无效化所有TLB条目,不考虑G标志的设置:

1、断言或反断言FLUSH#引脚。

2、(只有奔腾4、Intel至强和后面的处理器)对一个MTRR的写(用一条WRMSR指令)

3、对控制寄存器CR0的写以修改PG或PE标志。

4、(只有奔腾4、Intel至强和后面的处理器)对控制寄存器CR4的写,以修改PSE、PGE或PAE标志。

5、对控制寄存器CR5的写,将PCIDE标志从1变为0。

见4.10小节来获得关于TLB的额外信息。

 

11.10 存储缓存

 

Intel 64和IA-32处理器将每次对存储器的写临时存放在一个存储器缓存中。存储缓存通过允许处理器继续执行指令而不需要等待直到一次对存储器或Cache的写被完成,而提升处理器性能。它也允许写被延迟而更有效地使用存储器访问总线周期。

一般来讲,存储缓存的存在对于软件而言是透明的,即使在使用多处理器的系统中。处理器确保写操作总是以程序次序执行。它也保证存储缓存的内容在下列情况中总是被排放到存储器中:

1、当一个异常或中断产生

2、(仅针对P6或更新的处理器家族)当一条串行指令被执行时

3、当一条I/O指令被执行时

4、当一个LOCK操作被执行时

5、(仅针对P6和更新的处理器家族)当一个BINIT操作被执行时

6、(仅针对奔腾III和更新的处理器家族)当使用一条SFENCE指令来安排存储时

7、(仅针对奔腾4和更新的处理器家族)当使用一条MFENCE指令来安排存储时

写次序的讨论在8.2小节

 

11.11 存储器类型范围寄存器

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值