Rdrand 指令 SIGILL

Posted

技术标签:

【中文标题】Rdrand 指令 SIGILL【英文标题】:Rdrand instrucrtion SIGILL 【发布时间】:2015-06-16 06:13:38 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您读错了 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。

【讨论】:

【参考方案2】:

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

【讨论】:

罗斯回答的最后一段已经指出了这一点>。

以上是关于Rdrand 指令 SIGILL的主要内容,如果未能解决你的问题,请参考以下文章

Debug系列SIGILL(Illegal instruction)问题定位

Debug系列SIGILL(Illegal instruction)问题定位

arm函数内部进行模式切换的技巧

求解Runtime Error 中的sigtrap 是啥错误?

signal常用信号

glBindFramebuffer 上的标志