Подтвердить что ты не робот

Может ли предсказание ветвления сбой моей программы?

Перейдя через главу 3 этой книги под названием Архитектура компьютерных систем: перспектива программиста, говорится, что реализация типа

testl %eax, %eax
cmovne (%eax), %edx

неверно, потому что, если предсказание терпит неудачу, у нас будет NULL разыменование. Также указано, что мы должны использовать код ветвления.

Тем не менее, не будет ли использование условных переходов привести к одному результату? Например:

.L1:
jmp *%eax

testl %eax, %eax
jne .L1

Можно ли обмануть gcc для вывода чего-то подобного для x86-32? Предположим, у меня есть массив указателей на функции, некоторые из которых действительны, а некоторые нет, и я называю каждый из них не NULL.

4b9b3361

Ответ 1

Нет. Вы не должны обнаруживать внекорпоративную выборку инструкции jmp, если она является частью спекулятивного выполнения, которая оказывается недействительной из-за теста и перехода.

Инструкция cmove__ точно документирована, чтобы вызвать ошибку, если операнд доступа к памяти приведет к ошибке, даже если условие не встретил. Другими словами, это не спекулятивное исполнение. Это часть семантики команд. Это переход к определению, которое условно, а не выборка.

Инструкция jmp не документирована.

Я не получаю смысл вашего примерного кода, потому что нет условия для операции с памятью *%eax. Если %eax содержит нуль, конечно, выборка в безусловном выполнении jmp *%eax приведет к ошибке. Это правильное поведение. Если вы протестируете %eax и перейдете к плохой ссылке.

testl %eax, %eax
je .L1
jmp *%eax
.L1:

Не может быть проблемы. Спекулятивное выполнение *%eax не может вызвать ошибку, если спекуляция не будет действительной, т.е. Истинный путь управления. Это похоже на поведение для неправильных кодов операций, деление на ноль и т.п.: Семантика нормальной программы не зависит от спекулятивного исполнения.

В тех случаях, когда изъятия из-за порядка и магазины действительно вызывают всевозможные интересные проблемы в многопроцессорной обработке. Эта статья, а также ее первая часть в предыдущем выпуске - отличное обсуждение этой темы.