我正在做我自己的版本的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