Установите точку останова на входе в 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