|
3 / 3 / 0
Регистрация: 15.07.2021
Сообщений: 15
|
|
Прерывания в Long Mode01.03.2025, 21:06. Показов 1929. Ответов 4
Метки нет (Все метки)
Вот уже недельку так с x86_64 пытаюсь разобраться, параллельно AMD'шные доки читая, но всё никак не могу с памятью работать научиться.
Вроде пишут, что для IDT(Interrupt Descriptor Table) дескриптора нужен селектор сегмента кода, в котором лежит обработчик прерывания, но при этом также в той же инструкции АМДишной прописано, что базовые адреса и размеры сегментов игнорируются. Да и если для IDT и не игнорируется базовый адрес, то какой писать в GDT дескриптор кода? Текущий адрес, куда у меня код загружается? Если что, у меня загрузка осуществляется через UEFI загрузчик, который ядро определяет не по фиксированному адресу, а "хитровыделенному", который может отличаться от системы к системе. Также UEFI сразу в Long Mode проц суёт, так что нужно выполнять хоть что-то из тех действий, что нужны для перехода в Long Mode, или можно просто новые таблички в GDTR и IDTR пихать и всё будет работать сразу, без изменения Control-регистров? Короче я сам себя похоже запутал) Кто знает - помогите разобраться, пожалуйста ![]() Хотелось бы с примером(можно на любом ассемблере, но если будет на FASM, то вообще отлично) Заранее спасибо
0
|
|
| 01.03.2025, 21:06 | |
|
Ответы с готовыми решениями:
4
IDT Ассемблер Long mode
|
|
Эксперт Hardware
|
||||||||||||||||||||||
| 05.03.2025, 19:17 | ||||||||||||||||||||||
Сообщение было отмечено Mikl___ как решение
РешениеЛучше взять отладчик WinDbg и посмотреть, как это дело реализует ядро Windows Ntoskrnl.exe. Читать доки одно, а наглядная картина это совсем другое. Из особенностей - таблица IDT может находиться хоть в секции-данных, т.к. в ней хранятся просто указатели на обработчики прерываний. А вот непосредственно процедуры обработки уже нужно положить в исполняемую секцию-кода. Все системные таблицы должны быть выровнены в памяти границу 4096-байт (одна вирт.страница), а IDT должна быть заполнена полностью, т.е. все 256 векторов от нуля до FFh. Если прерывание не имеет обработчика, вектор должен указывать на процедуру-заглушку (общая для всех неиспользуемых int'ов), которая тупо возвращает iretq.В режиме Long дескрипторы в GDT имеют чуть иной формат. В частности, если в атрибутах взведён бит(L), то база и лимит игнорируется, а вот тип и оставшиеся атрибуты по прежнему действительны, например привилегия DPL (селектор, кольцо защиты), а так-же тип сегмента "код или данные". Первые 2 дескриптора в GDT должны быть нулевыми, а дальше Code/Data Ring(0), и Code/Data Ring(3). Для начала остальные можно не указывать, а как добавишь в ядро планировщик потоков, может потребоваться и дескриптор сегмента TSS. Адреса таблиц GDT/IDT должны быть прописаны в регистрах gdtr/idtr соответственно, иначе проц их не найдёт. IDT не имеет дескриптора в GDT - она может располагаться где угодно, лишь-бы указатель на неё был прописан в регистре IDTR (в таблице GDT лежит дескриптор только на локальную таблицу LDT).Вот что думает отладчик WinDbg на этот счёт.. Каждая запись Entry в таблицах размером 8-байт (дескрипторы и векторы):
Расширение отладчика !idt дампит содержимое всей IDT, а команда dg отображает в удобном виде таблицу GDT:
и можем cдизассмить любой из них, например первый INT-00h "KiDivideErrorFault" (фрагмент):
так-что можно просмотреть и на его структуру "KIDTENTRY64":
тогда получаем всё тот-же указатель: 0xfffff800'02b01900.Так-же из записи видно, что Selector(10h) = Long CodeSeg, и привилегия DPL(0) = Ring(0).
5
|
||||||||||||||||||||||
|
3 / 3 / 0
Регистрация: 15.07.2021
Сообщений: 15
|
||||||
| 08.03.2025, 19:32 [ТС] | ||||||
|
R71MT, да мне то всего нужно было пустой обработчик создать и к таймеру APIC привязать, чтобы потом на его основе менеджмент задач сделать.
Про GDT и IDT осведомлён, просто когда я код писал под BIOS и делал переход в защищённый режим у меня всё ок работало, а когда перешёл на UEFI, то пришлось в Long Mode окунаться и... короче, только через неделю, когда понял как логирование в QEMU включить, смог найти в чём проблема - я неправильно адрес для GDT вычислял(для IDT, соответственно, тоже). В итоге проц исключение давал и эмулятор в перезарузку уходил, а я думал, что дело в самой IDT, потому и тему создал ![]() Всё равно спасибо, думаю этот ответ ещё кому-то пригодиться) Добавлено через 6 минут Также если кому-то нужно будет: в batch-скрипте, который запускает эмулятор QEMU, я использовал аргумент:
Можно конечно и в консольку выводить, убрав -D qemu_log.txt - но так(во всяком случае, у меня) эмулятор работает медленнее.
2
|
||||||
|
Эксперт Hardware
|
||
| 09.03.2025, 07:44 | ||
Сообщение было отмечено Adm1n1strat0r как решение
РешениеЕсли в GDT определены кольца защиты CPL/DPL (т.е. есть дескрипторы для Ring=0/3), то по таймеру с квантами на задачу, потребуется переходы Ring(0/3) и обратно. В режиме х32 это sysenter/sysexit, а в х64 syscall/sysret. При этом задействуются и регистры MSR для смены CS:RIP, а так-же MSR.KERNEL_GS_BASE для доступа к стеку ядра. Соответственно выходить из обработчика таймера LAPIC нужно будет уже парой инструкций swapgs + iretq (см.описание swapgs). Для обработчиков прерываний от аппаратных устройств типа диск, клава и прочие, swapgs уже не нужен.Сейчас, чтобы не получить в обработчике шедулер-таймера крэш, вам нужно через rdmsr прочитать значения указанных на скрине выше MSR, т.к. непонятно, что именно напихал в них EFI при переходе в Long. В частности узнать номер вектора прерывания от таймера LAPIC (кстати в большинстве случаях он замаскирован), для чего от базы из MSR.1Bh нужно сместиться на 0x320 к регистру локальной таблицы LVT. Если в этом регистре установлен бит(16), значит указанный в битах(0:7) вектор не валидный. Сам вектор является номером в IDT, и активировав сбросом бита(16) можно его переназначить. Только после этого можно будет плясать дальше..
2
|
||
|
4 / 3 / 2
Регистрация: 12.02.2025
Сообщений: 11
|
|||
| 17.04.2025, 13:41 | |||
|
Добавлено через 3 минуты
0
|
|||
| 17.04.2025, 13:41 | |
|
Помогаю со студенческими работами здесь
5
Вывести содержимое корневого каталога логического диска А, используя Handle-ориентирование и 13 прерывание Прерывание 20h Организовать аппаратное прерывание DOS Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|