#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. Это была моя ошибка. Я настроил обработчик только на прием входа в режим ядра. Нужно внимательнее ознакомиться с руководствами.