HvCallFlushVirtualAddressList hypercall 使属于指定地址空间的虚拟 TLB 部分失效。
接口
HV_STATUS
HvCallFlushVirtualAddressList(
_In_ HV_ADDRESS_SPACE_ID AddressSpace,
_In_ HV_FLUSH_FLAGS Flags,
_In_ UINT64 ProcessorMask,
_Inout_ UINT32* GvaCount,
_In_reads_(*GvaCount) const HV_GVA* GvaRangeList
);
虚拟 TLB 无效作对一个或多个处理器执行作。
如果来宾知道可能需要刷新哪些处理器,则可以指定处理器掩码。 掩码中的每个位对应于虚拟处理器索引。 例如,0x0000000000000051掩码指示虚拟机监控程序应仅刷新虚拟处理器 0、4 和 6 的 TLB。
以下标志可用于修改刷新的行为:
- HV_FLUSH_ALL_PROCESSORS指示该作应应用于分区中的所有虚拟处理器。 如果设置了此标志,则忽略 ProcessorMask 参数。
- HV_FLUSH_ALL_VIRTUAL_ADDRESS_SPACES指示该作应应用于所有虚拟地址空间。 如果设置了此标志,则忽略 AddressSpace 参数。
- HV_FLUSH_NON_GLOBAL_MAPPINGS_ONLY对此调用没有意义,并且被视为无效选项。
所有其他标志都是保留的,必须设置为零。
此调用采用一个列表,其中列出了一系列于 2010 年。 每个范围都有一个基础的税号。。。 由于刷新是使用页面粒度执行的,因此可以使用网吧的底部 12 位来定义范围长度。 这些位对范围内的其他页面数(超出初始页)进行编码。 这允许每个条目对 1 到 4096 页的范围进行编码。
属于“大页面”映射(2MB 或 4MB)的一个 VR 将导致从虚拟 TLB 刷新整个大型页面。
此调用可确保在控件返回给调用方时,所有刷新对指定虚拟处理器的可观测效果都已发生。
将忽略无效的 GVA(那些指定超出分区的税号空间末尾的地址的 GV)。
如果目标虚拟处理器的 TLB 需要刷新,并且该虚拟处理器正在抑制 TLB 刷新,则调用方虚拟处理器将暂停。 当 TLB 刷新不再受到抑制时,虚拟处理器将“未暂停”,并且将重新发出超填充。
调用代码
0x0003 (众议员)
输入参数
| Name | Offset | 尺寸 | 提供的信息 |
|---|---|---|---|
AddressSpace |
0 | 8 | 指定地址空间 ID(CR3 值)。 |
Flags |
8 | 8 | 修改刷新作的标志位集。 |
ProcessorMask |
16 | 8 | 指示应受刷新作影响的处理器掩码。 |
Input List 元素
| Name | Offset | 尺寸 | 提供的信息 |
|---|---|---|---|
GvaRange |
0 | 8 | 2016 年 3 |