fpu_xrstor_checking有什么作用?额外的评论?

时间:2015-06-22 04:15:14

标签: linux-kernel linux-device-driver x86-64

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

我的代码大部分时间都有效,但在其他时候,函数fpu_xrstor_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 }

谢谢!

1 个答案:

答案 0 :(得分:2)

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

处理程序只是将err设置为-1 XRSTOR指令(用操作码编码可能是因为汇编程序还不支持它?)恢复CPU架构状态的以下部分: x87(FPU) SSE AVX
该指令采用EDX:EAX作为掩码(称为指令掩码)并且它非常精细,它可以生成#GP有很多原因,在这里列出它们是没有意义的(一个原因是它的操作数没有在64上对齐< strong> byte 边界)。
当该指令失败时,函数返回-1。

我建议阅读Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1 第13节以获取对该主题的完整描述(需要对第8-12节的一般理解)。您还可以阅读Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2b指令XRSTOR,其中包含可生成例外的完整原因列表。