El segmento de estado de la tarea ( TSS ) es una estructura en equipos basados en x86 que contiene información sobre una tarea . Lo utiliza el kernel del sistema operativo para la gestión de tareas. Específicamente, la siguiente información se almacena en el TSS:
- Estado de registro del procesador
- Permisos del puerto de E / S
- Punteros de pila de nivel interno
- Enlace TSS anterior
Toda esta información debe almacenarse en ubicaciones específicas dentro del TSS como se especifica en 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 el GDT (un descriptor TSS puede no residir en el LDT ). Por lo tanto, para usar un TSS, el kernel del sistema operativo debe hacer lo siguiente:
- Cree una entrada de descriptor TSS en el GDT
- Cargue el TR con el selector de segmento para ese segmento
- Agregue información al TSS en la memoria según sea necesario
Por motivos de seguridad, el TSS debe colocarse en una memoria que sea accesible solo para el kernel .
Registro de tareas
El registro TR es un registro de 16 bits que contiene un selector de segmento para el TSS. Puede cargarse mediante la instrucción LTR . LTR es una instrucción privilegiada y actúa de manera similar a otras cargas de registro de segmento. El registro de tareas tiene dos partes: una parte visible y accesible por el programador y una invisible que se carga automáticamente desde el descriptor TSS.
Estados de registro
El TSS puede contener valores guardados de todos los registros x86 . Se utiliza para cambiar de tarea . El sistema operativo puede cargar el TSS con los valores de los registros que necesita la nueva tarea y después de ejecutar un cambio de tarea de hardware (como con una instrucción IRET ), la CPU x86 cargará los valores guardados del TSS en los registros apropiados. Tenga en cuenta que algunos sistemas operativos modernos como Windows y Linux [1] no utilizan estos campos en el TSS ya que implementan la conmutación de tareas de software.
Tenga en cuenta que durante un cambio de tarea de hardware, ciertos campos del antiguo TSS se actualizan con el contenido del registro actual de la CPU antes de que se lean los valores del nuevo TSS. Por lo tanto, algunos campos de TSS son de lectura / escritura, mientras que otros son de solo lectura:
- Campos de lectura / escritura : leídos y escritos 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
Link
campo en el nuevo TSS, si el cambio de tarea se debió aCALL
o enINT
lugar de aJMP
.
- Todos los registros de propósito general (
- Campos de solo lectura: lea solo cuando sea necesario, como se indica.
- Registro de control 3 (
CR3
), también conocido como Registro base del directorio de páginas (PDBR
).- Leer durante un cambio de tarea de hardware.
- El registro de la tabla de descriptores locales (
LDTR
);- Leer durante un cambio de tarea de hardware.
- Los pares de pila de tres nivel de privilegio (
SS0:ESP0
,SS1:ESP1
,SS2:ESP2
);- Leer durante un nivel intermedio
CALL
oINT
para establecer una nueva pila.
- Leer durante un nivel intermedio
- El puntero del mapa de
IOPB
bits del puerto de E / S ( ) y el mapa de bits del puerto de E / S en sí;- Leer durante una
IN
,OUT
,INS
oOUTS
instrucción siCPL > IOPL
para confirmar la instrucción es legal (ver permisos de puertos de E / S a continuación).
- Leer durante una
- Registro de control 3 (
De PDBR
hecho, el campo es el primero que se lee en el nuevo TSS: dado que un conmutador de tareas 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 del puerto de E / S
El TSS contiene un puntero de 16 bits al mapa de bits de permisos del puerto de E / S para la tarea actual . Este mapa de bits, generalmente configurado por el sistema operativo cuando se inicia 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 al puerto; si el programa tiene permiso para acceder a un puerto, se almacena un "0" en el índice de bits correspondiente, y si el programa no tiene permiso, se almacena un "1" allí. Si el límite de segmento del TSS es menor que el mapa de bits completo, se supone que todos los bits que faltan son "1".
La función funciona de la siguiente manera: cuando un programa emite una instrucción de puerto de E / S x86, como IN o OUT (consulte los listados de instrucciones x86 , y tenga en cuenta que existen versiones de bytes, palabras y dword), el hardware hará una El nivel de privilegio de E / S (IOPL) comprueba 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 lo que especifica el IOPL), el programa no tiene acceso al puerto de E / S para todos puertos. El hardware luego verificará el mapa de bits de permisos de E / S en el TSS para ver si ese programa puede acceder a los puertos específicos en la instrucción IN o OUT. Si (todos los) bits relevantes en el mapa de bits de permisos del puerto de E / S están limpios, el programa puede acceder a los puertos y la instrucción puede ejecutarse. Si (alguno de) los bits relevantes están establecidos, o si (alguno de) los bits superan el límite de segmento del TSS, el programa no tiene acceso y el procesador genera una protección general culpa . Esta característica permite a los sistemas operativos otorgar acceso de puerto selectivo a los programas de usuario.
Punteros de pila de nivel interno
El TSS contiene 6 campos para especificar el nuevo puntero de pila cuando ocurre 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 ocurre una interrupción en modo protegido (32 bits), la CPU x86 buscará en el TSS SS0 y ESP0 y cargará sus valores en SS y ESP respectivamente. Esto permite que el kernel use una pila diferente a la del programa de usuario, y también que esta pila sea única para cada programa de usuario.
Una nueva característica introducida en las extensiones AMD64 se denomina Tabla de pila de interrupciones (IST), que también reside en el TSS y contiene punteros de pila lógicos (segmento + desplazamiento). Si una tabla de descriptores de interrupciones especifica una entrada IST para usar (hay 8), el procesador cargará la nueva pila desde IST en su lugar. Esto permite utilizar pilas en buen estado en caso de errores graves ( por ejemplo, NMI o doble falla ). Anteriormente, la entrada para la excepción o interrupción en el IDT apuntaba a una puerta de tareas, lo que provocaba que el procesador cambiara a la tarea indicada por la puerta de tareas. Los valores de registro originales se guardaron en la corriente TSS en el momento en que ocurrió la interrupción o excepción. Luego, el procesador configuró los registros, incluido SS: ESP, a un valor conocido especificado en el TSS y guardó el selector en el TSS anterior. El problema aquí es que el cambio de tareas de hardware no es compatible con AMD64.
Enlace TSS anterior
Se trata de un selector de 16 bits que permite vincular este TSS con el anterior. Esto solo se utiliza para la conmutación de tareas de hardware. Consulte los manuales del IA-32 para obtener más detalles.
Uso de TSS en Linux
Aunque se puede crear un TSS para cada tarea que se ejecuta en la computadora, el kernel de Linux solo crea un TSS para cada CPU y lo usa para todas las tareas. Se seleccionó este enfoque porque proporciona una portabilidad más fácil a otras arquitecturas (por ejemplo, la arquitectura AMD64 no admite conmutadores de tareas de hardware) y mejora el rendimiento y la flexibilidad. Linux solo utiliza el mapa de bits de permisos del puerto de E / S y las funciones de pila interna del TSS; las otras funciones solo son necesarias para los conmutadores de tareas de hardware, que no utiliza el kernel de Linux. [2]
El vector de excepción x86 10 se denomina excepción TSS no válida (#TS). Lo emite el procesador cada vez que algo sale mal con el acceso al TSS. Por ejemplo, si ocurre una interrupción en CPL = 3 y está transfiriendo el control a CPL = 0, el TSS se usa para extraer SS0 y ESP0 / RSP0 para el conmutador de pila. Si el registro de tareas contiene un selector de TSS defectuoso, se generará una falla #TS. La excepción de TSS no válido nunca debería ocurrir durante el funcionamiento normal del sistema operativo y siempre está relacionada con errores del kernel o fallas de hardware.
Para obtener más detalles sobre las excepciones de TSS, consulte el Volumen 3a, 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 todavía se puede usar en una máquina que se ejecuta en los modos extendidos de 64 bits. En estos modos, el TSS sigue siendo útil ya que almacena:
- Las direcciones de puntero de pila para cada nivel de privilegio.
- Direcciones de puntero para la tabla de pila de interrupciones (la sección de puntero de pila de nivel interno anterior, analiza la necesidad de esto).
- Dirección de desplazamiento del mapa de bits de permisos de E / S.
Además, el registro de tareas se expande en estos modos para poder contener una dirección base de 64 bits.
Referencias
- ^ Bovet, Daniel Pierre; Cesatí, Marco (2006). Comprensión del kernel de Linux, tercera edición . O'Reilly Media . pag. 104. ISBN 978-0-596-00565-8. Consultado el 23 de noviembre de 2009 .
- ^ Daniel P. Bovet; Marco Cesati (2006). Comprensión del kernel de Linux . books.google.com . O'Reilly. pag. 104. ISBN 9780596554910. Consultado el 25 de febrero de 2014 .
- ^ "Manual del desarrollador de software de arquitecturas Intel 64 e IA-32 Volumen 3a" . Consultado el 21 de mayo de 2012 .
enlaces externos
- Programa de demostración usando TSSes