问题 Linux内核是否有自己的SSE / AVX上下文?


Linux内核是否有自己的SSE / AVX上下文?

我的意思是,从内核模块的角度来看,我可以使用SSE / AVX指令而不必担心也可能使用它的用户空间应用程序吗?或者我是否需要使用某些锁或手动执行某些上下文保存?


887
2017-09-03 10:58


起源

我想知道为何投票结束?这似乎是一个有效且有用的问题。 - Paul R
可能重复: stackoverflow.com/q/6227603/1401351。特别是在该问题的答案中看到链接的资源:第6.3节 agner.org/optimize/calling_conventions.pdf - Peter
伙计们,我需要知道是否可以使用LKM的AVX指令。没有一个链接告诉我。而且我也不寻找呼叫约定。 - Ilya Matveychikov
你没看过这个文件?它说:“需要使用向量寄存器的设备驱动程序必须首先通过调用该函数来保存这些寄存器 kernel_fpu_begin() 并通过调用恢复寄存器 kernel_fpu_end() 在回归或睡觉之前。“还有更多,就像你在中断环境中完全不能使用它们一样。简短回答:是的,你可以。很长的答案:但是有限制。阅读文件! - Peter
@Peter这将是一个非常好的答案。 - CL.


答案:


默认情况下,Linux内核不保存FPU或向量寄存器以提高上下文切换的速度。但是,您可以在某些情况下使用它们。

第6.3节 http://agner.org/optimize/calling_conventions.pdf 很好地描述了在Windows和Linux中在内核模式下使用向量寄存器。这是一个重要的引用:

需要使用向量寄存器的设备驱动程序必须先保存   这些寄存器通过调用函数kernel_fpu_begin()并恢复   通过在返回之前调用kernel_fpu_end()来调用寄存器   睡眠。

还有更多,比如在中断环境中根本不能使用它们,所以我建议阅读整个部分。


12
2017-09-03 15:06



非常感谢你的回答:) - Ilya Matveychikov