ASID 即 Address Space ID, 是较新的 AMD-V 处理器支持的特征。 ASID 就是在 TLB 的entries 中增加一个 ASID 字段用于区分不同地址空间上下文的 entries, 以便多个地址空间的 TLB entries 可以共存在一个 TLB 中,减少地址空间切换时不必要的 TLB Flush 操作。 为支持对 ASID 特征的使用,AMD-V 在VMCS.CONTROL 中增加了两个字段 G_ASID 和TLB_CTRL。 G_ASID用于指定VMRUN 所运行的虚拟机的 ASID。 TLB_CTRL用于控制VMRUN 在重新加载虚拟机状态时怎样 Flush TLB。 TLB_CTRL可有 000,001,011,111 四个值,其中 000 表示不做 TLB Flush,001 表示刷全部的 TLB Entries, 011 表示 Flush 本 ASID 的全部TLB Entries, 111 表示 Flush 本 ASID 的非全局的 TLB Entries。 目前 RHEL6.2 的 KVM 代码已经利用 ASID 和 VMCB.TLB_CTRL 做了 TLB Flush 方面的优化。 另外 AMD-V 中还有一个和 ASID 直接相关的指令 invlpga, 执行该指令只 Flush 指定线性地址和 ASID 对应的 TLB entries。 Invlpga 能为 VMM 对 TLB 的管理提供更多的优化空间,如主机上 Linux 的物理页回收代码在释放掉一个物理页时,可根据该页所属的 ASID,用 Invlpga 而非 Invlpg 来做 TLB Flush, 目前的 KVM 还没有有效的利用 Invlpga。
|