Rdrand说明SIGILL

时间:2015-06-16 06:13:39

标签: assembly vmware intel cpuid rdrand

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 ()

2 个答案:

答案 0 :(得分:4)

您已经错误地阅读了ECX注册表。 RDRAND位未设置。位30是左起第二位:

10011111101110100010001000000011
 ^
 Bit 30                        ^ Bit 0

CPUID information returned in ECX

上图来自Intel 64和IA-32架构软件开发人员手册中给出的CPUID指令说明。

此外,您的i5-2550K CPU是Sandy Bridge处理器。直到下一代英特尔处理器Ivy Bridge才推出RDRAND。

答案 1 :(得分:0)

RdRand是在Ivy Bridge中引入的。 i5-2550K是上一代Sandy Bridge的一部分。