技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 109|回复: 3
收起左侧

【处理器】简述AMD64体系的分页缓存体系

[复制链接]

28

主题

70

帖子

2335

积分

用户组: 管理员

UID
1043
精华
12
威望
72 点
宅币
1890 个
贡献
171 次
宅之契约
0 份
在线时间
301 小时
注册时间
2015-8-15
发表于 2018-11-28 05:26:42 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
之前讲到AMD64的分页体系,估计很多人觉得四级分页这货会严重降低处理器操作内存的性能。如果真的每次内存的操作都要走一遍页表的话,那处理器的性能确实会被严重降低。



TLB简介
这里就要提到处理器对分页机制的缓存能力了,即地址转换旁道缓存(Translation Lookaside Buffer),也就是TLB。
在处理器将虚拟地址成功转换到物理地址后,处理器将会把虚拟地址转换到物理地址的结果保存到TLB中,以备未来的内存访问。
在TLB中,不仅包含了被转换的物理页基址,也包含了页状态,如R/W属性,NX属性,PS属性等。
当TLB被命中时,处理器将直接通过物理页基址计算得到物理地址,并比对P属性,R/W属性,U/S属性,NX属性来判断是否要产生#PF异常。
TLB缓存不存在于常规处理器缓存中,即不在任何一级,二级,三级甚至四级缓存上,TLB是独立于处理器缓存体系的一类缓存。



TLB刷新与TLB标记
之前提到过,页表基地址是保存在CR3寄存器中的,因此当mov cr3,xxx指令被执行后,处理器就必须刷新TLB来确保后续的地址转换是正确的。但不是所有的TLB都会被刷新,这是TLB标记所造成的。
通常而言,内核空间的虚拟地址到物理地址的转换不会产生变化,因此这些内存通常都带有Global标记。在页表中,一个页是否带有Global标记是最终页表项的G位来确定的。
除了Global标记外,还有ASID标记。
ASID(Address Space Identifier)标记是硬件虚拟化中的重要一环,它是一个32位的值,用于标记TLB属于哪个虚拟机。在AMD64体系下,规定宿主机的ASID为0,而虚拟机的ASID不为0。ASID的设计是为了避免不必要的TLB刷新导致的虚拟机与物理机关于地址转换性能的同时下降。在vmrun指令中,处理器将会修改CR3处理器的值为虚拟机的CR3值,但并不会刷新缓存,只是在下一次#VMEXIT之前一直使用带虚拟机ASID标记的TLB而已。
注意,Intel处理器上没有ASID机制,ASID是AMD处理器独有的。在Intel处理器上,使用16位的VPID(Virtual Processor Identifier)来标记TLB属于哪个虚拟机。
Intel处理器对TLB还有个PCID(Process-Context Identifier)标记,在同一个Process-Context下的软件将使用带同一个PCID标记的TLB缓存。
系统软件对TLB刷新有多种方式:
使用mov cr3,xxx指令来刷新当前ASID(VPID及PCID)下所有非Global页的缓存。
使用mov cr0,xxx指令关闭分页模式时,刷新掉全部的TLB。在虚拟机中,这种行为必须要被拦截。
使用mov cr4,xxx指令关闭PCID模式(Intel专有)或Global页模式时,刷新掉全部的TLB。
使用invpcid指令根据刷新掉标记了指定PCID的TLB,根据刷新类型决定刷新特定页TLB,或者所有非Global的TLB,或者全部的TLB。(还有一种形式是刷新掉所有PCID的TLB,但不刷新Global页的TLB)
使用invlpg指令刷新掉特定内存地址的TLB,它无视PCID和Global标记。
使用invlpga指令刷新掉特定ASID内特定内存地址的TLB。只能在ASID=0时使用。注意这个ASID是相对的,如果宿主机中的虚拟机软件具有嵌套虚拟机的能力,则虚拟机中也可以执行这个指令来刷新掉嵌套虚拟机的TLB。
在VMCB中设置TLB控制项实现对全部TLB,指定ASID的全部TLB,指定ASID中非Global的TLB的刷新操作。vmrun指令将读取VMCB的TLB控制项并实施缓存刷新操作。
使用invvpid指令刷新掉特定标记了指定VPID的TLB,和invpcid相似,处理器根据刷新类型来刷新特定的TLB。



TLB失误
既然是缓存,就必然存在需要刷新的情况,当缓存没有被正确刷新时,就会产生缓存失误,TLB则是同理。
TLB失误通常是在系统软件在修改页表结构时没有被正确刷新导致的。在修改页表结构后,系统软件必须执行invlpg指令(Invalidate Page)来刷新这个页的TLB缓存。
需要注意的是,TLB失误是很严重的缓存错误。TLB失误可以使得系统中一个软件读写另一个软件的内存区域,甚至是操作系统的内核区域。



TLB与超线程
在处理器启用超线程模式的时候,同一个物理处理器核心中的所有逻辑处理器核心使用同一套TLB。但对此设计不妥当的处理器(比如Intel处理器)就会产生安全隐患。
今年年初爆出的熔断与恶魂漏洞也与此有关。

评分

参与人数 2威望 +22 宅币 +164 贡献 +82 收起 理由
0xAA55 + 2 + 64 + 32 屌!
美俪女神 + 20 + 100 + 50 支持!

查看全部评分

flowers for Broken spirits - a woman turned into stake will hold the world in the basin of fire.

0

主题

1

帖子

23

积分

用户组: 初·技术宅

UID
2833
精华
0
威望
2 点
宅币
18 个
贡献
0 次
宅之契约
0 份
在线时间
1 小时
注册时间
2017-9-4
发表于 2018-11-28 21:57:05 | 显示全部楼层
感谢分享!
回复

使用道具 举报

34

主题

135

帖子

6976

积分

用户组: 管理员

UID
77
精华
11
威望
112 点
宅币
6433 个
贡献
129 次
宅之契约
0 份
在线时间
95 小时
注册时间
2014-2-22
发表于 2018-11-29 04:23:09 | 显示全部楼层
TLB是个神奇的玩意,以前玩HOOK IDT 0E的时候被它坑过。

0

主题

44

帖子

56

积分

用户组: 小·技术宅

UID
4536
精华
0
威望
2 点
宅币
8 个
贡献
0 次
宅之契约
0 份
在线时间
5 小时
注册时间
2018-12-6
发表于 2018-12-6 10:42:39 | 显示全部楼层
学习了很多

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-12-15 10:37 , Processed in 0.106611 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表