2012-04-27 8 views
1

В 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, содержащий неканонический адрес, используется для обозначения места памяти --- вообще не возникает.

+0

Конечно, ничего не может случиться, когда процессор не может прочитать машинную инструкцию на RIP-адресе. –

+0

Да, определенно. Однако на данный момент я не беспокоюсь о том, что процессор не может прочитать инструкцию по адресу, указанному RIP. На данный момент меня беспокоят все несоответствия самого RIP и связанные с этим исключения. – shigoel

ответ

1

RIP должен также содержать канонические адреса, а не только, скажем RSP или RBX при доступе к памяти.

EDIT: вы можете увидеть, что RIP не исключается из требования в:

  • описание SYSENTER/SYSEXIT и SYSCALL/SYSRET
  • раздел «Прерывание 13-General Protection Exception (#GP) ": If the target offset in a destination operand of a call or jmp is in a non-canonical form.
+0

Спасибо за ответ. Я отредактировал вопрос, чтобы включить то, что я узнал после того, как прочитал ваш ответ. – shigoel

0

В чем разница? Если вы попытаетесь установить RIP с помощью команды перехода или вызова, процессор будет попытаться загрузить этот адрес и ловушку. Не имеет значения, указана ли ловушка как установленная в регистре или загружается из icache?

+0

Мне нужно знать, где именно возникло исключение.Причина в том, что я пытаюсь официально указать часть процессора x86-64 и детали, подобные этим вопросам. – shigoel

+0

Опираясь на такое различие, кажется опасным. Помните, что это оригинальные для этой архитектуры спецификации AMD. Мне представляется разумным, что реализация может юридически реализовать ** либо ** RIP меньше 64 бит, для которых требуются канонические адреса ** или ** регистр полной ширины, захваченный при загрузке. –

+0

Спасибо за комментарий. Я полностью согласен с вами (BTW, в сторону: руководства AMD настолько читаемы, как Intel). Язык хорош, так что форматирование и множество таблиц и цифр помогают в более быстром понимании). Назад к основной теме --- часть моей цели - сделать официальные спецификации настолько «надежными», чтобы они представляли идеи, такие как канонические адреса, не беспокоясь о их реализации, если можно доказать, что реализация удовлетворяет идеям. Для этого я сначала изучаю реализации, прежде чем я смогу придумать для них «абстракции». – shigoel