Intel系统编程指南第十一章——11.5 Cache控制

来源:互联网 发布:哈苏x1d淘宝上价格 编辑:程序博客网 时间:2024/06/04 18:29

Intel 64和IA-32架构提供了各种用于控制数据和指令的cache的机制,以及为控制在处理器、Cache和存储器之间读写次序的机制。这些机制可以被划分为两组:

 

1、Cache控制寄存器和比特——Intel 64和IA-32架构定义了控制寄存器内的若干个专用寄存器和各个位,以及控制L1、L2和L3 Cache中的cache系统存储器位置的页和目录表条目。这些机制控制了物理存储器区域的虚拟存储器页的cache。

 

2、Cache控制和存储器次序指令——Intel 64和IA-32架构提供了若干条指令来控制数据的cache,存储器读写的次序,以及数据预取。这些指令允许软件控制指定数据结构的cache,以对存储器中的指定位置控制存储器一致性,以及迫使在一个程序中的指定位置强存储器次序。

 

以下小节描述了两组cache控制机制。

 

11.5.1 Cache控制寄存器和比特

 

图11-3描绘了IA-32处理器中的Cache控制机制。与存储器地址空间不同,这些在Intel 64处理器中也以相同方式工作。

Intel 64和IA-32架构提供了以下Cache控制寄存器和比特,用于允许或限制对存储器中的各种页或区域的cache:

 

1、CD标志,控制寄存器CR0的位30——控制系统存储器位置的cache(见2.5小节)。如果CD标志被清0,那么cache对整个存储器被允许,但可以通过其它Cache控制机制对存储器的个别的页或区域进行限制。当CD标志被置1,那么对于P6和更新的处理器家族,cache被限制在处理器的Cache中(Cache层级);而对于奔腾处理器则被禁用。然而,如果CD标志被置1,Cache将仍然响应窥探交通。Cache应该被显式地冲刷以确保存储器一致性。对于最高的处理器性能,控制寄存器CR0中的CD和NW位应该都被清0。

置1CD标志的效果对于从P6家族开始的处理器家族与奔腾处理器相比有些不同。为了确保CD标志置1后的存储器的一致性,Cache应该被显式地冲刷(见11.5.3小节)。对P6或更新的处理器家族置1,修改Cache行填充和更新行为。对这些处理器的CD标志置1也不会迫使严格的存储器访问次序,除非MTRR被禁止以及/或所有存储器作为不被cache的而引用(见8.2.5小节)。

 

2、NW标志,控制寄存器CR0的位29——对系统存储器位置控制写策略(见2.5小节)。如果NW和CD标志被清0,那么写回对整个系统存储器被允许,但可以通过其它Cache控制机制对存储器的个别的页或区域进行限制。

注:对于奔腾4和Intel至强处理器,NW标志并不是一个需要关心的标志;即,当CD标志被置1时,处理器使用不填充的Cache模式,不管NW是否置1。

对于Intel凌动处理器,NW标志并不是一个需要关心的标志;即,当CD标志被置1时,处理器禁止cache,不管NW标志是否置1。

对于奔腾处理器,当L1 Cache被禁止时(控制寄存器CR0的CD和NW标志被置1),在DP(双处理器)系统中,外部窥探被接受,而在单处理器系统中,外部窥探被禁止。

当窥探被禁止时,地址奇偶性不被检查,并且APCHK#信号对一个受破坏的地址不被断言;然而,当窥探被接受时,地址奇偶性被检查,并且APCHK#对受破坏的地址做出断言。

 

3、在页目录和页表条目中的PCD标志——分别为个别的页表和页控制cache(见4.9小节)。这个标志只有当分页被允许并且控制寄存器CR0中的CD标志被清0的时候才有效。PCD标志当清0时允许cache页表或页,而当置1时禁止cache。

 

4、页目录和页表条目中的PWT标志——分别对个别的页表和页控制写策略(见4.9小节)。这个标志只有当分页被允许并且控制寄存器CR0中的NW标志被清0时才有效。PWT标志当清0时允许页表或页的写回cache,而当置1时为通写cache。

 

