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