IA-32定义了CPU可能使整个TLB无效的各种情况。从AMD在Opteron Rev-F处理器(Barcelona?)中发布的ASID扩展开始,有些情况下只有某个ASID的TLB条目无效。
问题是,ASID本身是否永远无效?在使用之前,Hypervisor是否必须检查ASID是否有效?
答案 0 :(得分:1)
我认为答案是“不直接” - 查看AMD系统编程specification,VM控制块中的ASID字段只是一个(最多)32位ID,虚拟机管理程序为每个VM实例设置一个唯一值,并在TLB查找中用作附加标记。
由于您无法直接控制x86上的TLB内容,因此无法控制TLB中最终的条目 - 如果处理器决定向TLB添加条目,则条目将使用当前ASID标记,根据定义,在添加时有效。
这在前面提到的系统编程规范的 15.15.1 部分中以稍微迂回的方式描述:
在没有提供选择性地刷新单个指定ASID的所有翻译的方法的实现中,软件可以通过为guest虚拟机分配新的ASID并且在整个TLB已经被重用之前不重用旧的ASID来有效地刷新guest虚拟机的TLB条目。至少冲了一次。
这意味着处理器没有有效或无效ASID的概念 - 它只是一个数字,其当前值必须匹配TLB要命中的TLB条目ASID。因此,如果管理程序在重用之前没有正确刷新ASID,那么您将获得过时的TLB命中。