5、控制寄存器CR3中的PCD和PWT标志——对页目录控制全局的cache和写策略(见2.5小节)。PCD标志当清0时允许对页目录的cache,而当置1时禁止cache。PWT标志当清0时允许对页目录的写回cache,而当置1时为通写cache。这些标志对个别的页表不影响cache和写策略。这些标志只有当分页被允许并且控制寄存器CR0中的CD标志被清0时才有效果。

 

6、页目录和页表条目中的G(全局的)标志(对P6家族处理器中的IA-32架构所引入)——控制对个别页的TLB条目的冲刷。见4.10小节。

 

7、在控制寄存器CR4中的PGE(页全局允许)标志——允许带G标志的全局页的建立。见4.10小节。

 

8、存储器类型范围寄存器(MTRR)(在P6家族处理器中引入)——控制用于在物理存储器的指定区域的cache类型。在11.3小节中所描述的任一cache类型可以被选择。

 

9、页属性表(PAT)MSR(在奔腾III处理器中引入)——扩展处理器的存储器类型性能以允许存储器类型基于一页一页被分配(见11.12小节)。

 

10、第三级Cache禁止标志IA32_MISC_ENABLES MSR的位6(只在基于Intel NetBurst微架构上的处理器可用)——允许L3 Cache被禁止和允许,独立于L1和L2 Cache。

 

11、KEN#WB/WT#引脚(奔腾处理器)——允许外部硬件控制用于存储器指定区域的cache方法。它们执行类似于P6家族处理器中的MTRR的功能(但并不相同)。

 

12、PCD和PWT引脚(奔腾处理器)——这些引脚(与控制寄存器CR3中、页表目录中和页表条目中的PCD和PWT标志相关联)允许在一个外部L2 Cache中的cache基于一页一页受到控制,与操作在这些处理器的L1 Cache上的控制相一致。P6和更新的处理器家族不提供这些引脚,因为L2 Cache在芯片包的内部。

 

 

11.5.2 Cache控制的优先级

 

Cache控制标志和MTRR为限制cache而有层级地操作。即,如果CD标志被置1,那么cache被全局禁止(见表11-5)。如果CD标志被清0,那么页级Cache控制标志以及/或MTRR可以被用于限制cache。如果页级和MTRR cache控制有一个叠交,那么禁止cache的机制就有一个优先级。比如,如果一个MTRR使系统存储器的一个区域变为不可被cache的,那么一个页级cache控制不能被用于为那个区域的一个页允许cache。反过来也同样正确;即,如果一个页级cache控制指派了一个页是不可被cache的,那么一个MTRR不能使该页变为可被cache。

在回写和通写cache策略的对一个页或一个区域的存储器的分配中有一个叠交的情况下,那么通写策略获得优先权。写绑定策略(只能通过MTRR或PAT被分配)会越过通写或回写而获取优先权。

在页级的存储器类型的选择依赖于PAT是否被用于为页选择存储器类型而不同。这在以下小节中描述。

在基于Intel NetBurst微架构的处理器上,第三级Cache可以用IA32_MISC_ENABLE MSR的位6来禁止。使用IA32_MISC_ENALBES[位6]来越过为那些处理器中的L3 Cache的CD标志、MTRR以及PAT而获取优先权。即,当第三级Cache禁止标志被置1时(Cache被禁止),那么其它Cache控制在L3 Cache上没有效果;当此标志被清0(允许)时,在L3上的Cache控制具有与它们在L1和L2 Cache上的具有相同的效果。

 

IA32_MISC_ENALBES[位6]在Intel酷睿i7处理器中不被支持,也不在基于Intel酷睿和Intel凌动微架构的处理器上被支持。

 

 

11.5.2.1 为奔腾Pro和奔腾II处理器选择存储器类型

 

奔腾Pro和奔腾II处理器不支持PAT。这里,对一个页的有效存储器类型用MTRR,以及页的页表或页目录条目中的PCD和PWT位来选择。表11-6描述了MTRR存储器类型的映射以及对有效存储器类型的页级cache属性,当正常的cache有效时(控制寄存器CR0的CD和NW标志被清0)。用灰色表示出来的结合对于奔腾Pro和奔腾II处理器是实现定义的。系统设计者被鼓励避免这些实现定义的结合。

 

