El segmento de estado de tarea ( TSS ) es una estructura en computadoras basadas en x86 que almacena información sobre una tarea . El núcleo del sistema operativo lo utiliza para la gestión de tareas. Específicamente, la siguiente información se almacena en el TSS:
- Estado del registro del procesador
- permisos de puerto de E/S
- Punteros de pila de nivel de privilegio interno
- Enlace TSS anterior
- Estado de depuración
- Puntero de pila de sombra
Toda esta información debe almacenarse en ubicaciones específicas dentro del TSS como se especifica en el Volumen 3(a), Capítulo 8 de los manuales IA-32 .
Ubicación del TSS
El TSS puede residir en cualquier lugar de la memoria . Un registro de segmento llamado registro de tarea (TR) contiene un selector de segmento que apunta a un descriptor de segmento TSS válido que reside en la GDT (un descriptor TSS no puede residir en la LDT ). Por lo tanto, para usar un TSS, el núcleo del sistema operativo debe realizar lo siguiente:
- Cree una entrada de descriptor TSS en el GDT.
- Cargue la TR con el selector de segmento para ese segmento.
- Agregue información al TSS en memoria según sea necesario.
Por motivos de seguridad, el TSS debe ubicarse en una memoria a la que solo tenga acceso el núcleo .
Registro de tareas
El registro TR es un registro de 16 bits que contiene un selector de segmento para el TSS. Se puede cargar mediante la instrucción LTR . LTR es una instrucción privilegiada y funciona de manera similar a otras cargas de registros de segmento. El registro de tarea tiene dos partes: una parte visible y accesible para el programador y otra invisible que se carga automáticamente desde el descriptor TSS.
Estados registrados
El TSS puede contener valores guardados de todos los registros x86 . Esto se utiliza para el cambio de tareas . El sistema operativo puede cargar el TSS con los valores de los registros que necesita la nueva tarea y, tras ejecutar un cambio de tarea por hardware (como con una instrucción IRET ), la CPU x86 cargará los valores guardados del TSS en los registros correspondientes. Cabe destacar que algunos sistemas operativos modernos, como Windows y Linux [ 1 ], no utilizan estos campos del TSS, ya que implementan el cambio de tareas por software.
Tenga en cuenta que, durante un cambio de tarea de hardware, ciertos campos del TSS antiguo se actualizan con el contenido actual de los registros de la CPU antes de que se lean los valores del nuevo TSS. Por lo tanto, algunos campos del TSS son de lectura/escritura, mientras que otros son de solo lectura.
- Campos de lectura/escritura : se leen y se escriben durante un cambio de tarea de hardware.
- Todos los registros de propósito general (
EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP) - Todos los registros de segmento (
CS,DS,ES,FS,GS,SS) - Estado de ejecución actual (
EIP,EFlags) - El
Linkcampo en el nuevo TSS, si el cambio de tarea se debió a unCALLoINTen lugar de unJMP.
- Todos los registros de propósito general (
- Campos de solo lectura : solo se pueden leer cuando sea necesario, como se indica.
- Registro de control 3 (
CR3), también conocido como registro base del directorio de páginas (PDBR).- Lectura realizada durante un cambio de tarea de hardware.
- El registro de la tabla de descriptores locales (
LDTR)- Lectura realizada durante un cambio de tarea de hardware.
- Los tres pares de pilas de nivel de privilegio (
SS0:ESP0,SS1:ESP1,SS2:ESP2)- Leer durante un cambio de nivel
CALLoINTpara establecer una nueva pila.
- Leer durante un cambio de nivel
- El puntero del mapa de bits del puerto de E/S (
IOPB) y el propio mapa de bits del puerto de E/S- Lea durante una instrucción
IN,OUT,INSo si es para confirmar que la instrucción es legal (consulte los permisos del puerto de E/S a continuación).OUTSCPL > IOPL
- Lea durante una instrucción
- trampa de depuración (T)
- SSP
- Registro de control 3 (
De hecho, este PDBRcampo es el primero que se lee del nuevo TSS: dado que un cambio de tarea de hardware también puede cambiar a una asignación de tabla de páginas completamente diferente , todos los demás campos (especialmente el LDTR) son relativos a la nueva asignación.
permisos de puerto de E/S
El TSS contiene un puntero de 16 bits al mapa de bits de permisos de puertos de E/S para la tarea actual . Este mapa de bits, generalmente configurado por el sistema operativo al iniciar una tarea, especifica los puertos individuales a los que el programa debe tener acceso. El mapa de bits de E/S es una matriz de bits de permisos de acceso a puertos; si el programa tiene permiso para acceder a un puerto, se almacena un "0" en el índice de bit correspondiente, y si no lo tiene, se almacena un "1". Si el límite de segmentos del TSS es menor que el mapa de bits completo, se asume que todos los bits faltantes son "1".
La función opera de la siguiente manera: cuando un programa emite una instrucción de puerto de E/S x86, como IN o OUT (consulte la lista de instrucciones x86 ; tenga en cuenta que existen versiones de longitud de byte, palabra y dword), el hardware realiza una comprobación del nivel de privilegio de E/S (IOPL) para determinar si el programa tiene acceso a todos los puertos de E/S. Si el nivel de privilegio actual (CPL) del programa es numéricamente mayor que el nivel de privilegio de E/S (IOPL) (el programa tiene menos privilegios de los que especifica el IOPL), el programa no tiene acceso a todos los puertos de E/S. A continuación, el hardware comprueba el mapa de bits de permisos de E/S en el TSS para determinar si el programa puede acceder a los puertos específicos de la instrucción IN o OUT. Si todos los bits relevantes del mapa de bits de permisos de puerto de E/S están desactivados, se permite el acceso del programa a los puertos y se autoriza la ejecución de la instrucción. Si alguno de los bits relevantes está activado, o si alguno de ellos supera el límite del segmento TSS, el programa no tiene acceso y el procesador genera un fallo de protección general . Esta función permite a los sistemas operativos otorgar acceso selectivo a los puertos a los programas de usuario.
Punteros de pila de nivel interno
El TSS contiene 6 campos para especificar el nuevo puntero de pila cuando se produce un cambio de nivel de privilegio. El campo SS0 contiene el selector de segmento de pila para CPL=0, y el campo ESP0/RSP0 contiene el nuevo valor ESP/RSP para CPL=0. Cuando se produce una interrupción en modo protegido (32 bits), la CPU x86 busca en el TSS los valores SS0 y ESP0 y los carga en SS y ESP, respectivamente. Esto permite que el kernel utilice una pila diferente a la del programa de usuario, y que esta pila sea única para cada programa.
Una nueva característica introducida en las extensiones AMD64 se denomina Tabla de Pila de Interrupciones (IST), que también reside en la TSS y contiene punteros de pila lógicos (segmento + desplazamiento). Si una tabla de descriptores de interrupción especifica una entrada de la IST para usar (hay 7), el procesador cargará la nueva pila desde la IST. Esto permite usar pilas conocidas en caso de errores graves ( NMI o doble fallo, por ejemplo). Anteriormente, la entrada para la excepción o interrupción en la IDT apuntaba a una puerta de tarea, lo que hacía que el procesador cambiara a la tarea a la que apuntaba la puerta de tarea. Los valores originales de los registros se guardaban en la TSS actual en el momento en que ocurría la interrupción o excepción. El procesador entonces establecía los registros, incluido SS:ESP, a un valor conocido especificado en la TSS y guardaba el selector en la TSS anterior. El problema aquí es que el cambio de tarea por hardware no es compatible con AMD64.
Enlace TSS anterior
Este es un selector de 16 bits que permite vincular este TSS con el anterior. Se utiliza únicamente para la conmutación de tareas por hardware. Consulte los manuales del IA-32 para obtener más información.
Uso de TSS en Linux
Aunque se podría crear un TSS para cada tarea que se ejecuta en el equipo, el kernel de Linux solo crea un TSS por cada CPU y los utiliza para todas las tareas. Este enfoque se seleccionó porque facilita la portabilidad a otras arquitecturas (por ejemplo, la arquitectura AMD64 no admite conmutadores de tareas por hardware) y mejora el rendimiento y la flexibilidad. Linux solo utiliza el mapa de bits de permisos del puerto de E/S y las características de la pila interna del TSS; las demás características solo son necesarias para los conmutadores de tareas por hardware, que el kernel de Linux no utiliza. [ 2 ]
Excepciones relacionadas con el TSS
El vector de excepción x86 10 se denomina excepción TSS no válida (#TS). El procesador la genera cuando se produce un error en el acceso a la TSS. Por ejemplo, si se produce una interrupción en CPL=3 y se transfiere el control a CPL=0, la TSS se utiliza para extraer SS0 y ESP0/RSP0 para el cambio de pila. Si el registro de tareas contiene un selector TSS erróneo, se generará un fallo #TS. La excepción TSS no válida nunca debería producirse durante el funcionamiento normal del sistema operativo y siempre está relacionada con errores del kernel o fallos de hardware.
Para obtener más detalles sobre las excepciones de TSS, consulte el Volumen 3(a), Capítulo 6 del manual IA-32 . [ 3 ]
TSS en modo x86-64
La arquitectura x86-64 no admite conmutadores de tareas de hardware. Sin embargo, el TSS aún se puede usar en una máquina que funcione en los modos extendidos de 64 bits. En estos modos, el TSS sigue siendo útil ya que almacena:
- Las direcciones del puntero de pila para cada nivel de privilegio.
- Direcciones de puntero para la tabla de pila de interrupciones (la sección anterior sobre punteros de pila de nivel interno analiza la necesidad de esto).
- Dirección de desplazamiento del mapa de bits de permisos de E/S.
Además, en estos modos, el registro de tareas se amplía para poder almacenar una dirección base de 64 bits .
Referencias
- ^ Bovet, Daniel Pierre; Cesatí, Marco (2006). Comprensión del kernel de Linux, tercera edición . Medios O'Reilly . pag. 104.ISBN 978-0-596-00565-8. Consultado el 23 de noviembre de 2009 .
- ^ Daniel P. Bovet; Marco Cesati (2006). Comprender el kernel de Linux . O'Reilly. pag. 104.ISBN 9780596554910. Consultado el 25 de febrero de 2014 .
- ↑ "Manual del desarrollador de software para arquitecturas Intel 64 e IA-32, volumen 3a" . Consultado el 21 de mayo de 2012 .
Enlaces externos
- Programa de demostración que utiliza TSSes
- Arquitectura X86