Я работаю над небольшой ОС, которая будет использовать отдельную таблицу локальных дескрипторов для каждого процесса.Я понимаю, что мне нужно будет использовать инструкцию 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 есть опечатка.