[英]Rdrand instrucrtion SIGILL
Cpuid 說我的系統上有 rdrand,但 rdrand 指令會拋出 sigill。 我在 VmWare 工作站 11 中使用 linux mint,我在 rdrand 上搜索了工作站支持,他們說它從第 9 個版本開始啟用。 主機進程是i5-2550k,它應該支持rdrand。 我能以某種方式解決這個問題嗎? 這是 gdb 列表:
Breakpoint 1, 0x08048060 in _start ()
(gdb) x/5i $eip
=> 0x8048060 <_start>: mov $0x1,%eax
0x8048065 <_start+5>: cpuid
0x8048067 <_start+7>: rdrand %eax
0x804806a <_start+10>: mov $0x1,%eax
0x804806f <_start+15>: int $0x80
(gdb) si 2
0x08048067 in _start ()
(gdb) p/t $ecx
$1 = 10011111101110100010001000000011 ; bit 30 is set -- rdrand enabled.
(gdb) p/t $ebx
$2 = 10000100000000000
(gdb) p/t $eax
$3 = 100000011010100111
(gdb) si
Program received signal SIGILL, Illegal instruction.
0x08048067 in _start ()
Breakpoint 1, 0x08048060 in _start ()
(gdb) x/5i $eip
=> 0x8048060 <_start>: mov $0x1,%eax
0x8048065 <_start+5>: cpuid
0x8048067 <_start+7>: rdrand %eax
0x804806a <_start+10>: mov $0x1,%eax
0x804806f <_start+15>: int $0x80
(gdb) si 2
0x08048067 in _start ()
(gdb) p/t $ecx
$1 = 10011111101110100010001000000011
(gdb) p/t $ebx
$2 = 10000100000000000
(gdb) p/t $eax
$3 = 100000011010100111
(gdb) si
Program received signal SIGILL, Illegal instruction.
0x08048067 in _start ()
您讀錯了 ECX 寄存器。 RDRAND 位未設置。 位 30 是左起第二位:
10011111101110100010001000000011
^
Bit 30 ^ Bit 0
上圖取自 Intel 64 and IA-32 Architectures Software Developer's Manual 中給出的 CPUID 指令說明。
此外,您的 i5-2550K CPU 是 Sandy Bridge 處理器。 直到下一代英特爾處理器 Ivy Bridge 才引入 RDRAND。
RdRand 是在 Ivy Bridge 中引入的。 i5-2550K 是上一代 Sandy Bridge 的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.