В Intel Руководства сказать следующее о канонических адресов и общее исключение защиты:Неканонические линейные адреса и общая защита исключения
С (т 1, стр 3-13.):
«Если в большинстве случаев генерируется исключение общей защиты (#GP) ... »
От (том 3A, стр. 6) -52):
«Следующие условия приводят к исключениям общей защиты в 64-разрядном режиме:
- Если адрес памяти находится в неканонической форме.
- Если адрес памяти дескриптора сегмента находится в неканонической форме. ...»
Я интересно узнать, является ли содержимое RIP также классифицируются как „адрес памяти“, как указано в приведенной выше цитате. Или это так, что RIP может содержать неканонической адрес, но #GP не будет поднят, пока RIP используется для обозначения места в памяти?
[EDIT]
я более внимательно прочитайте руководства сейчас, особенно псевдокод для инструкций CALL, RET и JMP (поскольку они находятся на свободе rty для изменения RIP). Я заметил, что в 64-битном режиме проверка каноничности адреса выполняется до того, как он будет сохранен в RIP, в результате чего #GP будет поднят до того, как RIP получит неканонический адрес. Итак, ответ на мой вопрос заключается в том, что RIP никогда не может содержать неканонический адрес.
Ситуация, в которой меня беспокоило, что #GP будет поднят, потому что RIP, содержащий неканонический адрес, используется для обозначения места памяти --- вообще не возникает.
Конечно, ничего не может случиться, когда процессор не может прочитать машинную инструкцию на RIP-адресе. –
Да, определенно. Однако на данный момент я не беспокоюсь о том, что процессор не может прочитать инструкцию по адресу, указанному RIP. На данный момент меня беспокоят все несоответствия самого RIP и связанные с этим исключения. – shigoel