Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 虚拟化环境中的CLFLUSH_Linux_X86_Cpu_Virtualization_Instructions - Fatal编程技术网

Linux 虚拟化环境中的CLFLUSH

Linux 虚拟化环境中的CLFLUSH,linux,x86,cpu,virtualization,instructions,Linux,X86,Cpu,Virtualization,Instructions,我已经阅读了有关英特尔x86机器的CLFLUSH指令的文章。 我知道CLFLUSH m8意味着如果我在裸机上的Linux模块内运行指令,则刷新包含线性地址m8的缓存线 但是,如果我想在虚拟化环境中的VM内运行该指令,该怎么办?CLFLUSH的参数是什么? 具体来说,假设我想刷新一条缓存线,该缓存线保存VM中程序的虚拟地址va的内容。虚拟地址va映射到虚拟机中的物理地址pa,而pa将映射到VMM/hypervisor中的机器地址ma。我应该为CLFLUSH指令、va、pa或ma使用哪个地址 多谢各

我已经阅读了有关英特尔x86机器的CLFLUSH指令的文章。 我知道
CLFLUSH m8
意味着如果我在裸机上的Linux模块内运行指令,则刷新包含线性地址m8的缓存线

但是,如果我想在虚拟化环境中的VM内运行该指令,该怎么办?
CLFLUSH
的参数是什么? 具体来说,假设我想刷新一条缓存线,该缓存线保存VM中程序的虚拟地址
va
的内容。虚拟地址
va
映射到虚拟机中的物理地址
pa
,而
pa
将映射到VMM/hypervisor中的机器地址
ma
。我应该为
CLFLUSH
指令、
va
pa
ma
使用哪个地址


多谢各位

clflush
不是特权指令。用户进程可以运行它,就像它们可以运行load、store、prefetch和
movnt
(store with cache EXCECTION)指令一样,这些指令也会影响缓存

我希望它虚拟化得很好,没有任何管理程序支持,因为它使用地址的方式与其他内存引用相同


由于硬件虚拟化允许CPU执行从来宾虚拟地址到硬件物理地址的完整转换,因此所需的行为(缓存线同步到物理内存)应该在没有虚拟机监控程序干预的情况下发生。

让我们这样回答。我相信您会同意,软件应该在虚拟化和非虚拟化环境中相同地运行,理想情况下,它应该无法判断它正在被虚拟化。你的问题马上就会得到答案;你使用任何一个地址,只要它运行裸机,你就会使用它,因为你(应该)没有办法知道你是否在运行裸机。这是一个很好的观察!我同意。然而,软件不知道它是在虚拟化环境还是非虚拟化环境中运行的原因是VMM/hypervisor虚拟化了指令。如果VMM不支持此指令,并且我希望扩展VMM的hypercall以支持它,那么我必须知道虚拟机监控程序应该为CLFLUSH指令使用哪个地址。我说的对吗?如果虚拟机监控程序可以使用
va
地址,我想知道硬件如何根据
va
确定应该刷新哪个缓存线?在裸机上,我可以理解硬件可以使用CR3寄存器将
va
传输到机器地址,以查找要刷新的缓存线。但在虚拟化环境中,硬件是否会自动将
va
转换为
ma
?我现在正在浏览,但我强烈怀疑您会在第3卷第23-33节,特别是第28节“VMX地址转换支持”中找到细节。长话短说,英特尔处理器可以选择为每个线性地址转换以VPID的形式维护额外的簿记信息。那么,对于同一个线性地址,可能存在多个映射,但它们在VPID上有所不同。是的,这是真的。。。intel使用VPID将线性地址与不同的虚拟机区分开来。这可能表明,当地址的所有者程序仍在运行时,我必须发出CLFLUSH。否则,我将不得不加载VPID和CR3以发出CLFLUSH。加载CR3已经刷新了缓存。我在手册中找不到这一个,vmcs有两个字段0x00006C06和0x00006C08,通常称为fs和gs基。这是否意味着MSR?还是细分市场?我已经查看了其他虚拟机监控程序源,一些do段,一些do MSRs 0x00006C0A是TR库,每个人都使用seg库?很抱歉每次都标记你,但你是我的上帝saver@zerocool:那与这个问题或答案无关。但我假设这些是段基,即虚拟地址,像普通的MSR或
wrfsbase
。段寄存器值本身(选择器)不是基,因此使用“基”一词可以排除这种情况。此外,没有人将段寄存器值用于任何事情,通常将它们
0
(空选择器)保留在64位模式下,甚至没有为它们创建GDT条目。