Linux kernel fpu\u xrstor\u检查的功能是什么?额外评论?

Linux kernel fpu\u xrstor\u检查的功能是什么?额外评论?,linux-kernel,linux-device-driver,x86-64,Linux Kernel,Linux Device Driver,X86 64,我正在做我自己版本的do_fork()(用于许多目的)。所以,基本上,我是在把过程从一个地方复制到另一个地方,可能是复制到另一台机器上。复制代码并粘贴到这里会很困难。但我相信这个解释应该足够好了 我的代码在大多数情况下都有效,但在其他情况下,函数fpu\u xrstor\u checking()会返回一个错误(值=-1)。有人能解释一下这个函数应该做什么和额外的注释吗 以下是为方便起见粘贴在此处的函数: 45 static inline int fpu_xrstor_checking(stru

我正在做我自己版本的do_fork()(用于许多目的)。所以,基本上,我是在把过程从一个地方复制到另一个地方,可能是复制到另一台机器上。复制代码并粘贴到这里会很困难。但我相信这个解释应该足够好了

我的代码在大多数情况下都有效,但在其他情况下,函数
fpu\u xrstor\u checking()
会返回一个错误(值=-1)。有人能解释一下这个函数应该做什么和额外的注释吗

以下是为方便起见粘贴在此处的函数:

 45 static inline int fpu_xrstor_checking(struct fpu *fpu)
 46 {
 47         struct xsave_struct *fx = &fpu->state->xsave;
 48         int err;
 49 
 50         asm volatile("1: .byte " REX_PREFIX "0x0f,0xae,0x2f\n\t"
 51                      "2:\n"
 52                      ".section .fixup,\"ax\"\n"
 53                      "3:  movl $-1,%[err]\n"
 54                      "    jmp  2b\n"
 55                      ".previous\n"
 56                      _ASM_EXTABLE(1b, 3b)
 57                      : [err] "=r" (err)
 58                      : "D" (fx), "m" (*fx), "a" (-1), "d" (-1), "" (0)
 59                      : "memory");
 60 
 61         return err;
 62 }

谢谢大家!

内联程序集利用Linux内核的一个特性,允许开发人员“捕获”CPU异常。标签
1
上的说明是一个
XRSTOR
(稍后将详细介绍)。
标签
3
处的代码在
.fixup
部分发出,其中包含用于处理异常的代码。
\u ASM\u EXTABLE
告诉汇编程序生成一个表结构,通知内核
1
处的指令可能会生成异常,并且其处理程序位于
3

处理程序只是将
err
设置为-1。
XRSTOR
指令(使用操作码编码可能是因为汇编程序还不支持它?)还原CPU体系结构状态的以下部分:x87(FPU)SSEAVX
该指令将EDX:EAX作为掩码(称为指令掩码),它非常复杂,出于许多原因,它可以生成一个#GP,在这里列出它们是毫无意义的(一个原因是它的操作数没有在64字节边界上对齐)。
当此指令出现故障时,功能返回-1


我建议阅读第13节,以获得对该主题的完整描述(需要对第8-12节进行一般理解)。您还可以阅读说明
XRSTOR
参考,其中包含可能产生异常的完整原因列表。

感谢您的回复。现在,我的问题是…在常规进程fork(即普通的香草Linux)中,在代码中这些寄存器是从父级复制到子级的?@hebbo,我不是Linux内核的专家,所以不要过分依赖以下评论:)这些寄存器可以在called by called by fork中从父级复制到子级。这很有趣,因为FPU/MMX/SSE/AVX状态仅在需要时复制。感谢帮助!我只是读了它,花了更多的时间在汇编和理解内联汇编上,我想我得到了。我还认为我知道如何修复代码;)