我正在做我自己的版本的do_fork()(用于很多目的)。所以,基本上,我将这个过程从一个地方复制到另一个地方,可能是另一台机器。复制代码并粘贴到这里会很困难。但我相信这个解释应该足够好。fpu_xrstor_checking做什么?额外的评论?
我的代码在大多数情况下都能正常工作,但在其他时候,函数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 }
谢谢!
感谢您的回复。现在,我的问题是......在普通进程fork(即简单的vanilla Linux)中,代码中这些寄存器是从父到子复制的? – hebbo
@hebbo,我不是Linux内核的专家,所以不重依靠此评论:)这些寄存器可以从父母复制到孩子[fpu_copy(http://lxr.free-electrons.com/ source/arch/x86/include/asm/fpu-internal.h#L596),由[arch_dup_task_struct]调用(http://lxr.free-electrons.com/source/arch/x86/kernel/process.c#L86)由[copy_process]调用[dup_task_struct](http://lxr.free-electrons.com/source/kernel/fork.c#L328)调用(http://lxr.free-electrons.com/source/kernel/ fork.c#L1239)。 – 2015-06-23 17:12:30
这[书籍预览](https://books.google.it/books?id=h0lltXyJ8aIC&pg=PT127&lpg=PT127&dq=linux+fork+fpu+registers&source=bl&ots=gO2qF_bfMT&sig=XQlwINsFCqS3xaE61rt5-2prDaA&hl=en&sa=X&ei=2ZCJVdD0MoORsgH_rZSYBQ&ved=0CC0Q6AEwAg )很有意思,因为FPU/MMX/SSE/AVX状态仅在需要时被复制。 – 2015-06-23 17:12:34