当正常的cache有效时,在表11-6中所展示的有效存储器类型使用以下规则被确定:

1、如果为页的PCD和PWT属性都为0,那么有效的存储器类型与MTRR定义的存储器类型是相同的。

2、如果PCD标志被置1,那么有效存储器类型是UC。

3、如果PCD标志被清0且PWT标志被置1,那么为WB存储器类型的有效存储器类型是WT,而为所有其他存储器类型的有效存储器类型是由MTRR定义的。

4、将PCD和PWT标志的值互换一下对于WP和WC存储器类型被认为是模型指定的,而为WB、WT和UC存储器类型是架构定义的。

 

11.5.2.2 为奔腾III和之后的处理器家族选择存储器类型

 

Intel酷睿2 Duo,Intel凌动,Intel酷睿Duo,Intel酷睿Solo,奔腾M,奔腾4,Intel至强和奔腾III处理器使用PAT来选择有效的页级存储器类型。这里,一个页的存储器类型通过MTRR,以及一个PAT条目中的值来选择。而此PAT条目是用在一个页表或页目录条目中的PAT、PCD和PWT位所选出的(见11.12.3小节)。表11-7描述了MTRR存储器类型和PAT条目类型到有效存储器类型的映射,当正常的cache有效时(控制寄存器CR0中的CD和NW标志被清0)。

 

11.5.2.3 用不同存储器类型跨页写值

 

如果存储器中两个毗邻的页有不同的存储器类型,并且一个字或更长的操作数被写到一个存储器位置,而该位置跨了那两个页的边界,那么操作数可能会对存储器写两次。这个动作对于实际到存储器的写不会呈现一个问题;然而,如果一个设备被映射到被指派到那两个页的存储空间的话,那么该设备可能会有故障。

 

11.5.3 防止cache

 

在L1、L2和L3 Cache已经被允许并收到Cache填充后要禁止它们,要执行以下步骤:

1、进入非填充Cache模式。(将控制寄存器CR0到1的CD标志置1,并且NW标志清0)

2、使用WBINVD指令冲刷所有Cache。

3、禁止MTRR并且将默认的存储器类型设置为不被cache的,或置1所有不被cache的存储器类型的MTRR。

在CD标志被置1后,Cache必须被冲刷(步骤2),以确保系统存储器的一致性。如果Cache不被冲刷,Cache对读的命中将仍然发生,并且数据将从有效的Cache行被读。

上述所列出的独立的步骤的意图为指明三个明确的要求:(i)中止新数据替换Cache中已存在的数据,(ii)确保已在Cache中的数据被驱逐到存储器,(iii)确保后面的存储器引用观察UC存储器类型语义。Cache控制硬件的不同处理器实现可以允许这三个要求的软件实现的一些变动。

 

11.5.4 禁止和允许L3 Cache

 

在基于NetBurst微架构的处理器上,第三级Cache可以用IA32_MISC_ENABLE MSR的位6来禁止。第三级Cache禁止标志(IA32_MISC_ENABLE MSR的位6)允许L3 Cache禁止和允许,而独立于L1和L2 Cache。在使用该控制来允许或禁止L3 Cache之前,软件应该禁止并冲刷所有的处理器Cache,如11.5.3小节中所描述的那样,以防止存储在L3 Cache中的信息丢失。在L3 Cache被禁止或允许之后,为整个处理器的Cache可以被恢复。

带有L3的更新的Intel 64处理器不支持IA32_MISC_ENABLES[位6],此过程在11.5.3小节中描述。

 

11.5.5 Cache管理指令

 

Intel 64和IA-32架构提供了若干种指令管理L1、L2和L3指令。INVD, WBINVD, 和WBINVD指令是系统指令,对整个L1、L2和L3 Cache操作。PREFETCHh和CLFLUSH指令以及非临时搬移指令(MOVNTI、MOVNTQ、MOVNTDQ、MOVNTPS、MOVNTPD),这些在SSE/SSE2扩展中引入,对cache提供更大粒度的控制。

