2011-07-30 9 views
6

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.

Respuesta

3

Ok, lo descubrí. El tipo que estaba usando (1001b) no era lo que necesitaba. Encontré que el tipo 2 (10b) se usa para las entradas de LDT. Para el registro, esta información se encuentra en el capítulo 6, página 4, del Microprocesador i486, Manual del programador. Mi entrada GDT funcional se ve de la siguiente manera:

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 
Cuestiones relacionadas