我正在做自己的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 }
谢谢!
答案 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
,其中包含可生成例外的完整原因列表。