INVB和WBINVD指令被用于无效化L1、L2和L3 Cache的内容。INVD指令无效化所有内部Cache条目,然后产生一个特殊功能总线周期,指示外部Cache也应该被无效化。INVD指令应该被小心使用。它并不强迫被修改的Cache行的写回;从而被存放在Cache行并且没有被写回到系统存储器的数据将会被丢失。除非有一个特定要求或能从不写回被修改的Cache行而无效化Cache获利(诸如在测试或错误恢复期间,这段时间内,主存储器的Cache一致性不被关心),软件应该使用WBINVD指令。

WBINVD指令首先将在所有的内部Cache中的任何被修改的Cache行写回,然后无效化L1、L2和L3 Cache的内容。它确保了与主存储器的Cache一致性被维护,而不管有效的写策略(即,通写或回写)。这个操作之后,WBINVD指令产生一个(P6家族处理器)或两个(奔腾和Intel486处理器)特殊功能总线周期来指示给外部Cache控制器,已被修改数据的写回,后面紧跟着外部Cache的无效化应该发生。WBINVD完成的时间和周期将会由于不同的Cache层级的大小以及其它因素而有所不同。作为一个结果,对WBINVD指令的使用会对中断/事件响应时间有所影响。

PREFETCHh指令允许一个程序对处理器建议来自系统存储器中一个指定位置的Cache行被预取到Cache层级中(见11.8小节)。

CLFLUSH指令允许被选中的Cache行从存储器被冲刷。这条指令给一个程序显式地释放完Cache空间的能力,当获悉系统存储器被cache的段在最近的将来不会被访问。

非临时搬移指令(MOVNTI, MOVNTQ, MOVNTDQ, MOVNTPS, 以及MOVNTPD)允许数据从处理器的寄存器直接被搬到系统存储器,而不被写到L1、L2以及/或L3 Cache。这些指令可以被用于防止Cache污染,当对在被存储回系统存储器之前将仅被修改一次的数据操作时。这些指令对通用目的、MMX、XMM寄存器中的数据操作。

 

11.5.6 L1数据Cache上下文模式

 

L1数据Cache上下文模式是基于支持Intel超线程技术的Intel NetBurst微架构的处理器的一个特征。当CPUID.1:ECX[bit 10] = 1时,处理器支持使用L1数据Cache上下文模式标志(IA32_MISC_ENABLE[位24])设置L1数据Cache上下文模式。可选择的模式有自适应(默认)模式和共享模式。

BIOS负责配置L1数据Cache上下文模式。

 

11.5.6.1 自适应模式

 

自适应模式促进逻辑处理器之间的L1数据Cache的共享。当运行在自适应模式下,L1数据Cache在同一个核心中跨逻辑处理器被共享,如果:

1、为共享Cache的逻辑处理器的CR3控制寄存器是相同的。

2、相同的分页模式被用于共享Cache的逻辑处理器。

在这种情况下,整个L1数据Cache对每个逻辑处理器可用(而不是竞争性地共享)。

如果CR3的值对于共享一个L1数据Cache的逻辑处理器是不同的,或逻辑处理器使用不同的分页模式,那么处理器对Cache资源会有竞争。这减少了为每个逻辑处理器的有效的Cache大小。对Cache的别名是不允许的(这防止数据反复换入换出)

 

11.5.6.2 共享模式

 

在共享模式中,L1数据Cache在逻辑处理器之间被竞争地共享。即使逻辑处理器使用相同的CR3寄存器以及分页模式,这也是真的。

在共享模式下,L1数据Cache中的线性地址可以被别名化,这意味着Cache中的一个线性地址可以指向不同的物理位置。解决别名的机制会导致数据反复地换入换出。出于这个理由,IA32_MISC_ENABLE[位24] = 0对于基于支持Intel超线程技术的Intel NetBurst微架构的处理器是更好的配置。

 

原创粉丝点击