¿Qué es la tabla de descriptores globales?

Tabla de descriptores globales:

  • La tabla de descriptores globales es una estructura de datos que utilizan los procesadores de la familia Intel x86 a partir del 80286 con el fin de definir las características de las diversas áreas de memoria (segmentos) que se utilizan durante la ejecución del programa, incluido el tamaño, la dirección base y privilegios de acceso como escritura y ejecutable.
  • Intel Corporation es una empresa de tecnología estadounidense y una corporación multinacional. Tiene su sede en Silicon Valley, en Santa Clara, California. Intel Corporation es el mayor fabricante mundial de chips semiconductores. También desarrolla la serie x86 de microprocesadores.
  • x86 es una serie de microprocesadores que se encuentran en la mayoría de las computadoras personales (PC).
  • El Intel 80286 también se conoce como iAPX 286[4] o Intel 286 . Es un microprocesador de 16 bits que se lanzó el 1 de febrero de 1982. Fue la primera CPU basada en 8086 que tiene buses de datos separados y direcciones no multiplexadas. También fue la primera CPU con administración de memoria y amplias capacidades de protección.

Estructura:
Exactamente en modo protegido, en la Arquitectura Intel, esencialmente las Rutinas de Servicio de Interrupción y la gestión de la memoria son gestionadas por tablas de descriptores. Cada descriptor guarda la información sobre un solo objeto, por ejemplo; una tarea, una rutina de servicio, una porción de datos o código, etc., que la CPU puede necesitar en algún momento. Si alguien intenta ingresar un nuevo valor en un registro de segmento, la CPU requiere que se lleven a cabo verificaciones de control de acceso y seguridad para ver si literalmente se le permite acceder a esa área de memoria específica o no. Si estas comprobaciones se realizan con éxito, los valores útiles se almacenan en caché en registros invisibles de la CPU. Intel representa 3 tipos de tablas de la siguiente manera.

  1. La tabla de descriptores de interrupción (que reemplaza a la IVT)
  2. La tabla de descriptores globales (GDT)
  3. La tabla de descriptores locales (LDT)

Nota:
todas las tablas anteriores se representan como una dirección lineal, el tamaño de la CPU mediante las instrucciones LIDT, LGDT, LLDT secuencialmente. En la mayoría de los casos, el sistema operativo informa directamente dónde están esas tablas en el momento del arranque y luego, claramente, el sistema operativo escribe o lee las tablas mediante un puntero.

Descripción general de GDT:
la tabla de descriptores globales contiene entradas que le informan a la CPU sobre el segmento de memoria. Es peculiar de la arquitectura IA32.

Composición:
Aquí, entenderemos la composición GDT paso a paso de la siguiente manera.
Paso 1:
mediante el uso de la instrucción de ensamblaje LGDT, se carga el GDT. Busca la ubicación de una estructura de descripción GDT. :

RGPD

Paso 2:
Aquí, el Desplazamiento es la dirección lineal de la tabla de descriptores, cuyo significado es que se aplica la paginación y el Tamaño aquí es el tamaño de la tabla de descriptores que se resta en 1. El tamaño de la tabla de descriptores se resta por 1 porque 65535 es el valor máximo para el tamaño, pero la GDT solo puede tener hasta 65536 bytes (lo que significa que las entradas pueden tener un máximo de 8192). Además, ningún GDT puede tener un tamaño de 0.

Paso 3:
la GDT contiene entradas de 8 bytes, cada una de las cuales tiene una estructura compleja como la siguiente.

Entrada GDT

Paso 4:
Aquí, Límite 0:15 significa que el campo lleva 0-15 bits del valor límite. La base tiene un valor de 32 bits que contiene la dirección lineal desde donde comienza el segmento y un valor de 20 bits aquí indica la unidad máxima direccionable (que está en 1 byte de unidades o en páginas). Por lo tanto, si alguien selecciona la granularidad de la página, como 4 KiB, y luego establece el valor límite en 0 × FFFFF, el segmento aquí tendrá una longitud de espacio de direcciones de 4 GiB. A continuación se muestra la composición de las banderas y el byte de acceso que se muestra a continuación.

