Почему int 3 вызывает ошибку общей защиты?

#assembly #gcc #x86 #operating-system #osdev

#сборка #gcc #x86 #операционная система #экранное меню

Вопрос:

У меня возникли проблемы с лабораторной работой из курса MIT 6.828.

В лабораторных заметках меня просят написать обработчик для debug breakpoint , соответствующий ловушке номер 3. В кодах, предоставленных лабораторией, есть встроенная сборка, вызывающая прерывание напрямую, например:

 void
umain(int argc, char **argv)
{
    asm volatile("int $3");
}
  

Код скомпилирован как int3 инструкция без неожиданностей, как показывает код дизассемблирования.

Когда я запускаю его, сгенерированный фрейм перехвата показывает, что он вызвал прерывание с номером 13 , ошибка общей защиты, а не 3 , что сбивает с толку. Другие виды прерываний не имеют такой проблемы при тестировании.

Пожалуйста, любезно объясните, как может быть вызвана ошибка общей защиты и почему.

Комментарии:

1. То, что компилятор компилирует » int $3 » как » int3 «, не так очевидно, как вы думаете: есть два (очень особых) случая, когда две инструкции int $3 = 0xCD 03 и int3 = 0xCC ведут себя немного по-разному; поэтому некоторые компиляторы различают две инструкции!

2. Что означает » Другие виды прерываний не имеют такой проблемы при тестировании. » что значит? Вы написали обработчик для некоторого прерывания > 0x30 (например, для » int 0x35 «) и int 0x35 инструкция вошла в ваше прерывание?

3. В Intel SDM vol. 2 перечислены все возможные причины, по которым команда INT может вызвать #GP.

4. Запустите вашу программу в один шаг в эмуляторе, подобном BOCHS, который позволит вам точно определить, что привело к #GP.

5. Это была моя ошибка. Я настроил обработчик только на прием входа в режим ядра. Нужно внимательнее ознакомиться с руководствами.