Использование LLDT и c onfiguring GDT для него

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

6
задан Alex Nichol 30 July 2011 в 21:37
поделиться