Estoy trabajando en un sistema operativo pequeño que utilizará una tabla de descriptores locales por separado para cada proceso. Entiendo que tendré que usar la instrucción lldt
para cargar un segmento LDT desde mi GDT. Ya tengo mi kernel ejecutándose en modo protegido con un GDT válido, pero no puedo entender cómo debería ser la entrada GDT para mi LDT. Entiendo que su dirección base debe apuntar a mi LDT, pero no sé cuál debería ser el nivel de privilegio y otros atributos. Aquí está el código NASM que representa la entrada LDT en mi GDT:Uso de LLDT y configuración del 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
Si usted no está familiarizado con la sintaxis NASM, este cuadro de entrada tiene una dirección base de 0x8000 y un límite de 511 (512 bytes en total, o 64 entradas). He leído la sección sobre GDT y LDT en el manual de referencia del programador i486, pero no puedo entender completamente cómo debería ser mi entrada GDT.
De todos modos, me carga la LDT, así:
mov ax, 0x20
lldt ax
Este código hace que el procesador para generar un error de protección general (I manejar con una interrupción). Me gustaría saber dos cosas:
1) ¿Describí correctamente mi LDT en el GDT? Si no, ¿qué necesita ser cambiado? 2) ¿Podría fallar la instrucción LLDT
porque hay selectores no válidos en mi LDT mismo? Leí la especificación de instrucción LLDT, y me parece que ni siquiera lee la memoria del LDT, pero solo quiero asegurarme de que el LLDT no está fallando porque tengo un error tipográfico en los datos de mi LDT.