Intel 64 and IA32 内存类型 - memory type

来源:互联网 发布:java人事管理系统项目 编辑:程序博客网 时间:2024/06/16 02:14

内存类型 - memory type

内存类型又称为cache类型,用来定义系统内存区域的cache类型,当前Intel 64和IA32支持如下内存类型:


Strong Unacheable(UC) 

内存不可以cached,所有的读和写操作出现在总线上的顺序就是程序执行的顺序。不会执行预测内存访问,或者分支预测。这种内存类型的cache机制非常适合那些做

memory-mappped的IO设备。如果在普通内存上使用这种内存类型,将极大降低处理器性能。


Uncacheable(UC-)

和Strong Uncacheable类似,除了UC-内存类型可以通过修改MTRRs寄存器变成WC内存类型。这种内存类型自Pentium III处理器开始出现,并指只能通过PAT来指定。


Write Combining(WC)

这种类型的系统内存不可以cached,处理器总线的一致性协议不会保证一致性。可以预测读;写操作被 delay并且被合并到write combine buffer(WC buffer)中,以便减少内存的访问。

如果WC buffer仅仅部分被填充,那么写操作要推迟到下一次Serializing事件,比如SFENCE或者MFENCE指令,CPUID,对uncached memory的读写操作,一个中断,或者一个Lock指令。

这种内存类型非常适合video frame buffers,在需要把内存的内容显示到graphics display之前,写顺序并不重要。在Pentium Pro好Pentium II处理器家族中通过编程MTRRs选择这种内存类型;从Pentium III处理器开始通过编程MTRRs或者通过PAT来设置。


Write-through (WT)

对系统内存的读写操作都是cached。cache hits则从cache lines中读取,cache missed则会填充cache lines。允许预测读。写到cache lines的同时也会写通到系统内存(有可能不会写到cache line中,而是直接写通到系统内存)。当写通到系统内存时,无效的cache line不会被填充,而有效的cache line或者被填充或者变得无效。

write combining是允许的。

这种内存类型非常适合framebuffers,或者那些访问系统内存时不会snooping总线内存访问的设备。

这种内存类型保证处理器中的cache和系统内存间的一致性。


Write-back (WB)

内存读写都会cached。cache hits则从cache lines中读取,cache missed则会导致cache fills(cache填充)。写失败则导致cache line填充,如果可能整个写都在cache中执行。

Write combining是允许的。通过减少不必要的系统内存写操作,Write-back减少了总线传输。写到cache lines中并不会立刻推送到系统内存中,相反,这些写操作仅仅保留在系统cache中。这些修改的cache lines会推迟写到系统内存,直到执行write-back操作。

Write-back操作的触发:在cache lines需要重新分配时,比如当cache中分配的cache lines已经满了;或者在需要保证cache一致性时。

这种内存类型提供了最好的性能,但是访问这种系统内存的设备能够snooping内存访问,以确保系统内存和cache的一致性


Write Protected (WP)

从cache lines中读取,如果cache missed则引发cache fills。写操作则传播到系统总线,使得总线上处理器的相应cache lines变得无效。

预测读是允许的。这种内存类型从P6处理器家族开始出现,通过MTRRs寄存器设置。


选择内存类型

最简单的系统内存模式不使用memory-mapped IO(有读写副作用);不包括frame buffer;所有的系统内存都使用write-back内存类型。一个IO代理可以对write-back执行DMA操作,并且cache protocol来维护cache一致性问题。当然这是一种理想的模型。

一个系统可以对memory-mapped IO使用strong uncacheable 内存类型,而且也应该使用strong uncacheable类型,尽管这会带来读的副作用。

双端口内存具有写副作用,因为在一个端口的写操作,在抵达memory agent前不会被另外一个端口观测到。对于frame buffer和双端口内存系统可以使用strong cacheable, uncacheable, write-through,或者write-combining内存类型。

Frame buffer内存一般来说都是很大的(典型几个MB),并且处理器写操作要多余读操作。frame buffer使用strong uncacheable内存类型会导致大量的总线操作,因为整个frame buffer的内容的写操作被分割成太小的写单位。使用write-through则会导致处理器的L2 L3 caches以及L1 Data cache的cache lines充满了无用的frame buffer数据。因此对于frame buffer,系统应该使用write-combining内存类型。

软件可以使用页面级cache control,因此针对某些特定的数据结构访问,替换write-back 内存类型为其他内存类型可能会带来性能上的提高。比如,软件可能只会读某个大的数据结构一次,此后不会再读取这个数据结构,直到其他的代理重写这个数据结构。对于包含这种数据结构的page,我们可以把这个页面标识为uncacheable,免得第一次读这个数据结构时,会把这些数据填充到cache中,而导致其他更有用的cache lines被换出。

对于那种包含仅写的数据结构的页面来说。我们也可以把这个页面类型指定为uncacheable,因为软件从来都不会读取它的值

从Pentium III, P4以及他们后续的处理器,引入了新的指令使得软件可以控制数据的cacheing, prefetching以及write-back。这些指令,可以用来指定weakly ordered或者处理器序的内存类型,进而改善性能。同时也使得软件能够更容易控制数据的cache。


Uncacheable内存类型上的指令获取。

程序可以在UC内存类型内存上执行,但是和UC memory数据读取不同。当做取指令时,处理器不会








1 0
原创粉丝点击