2015-06-22 73 views
0

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

谢谢!

回答

2

内联汇编化妆使用的Linux内核,使开发人员能够“捕获” CPU异常的特征。标签1上的说明是XRSTOR(稍后会详细介绍)。
该代码在标签3发射在.fixup部分包含用于处理异常代码。
_ASM_EXTABLE告诉汇编程序生成一个表结构来通知内核,1的指令可能会产生一个异常,并且它的处理程序在3

处理程序只是将err设置为-1。
XRSTOR指令(?有操作码的编码也许是因为汇编器不支持它尚未)恢复CPU体系结构状态的以下部分:的x87(FPU)SSEAVX
指令采取EDX:EAX作为掩模(称为指令面具),这是相当复杂的,它可以产生很多的原因#GP,他们在这里上市是没有意义的(原因之一是其操作数不对齐的64 字节边界)。
当该指令错误时返回-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参考,并列出可生成异常的完整列表。

+0

感谢您的回复。现在,我的问题是......在普通进程fork(即简单的vanilla Linux)中,代码中这些寄存器是从父到子复制的? – hebbo

+1

@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

+1

这[书籍预览](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

相关问题