2015-06-22 71 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

相關問題