Использование LLDT и настройка GDT для него - PullRequest
6 голосов
/ 31 июля 2011

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

1 Ответ

3 голосов
/ 31 июля 2011

Хорошо, я понял это. Тип, который я использовал (1001b), был не тем, что мне было нужно. Я обнаружил, что тип 2 (10b) используется для записей LDT. Для сведения, эта информация содержится в главе 6, стр. 4, Руководства программиста по микропроцессору *1004*. Моя функциональная запись GDT выглядит следующим образом:

localTable equ $-gdt            ; GDT entry #5 (selector 20h)
dw 0x1FF                        ; limit to 64 descriptors
dw 0x8000                       ; base address
db 0x0
db 0x82                         ; 10000010b (segment present set, WTM)
db 0x1f
db 0x0
...