Memory management MTRR寄存器是如何实现的?

Memory management MTRR寄存器是如何实现的?,memory-management,x86,x86-64,mmu,Memory Management,X86,X86 64,Mmu,x86/x86-64公开了MTRR(内存类型范围寄存器),可用于为不同用途(例如,可缓存、不可更改、写组合等)指定物理地址空间的不同部分 我的问题是,有人知道MTRRs定义的物理地址空间限制是如何在硬件中实现的吗?在每次访问内存时,硬件是否检查物理地址是否落在给定范围内,然后进程决定是查找缓存还是查找写组合缓冲区,还是直接将其发送到内存控制器 谢谢维基百科在文章中说: 较新的(主要是64位)x86 CPU支持一种称为页属性表的更高级技术,该技术允许对这些模式进行每表设置,而不是使用数量有限的低粒

x86/x86-64公开了MTRR(内存类型范围寄存器),可用于为不同用途(例如,可缓存、不可更改、写组合等)指定物理地址空间的不同部分

我的问题是,有人知道MTRRs定义的物理地址空间限制是如何在硬件中实现的吗?在每次访问内存时,硬件是否检查物理地址是否落在给定范围内,然后进程决定是查找缓存还是查找写组合缓冲区,还是直接将其发送到内存控制器


谢谢

维基百科在文章中说:

较新的(主要是64位)x86 CPU支持一种称为页属性表的更高级技术,该技术允许对这些模式进行每表设置,而不是使用数量有限的低粒度寄存器

因此,对于较新的x86/x86_64 CPU,可以说MTRR可以作为PAT(页面属性表)的附加技术来实现。PAT存储在内存中的位置是页表(页表条目或PTE中的一些位),它们存储(缓存)在CPU中的表中(它是表的一部分)。TLB(和MMU)已经是每个内存访问都要访问的地方。我认为,它可能是控制内存类型的好地方,即使使用MTRR(?)

但是如果我停止猜测,打开RTFM手册,会怎么样?有一本关于x86世界的好书:《未桥接奔腾4:IA32处理器谱系》(ISBN-13:978-0321246561)。第7部分,第24章“奔腾Pro软件增强”,第“添加MTRR”部分

在第582-584页,每种mtrr内存类型都有很长的规则,但所有5种类型(不可缓存=UC,写入组合=WC,直写=WT,写入保护=WP,回写=WB)的规则都以“执行缓存查找”开头

在第9部分“奔腾III”第32章“奔腾III至强”中,该书明确指出:

当必须执行内存访问时,处理器会同时参考MTRRs和所选PTE或PDE来确定内存类型(因此也会遵循行为规则)

但从另一方面来说。。。将WRMSR写入MTRR REG将使TLB无效(根据英特尔说明手册“instruct32.chm”):

当WRMSR指令用于写入MTRR时,TLB将失效,包括全局条目(请参阅《IA-32英特尔(R)体系结构软件开发人员手册》第3卷第3章中的“翻译查找缓冲区(TLB)”

在“英特尔64和IA-32体系结构软件开发人员手册,第3a卷”的“10.11.9大页面注意事项”一节中,还有一个更直接的提示:

MTRR为有限数量的区域提供内存类型,这些区域的粒度为4KB(与4KB页面的粒度相同)。给定页的内存类型缓存在处理器的TLB中

你问:

在每次访问内存时,硬件是否检查物理地址是否在给定范围内

否。不会将每次内存访问与所有MTRR进行比较。当PTE加载到TLB中时,所有MTRRs范围都与内存的PTE位预先组合。那么检查内存类型的唯一地方就是TLB线路。每次访问内存时都会检查TLB

它应该查找缓存还是查找写组合缓冲区,或者直接将其发送到内存控制器

不,有些事情我们不太明白。缓存查找每个访问,即使是UC(例如,如果区域刚刚更改为UC,则可能会有缓存副本,应将其逐出)

第24章(关于奔腾4):

从可缓存内存加载 允许处理器缓存的内存类型有WP、WT和WB内存(由MTRRs和PTE或PDE定义)

当内核分派负载mop时,mop被放置在分配器阶段为其保留的负载缓冲区中。然后将内存数据读取请求发送到一级数据缓存以实现:

  • 如果缓存具有包含请求的读取数据的行的副本,则读取的数据将放置在加载缓冲区中
  • 如果缓存查找导致未命中,则请求将向上游转发到二级缓存
  • 如果二级缓存具有包含请求的读取数据的扇区的副本,则读取数据将立即放置在加载缓冲区中,扇区将复制到一级数据缓存中
  • 如果缓存查找导致未命中,则请求会向上游转发到三级缓存(如果有)或FSB接口单元
  • 如果三级缓存具有包含请求读取数据的扇区的副本,则读取数据将立即放置在加载缓冲区中,扇区将复制到二级缓存和一级数据缓存中
  • 如果顶级缓存中的查找导致未命中,则请求将转发到FSB接口单元
  • 当扇区从内存返回时,读取的数据立即放入加载缓冲区,扇区被复制到三级缓存(如果有)、二级缓存和一级数据缓存中
  • 处理器内核可以推测地执行从WC、WP、WT或WB内存空间读取数据的加载

    从不可缓存内存加载 不可缓存内存类型为UC和WC(由MTRRs和PTE或PDE定义)

    当内核分派一个load mop时,读取请求被放入在分配器阶段为其保留的加载缓冲区中。内存数据读取请求也会提交到处理器的缓存中。在缓存命中的情况下,缓存线将从缓存中移出。向FSB接口单元发出请求。在FSB上执行内存数据读取事务,以便仅从内存中获取请求的字节。当数据从内存返回时,读取的数据立即放入加载缓冲区

    处理器公司