2013-08-22 66 views
1

以下x86指令導致三重故障異常(cpu reset)。任何想法爲什麼?爲什麼x86 movsd會導致三重故障異常?

0042F94B F20F100520E44300 movsd xmm0,qword [dword 0x43e420] 

以下代碼插入之前,爲了該指令以驗證存儲器在0x43e420是可訪問的(它是):

0042F945 8B0520E44300  mov eax,[dword 0x43e420] 

X86是在保護模式。 GDT設置正確,段寄存器都是0x10,除了cs是0x8。兩個GDT條目都是平坦的,並佔用整個32位內存空間。沒有設置eflags上的對齊檢查(AC)。

內存在0x43e420是:一旦指令被執行

0x43e420: 00 00 00 00 00 00 00 40 

Bochs的模擬器輸出這些信息:

interrupt(): gate.type(9) != {5,6,7,14,15}  
interrupt(): gate descriptor is not valid sys seg (vector=0x0d) 
interrupt(): gate descriptor is not valid sys seg (vector=0x08) 

這是OS引導代碼部分;不是任何操作系統下的應用程序。

+0

該指令看起來很時髦。 AFAIK,'movsd'是一個雙字大小的字符串移動。你可能意思是'movq'? –

+1

有兩個操作碼指令具有相同的名稱。這裏使用的movsd是SSE2指令集的一部分。 – tgiphil

+0

所以有。那麼,這不是很方便,是嗎?哦,每天都要學點新東西。所以,對於這個問題,這可能是一個對齊問題? –

回答

4

鑑於提供的信息,我懷疑您的處理器尚未啓用SSE指令。如果未啓用,它們的使用將觸發一個例外(我認爲向量19)。此外,如果這個向量沒有正確初始化,那麼我肯定會看到它導致三重錯誤。

有關啓用處理器SSE指令的更多信息,請參閱64-ia-32架構軟件開發手冊的第13卷第3卷。

希望這會有所幫助。

+0

這正是問題所在。我發現從這裏啓用SSE的代碼:http://wiki.osdev.org/SSE – tgiphil

2

考慮到地址是對齊的,並且您在啓動代碼中,對於初始異常最可能的解釋是SSE在啓動時尚未啓用。爲什麼這種異常導致三重故障是一個更微妙的問題,但可能你沒有設置矢量來處理它。

相關問題