Я работаю над небольшой ОС, которая будет использовать отдельную таблицу локальных дескрипторов для каждого процесса. Я понимаю, что мне нужно будет использовать инструкцию lldt
для загрузки сегмента LDT из моего GDT. У меня уже есть ядро, работающее в защищенном режиме с действующим GDT, но я не могу понять, как должна выглядеть запись GDT для моего LDT. Я понимаю, что его базовый адрес должен указывать на мой LDT, но я не знаю, каким должен быть уровень привилегий и другие атрибуты. Вот код NASM, который представляет запись LDT в моем GDT:
localTable equ $-gdt ; GDT entry #5 (selector 20h)
dw 0x1FF ; limit to 64 descriptors
dw 0x8000 ; base address
db 0x0
db 0x89 ; probably incorrect...
db 0x1f ; possibly incorrect...
db 0x0
Если вы не знакомы с синтаксисом NASM, эта запись таблицы имеет базовый адрес 0x8000 и ограничение в 511 (всего 512 байт или 64 записи) . Я прочитал раздел о GDT и LDT в справочном руководстве программиста i486, но я не могу полностью понять, как должна выглядеть моя запись GDT.
В любом случае, я загружаю LDT следующим образом:
mov ax, 0x20
lldt ax
Этот код вызывает процессор для генерации общей ошибки защиты (я обрабатываю ее с помощью прерывания). Я хотел бы знать две вещи:
1) Правильно ли я описал свой LDT в GDT? Если нет, что нужно изменить?
2) Может ли инструкция LLDT
дать сбой из-за того, что в моем LDT есть недопустимые селекторы? Я прочитал спецификацию инструкции LLDT, и мне кажется, что она даже не читает память LDT, но я просто хочу убедиться, что LLDT не дает сбоев, потому что у меня есть опечатка в моих данных LDT.