Linux kernel fpu\u xrstor\u检查的功能是什么?额外评论?
我正在做我自己版本的do_fork()(用于许多目的)。所以,基本上,我是在把过程从一个地方复制到另一个地方,可能是复制到另一台机器上。复制代码并粘贴到这里会很困难。但我相信这个解释应该足够好了 我的代码在大多数情况下都有效,但在其他情况下,函数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
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),SSE,AVX该指令将EDX:EAX作为掩码(称为指令掩码),它非常复杂,出于许多原因,它可以生成一个#GP,在这里列出它们是毫无意义的(一个原因是它的操作数没有在64字节边界上对齐)。
当此指令出现故障时,功能返回-1
我建议阅读第13节,以获得对该主题的完整描述(需要对第8-12节进行一般理解)。您还可以阅读说明
XRSTOR
参考,其中包含可能产生异常的完整原因列表。感谢您的回复。现在,我的问题是…在常规进程fork(即普通的香草Linux)中,在代码中这些寄存器是从父级复制到子级的?@hebbo,我不是Linux内核的专家,所以不要过分依赖以下评论:)这些寄存器可以在called by called by fork中从父级复制到子级。这很有趣,因为FPU/MMX/SSE/AVX状态仅在需要时复制。感谢帮助!我只是读了它,花了更多的时间在汇编和理解内联汇编上,我想我得到了。我还认为我知道如何修复代码;)