Bits GDT

Paso 5: 
Descripción del símbolo –

  • Pr – 
    Significa Bit Presente. Debe ser de 1 bit para todos los sectores válidos.
  • Privl – 
    Significa Privilegio. Debe contener 2 bits y el nivel del anillo donde 0 = más alto (núcleo) y 3 = más bajo (aplicaciones de usuario).
  • S – 
    Significa tipo de Descriptor. Debe configurarse para segmentos de datos o código y debe dejarse vacío para segmentos del sistema (por ejemplo, segmento de estado de tareas).
  • Ej: 
    significa bit ejecutable. Si Ex es 1, entonces se puede ejecutar el código en este segmento (es decir, selector de código) y si Ex es 0, entonces es un selector de datos.
  • DC: 
    significa bit de dirección, también conocido como bit de conformidad. Dice la dirección. Si DC = 0, entonces el segmento crece, y si DC = 1, entonces el segmento crece hacia abajo (significa que el límite es más pequeño que el desplazamiento).

Paso 6:           
bit de conformidad para selectores de código:
si 1 código en el segmento dado se lleva a cabo desde un nivel de privilegio igual o inferior. Por ejemplo, el código en el anillo 3 salta lejos al código conforme en los segmentos del anillo 2. Los bits privl muestran el nivel de privilegio más alto que se permite para ejecutar el segmento. Por ejemplo, el código en el anillo 0 no puede saltar lejos a un segmento de código conforme con privl == 0 × 2, pero el código en los anillos 2 y 3 sí puede hacerlo. Por lo tanto, el nivel de privilegio sigue siendo el mismo, es decir, un salto lejano del anillo 3 a un privl == 2: el segmento permanece en el anillo 3 después del salto. Si es 0, entonces el código en este segmento solo se puede ejecutar desde el conjunto de anillos en privl.

Paso 7: 
Descripción del símbolo –

  • RW: 
    significa bit de lectura o bit de escritura.
  1.  Bit legible para selectores de código: 
    en caso de que se permita el acceso de lectura para este segmento. Nunca se permite el acceso de escritura para los segmentos de código.
  2.  Bit de escritura para selectores de datos: 
    en caso de que se permita el acceso de escritura para este segmento. El acceso de lectura siempre está permitido para los segmentos de datos.
  • Ac – 
    Significa bit de acceso. Establézcalo en 0. Cuando se accede al segmento, la CPU lo establece en 1.
  • Gr: 
    significa bit de granularidad. Si es 0, el límite está en bloques de 1 B (granularidad de bytes), si es 1, el límite está en bloques de 4 KiB (granularidad de página).
  • Sz – 
    Significa Bit de tamaño. Si es 0, el selector define el modo protegido de 16 bits. Si es 1, el selector define el modo protegido de 32 bits. Podemos tener selectores tanto de 16 bits como de 32 bits a la vez.

Qué se guarda en GDT:
Con el fin de mantener el equilibrio, siempre se deben almacenar los siguientes artículos en GDT de la siguiente manera.

  • El procesador no hace ninguna referencia al descriptor nulo. Algunos emuladores (como — Bochs) se quejarán de las excepciones en el límite. Este descriptor también se usa para almacenar un puntero a la propia GDT (para usar con la instrucción LGDT). El puntero tiene 6 bytes de ancho y el descriptor nulo tiene 8 bytes de ancho. Por lo tanto, GDT podría ser el lugar perfecto para esto.
  • Un descriptor de segmento TSS (mantenga un lugar para al menos uno).
  • Un descriptor de segmento de datos (no podemos escribir en un segmento de código, por lo tanto, lo agregamos con tipo = 0 × 92).
  • Un descriptor de segmento de código (para el kernel, debe tener el tipo = 0 × 9A).
  • Espacio para más segmentos si los necesitamos (por ejemplo, LDT, nivel de usuario, más TSS, etc.).

Publicación traducida automáticamente

Artículo escrito por nehashrirudra y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *