#c #x86-64 #intel-tsx
#c #x86-64 #intel-tsx
Вопрос:
Я новичок в использовании Intel-TSX. Поэтому, пожалуйста, поправьте меня на любую терминологическую / концептуальную ошибку.
Я пытаюсь написать пользовательский движок rsa, используя здесь библиотеку polarssl (я знаю, что она старая, но мне было легко понять). У меня есть следующий код,
result=-1;
unsigned block;
int key_len= 128;
while(result!=1){
if ((block = _xbegin()) == _XBEGIN_STARTED) {
if( rsa_pkcs1_decrypt( amp;rsa_polar, amp;myrand, NULL, RSA_PRIVATE, amp;key_len, from, decrypt_plaintext, sizeof(decrypt_plaintext) ) != 0 )
exit(0);
rsa_free(amp;rsa_polar);
result=1;
_xend();
}else{
printf("RTM 2: Transaction failedn");
printf("status is %ldn", block);
}
printf("Block 2: Result is %dn", result);
}
Код внутри блока rtm не работает. Однако тот же код работает вне блока rtm. После запуска кода я получаю следующий вывод,
.
.
RTM 2: Transaction failed
status is 0
Block 2: Result is -1
.
.
Любая помощь / предложения о том, как это решить?
Комментарии:
1. Хорошо, это подтверждает, что на вашем компьютере включен используемый RTM, поэтому проблема заключается в деталях этой транзакции. Я бы беспокоился, что вызываемые вами функции могут выполнять слишком много работы. Я забыл, можно ли использовать
lock
инструкцию ed внутри транзакции;rsa_free
может сделать это, если это распределитель, защищенный от ошибок.2. Что
rsa_pkcs1_decrypt
делает? Выполняет ли он вообще какой-либо системный вызов? Как долго он работает? Многие вещи могут привести к прерыванию транзакции TSX, включая переключение контекста, инструкции FPU, смешанный доступ к регистрам XMM / YMM,cflush
,cpuid
и так далее. Если функция достаточно длинная и сложная, существует очень высокая вероятность того, что происходит хотя бы одна из этих вещей. TSX не следует использовать в таких сценариях, но только в критических коротких разделах кода.3. Согласно разделу 16.3.5 тома 1 Руководства разработчиков программного обеспечения Intel, код состояния прерывания 0 может возникнуть, например, когда команда CPUID встречается в области RTM, поскольку она не удовлетворяет требованиям установки любого из битов EAX.
4. @PeterCordes: Если бы причиной прерывания было «слишком много работы», то я полагаю, что в коде состояния прерывания был бы установлен бит 3. Однако все биты понятны.
5. @ perplex 2 мс — это довольно долгое время, есть большая вероятность, что за этот интервал может произойти переключение контекста. В любом случае, функция слишком тяжелая, чтобы ее можно было запустить в одной транзакции TSX. Это не то, для чего предназначен TSX.