Rdrand инструкция SIGILL
Cpuid говорит, что в моей системе есть rdrand, но инструкция rdrand выдает sigill. Я использую linux mint внутри рабочей станции VmWare 11, я погуглил поддержку рабочей станции 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
Изображение выше взято из описания инструкции CPUID, приведенного в Руководстве разработчика программного обеспечения для архитектуры Intel 64 и IA-32.
Также ваш процессор i5-2550K является процессором Sandy Bridge. RDRAND не был представлен до следующего поколения процессоров Intel, Ivy Bridge.
RdRand был представлен в Ivy Bridge. I5-2550K является частью Sandy Bridge предыдущего поколения.