La Tabla Descriptora Global ( GDT ) es una parte fundamental de la arquitectura x86 de Intel que ayuda a gestionar cómo se accede a la memoria y cómo se protege. Introducida con el procesador Intel 80286 , desempeña un papel clave en la definición de los segmentos de memoria y sus atributos: la dirección base, el tamaño y los privilegios de acceso, como la ejecutabilidad y la escritura. [ 1 ]
Aunque los sistemas modernos de 64 bits rara vez dependen de la segmentación, la GDT sigue siendo un componente necesario para arrancar el procesador y gestionar ciertas tareas a nivel del sistema.
Descripción
La GDT ayuda a aislar la memoria entre el software de aplicación y el sistema operativo .
En el modo protegido (un modo de procesador más avanzado que permite la protección de la memoria ), el GDT define:
- Segmentos de código: regiones de memoria que contienen instrucciones ejecutables.
- Segmentos de datos: áreas utilizadas para almacenar datos del programa.
- Segmentos del sistema, como el Segmento de Estado de Tarea (TSS), que se utiliza para el soporte de multitarea. [ 1 ] [ 2 ]
Cada entrada en la GDT tiene una longitud de 8 o 16 bytes y contiene un descriptor de segmento que define las propiedades de un segmento. Cada descriptor incluye derechos de acceso, lo que garantiza que los programas no puedan modificar la memoria protegida. [ 1 ]

Para utilizar un segmento, un programa lo referencia mediante un selector de segmento , un valor especial que indica al procesador qué entrada de la GDT debe usar. A continuación, el procesador carga este descriptor en un registro de segmento , que contiene metadatos visibles y ocultos sobre el segmento.
GDT en 64 bits
En el modo de 64 bits, la segmentación está mayormente deshabilitada: todas las bases de segmento se tratan como cero y se ignoran los límites, creando un espacio de direcciones plano. Sin embargo, la GDT sigue siendo necesaria para definir descriptores del sistema como el Segmento de Estado de Tarea (TSS). Dos registros de segmento, FS y GS, permanecen activos y suelen ser utilizados por los sistemas operativos para el almacenamiento local de subprocesos o datos específicos de procesos (por ejemplo, el Bloque de Entorno de Subprocesos en Windows o gs_base en Linux ). [ 1 ]
Cabe destacar que Windows aplica protecciones estrictas: los intentos de interceptar o modificar la GDT en versiones de 64 bits provocarán un fallo del sistema ( comprobación de errores ). [ 3 ]
Tabla de descriptores locales
Mientras que la GDT define segmentos a nivel de sistema, la Tabla de Descriptores Locales ( LDT ) puede definir segmentos privados para un solo proceso. Históricamente, los sistemas operativos utilizaban la LDT para separar la memoria de cada programa en regiones privadas, especialmente antes de la introducción de la paginación con el Intel 80386.
Actualmente, las LDT están mayormente obsoletas, pero aún pueden aparecer para garantizar la compatibilidad con aplicaciones de 16 bits o de 32 bits más antiguas (por ejemplo, programas de DOS u OS/2 ). La LDT se define mediante una entrada en la GDT y puede incluir hasta 8192 descriptores de segmento. [ 2 ]
Historia y uso moderno
En los primeros sistemas x86 (como el 80286 ), la segmentación mediante las tablas GDT y LDT era fundamental para implementar la multitarea y el aislamiento de memoria. Cada proceso tenía su propia LDT, mientras que la GDT contenía definiciones globales. El sistema podía cambiar automáticamente la LDT actual al cambiar de tarea, lo que hacía que el aislamiento basado en segmentos fuera eficiente.
Sin embargo, con la introducción de la paginación en el 80386 , los sistemas operativos comenzaron a utilizar memoria virtual basada en páginas en lugar de memoria basada en segmentos. La paginación permite una gestión de memoria granular en bloques de 4 KB y facilita compartir o proteger la memoria.
Como resultado, los sistemas operativos modernos como Windows , Linux y macOS utilizan un modelo de memoria plana, donde todos los segmentos de código y datos abarcan todo el espacio de direcciones . La GDT sigue participando en la inicialización del sistema, el manejo de interrupciones y la definición de estructuras especiales como el TSS y el puntero LDT. [ 1 ]
Los modos heredados o de compatibilidad (por ejemplo, la ejecución de código DOS o OS/2 de 16 bits) pueden seguir utilizando la segmentación de forma más activa. En estos casos, se puede emplear una técnica conocida como segmentación LDT, en la que la LDT se rellena con descriptores que asignan bloques de memoria de tamaño fijo (por ejemplo, 64 KB cada uno) para proporcionar cobertura a las aplicaciones heredadas.
Referencias
- 1 2 3 4 5 "Manual del desarrollador de software para arquitecturas Intel 64 e IA-32, Capítulo 5: "Gestión de memoria"" . Intel . Consultado el 19 de mayo de 2025 .
- 1 2 Tanenbaum, Andrew S.; Bos, Herbert (2014). Sistemas operativos modernos (4.ª ed.) (PDF) . Pearson. pág. 249. ISBN 978-0133591620. Consultado el 19 de mayo de 2025 .
- ↑ "Política de parcheo para sistemas basados en x64" . 8 de octubre de 2009. Archivado del original el 19 de enero de 2022. Consultado el 11 de diciembre de 2020.
Si el sistema operativo detecta alguna de estas modificaciones o cualquier otro parche no autorizado, generará una comprobación de errores y apagará el sistema.
Enlaces externos
- Manual del desarrollador de software de arquitectura Intel
- Tabla de descriptores globales archivada el 17/10/2009 en Wayback Machine en OSDev.org
- Tutorial de GDT archivado el 14 de febrero de 2009 en Wayback Machine en OSDev.org
- Tutorial de Bran sobre GDT para desarrolladores de kernels archivado el 3 de febrero de 2008 en Wayback Machine.
- Modo protegido de BrokenThorn archivado el 23/04/2018 en Wayback Machine.
- Arquitectura X86
- Gestión de la memoria