Установите точку останова на входе в GDT/LDT/IDT

Я работаю над архитектурой x86, я хотел бы установить точку останова для записи таблицы глобальных дескрипторов или записи таблицы интерпретации дескриптора или ldt- это означает, что, например, каждый раз, когда конкретная запись читается из idt/gdt/ldt a точка останова будет срабатывать.

Я пытаюсь эмулировать этот сценарий с помощью эмулятора bochs x86, но у меня возникают проблемы с этим.

Благодарю.

1 ответ

Мне удалось установить точки останова только для записи idt (если кто-то знает, как отлаживать gdt или ldt, я бы тоже хотел знать)

1. Я включил трассировку прерываний: show int

(показать, когда происходит прерывание)

2. Я позволил bochs работать с Linux "dos".

00200280100: iret 0010: 0017937b (0xc017937b)

00200280101: исключение (не softint) 0010: 0010c8dd (0xc010c8dd)

00200281076: iret 0010: 0017937b (0xc017937b)

00200281119: исключение (не softint) 0x0010: 0010aa30 (0xc010aa30)

3. Я искал адрес исключения, который также является записью в idt, который я обнаружил, что 0010: 0010aa30 - это адрес записи с номером 0x0e, который является прерыванием "ошибка страницы".

Таблица дескрипторов прерываний (база = 0x00000000c0106060, предел =2047): IDT[0x0e]= цель 32-разрядного шлюза-ловушки =0x0010: 0010aa30, DPL = 0

4. Я ставлю точку останова в виртуальном адресе: 0x0010: 0x0010aa30

vbreak 0x0010: 0010aa30

5. Я дал машине поработать и получил:

00200302058: исключение (не softint) 0010: 0010aa30 (0xc010aa30)

(0) Точка останова 5684127, в 0010: 0010aa30 (0xc010aa30) Следующая в t = 200302058

(0) [0x00000010aa30] 0010: 000000000010aa30 (unk. Ctxt): push 0x00110200; 6800021100

Другие вопросы по тегам