martes, 23 de diciembre de 2008

Administración de tareas

Lo primero; las facilidades de administración de tareas de la arquitectura IA-32 sólo están disponibles cuando el procesador está en modo protegido.
Una tarea es una unidad de trabajo que un procesador puede enviar, ejecutar, o suspender. Puede ser usada para ejecutar un programa, una tarea o proceso, un utilidad de servicio del sistema operativo, un administrador de interrupciones o de excepciones, o una utilidad ejecutable o del núcleo. La IA-32 proporciona mecanismos para guardar el estado de la tarea, para enviar tareas a ejecución, y para cambiar de una tarea a otra. Cuando se opera en modo protegido, todas las ejecuciones del procesador ocurren desde una tarea. Cada sistema simple debe definir como mínimo una tarea, pero los sistemas más complejos pueden usar las facilidades de administración de tareas del procesador para soportar aplicaciones multitarea.
Una tarea se compone de dos partes: un espacio de ejecución y un segmento de estado de tarea (TSS). El espacio de ejecución de tareas consiste en un segmento de código, un segmento de pila, y uno o más segmentos de datos. Si un sistema operativo o un programa usa el mecanismo de protección de niveles de privilegios del procesador, el espacio de ejecución de tareas proporciona también una pila aparte para cada nivel de privilegios. El TSS especifica el segmento que compone al espacio de ejecución de la tarea y proporciona un lugar de almacenamiento para la información de estado de la tarea. En sistemas multitarea, la TSS proporciona también un mecanismo para linkar las tareas. Una tarea se define por el selector de segmento para su TSS. Cuando se carga la tarea en el procesador para su ejecución, el selector de segmento, la base de direcciones, el límite, y los atributos del descriptor de segmento del TSS se cargan en el registro de tarea (TR). Si está activada la paginación para la tarea, la dirección base del directorio de páginas usado por la tarea se carga en el registro de control CR3.
El software del procesador puede invocar una tarea para ejecutarla de 5 formas:
+ Haciendo una llamada explícita a una tarea con una instrucción CALL.
+ Haciendo un salto explícito a una tarea con una instrucción JMP.
+ Haciendo una llamada implícita (por el procesador) a una tarea de administración de interrupciones.
+ Haciendo una llamada implícita a una tarea de administración de excepciones.
+ Haciendo un retorno (iniciada con una instrucción IRET) cuando la bandera NT del registro EFLAGS se activa.
En la arquitectura IA-32, las tareas no son recursivas; una tarea no se puede llamar a sí misma.
El procesador define cinco estructuras de datos para las actividades de administración relacionadas con las tareas:
- Segmento de estado de tarea (TSS): La información de estado del procesador necesita restaurar una tarea guardada en un segmento del sistema (TSS). Los campos del TSS están divididos en campos dinámicos y campos estáticos.
- Descriptor de puerta de tarea: Proporciona una referencia indirecta y protegida a una tarea. Se puede guardar en la GDT, en una LDT o en la IDT. El campo de selector de segmento de TSS en un descriptor de puertas de tarea apunta a un descriptor TSS en el GDT. El RPL en ese segmento no se usa.
- Descriptor de TSS: Sólo se puede guardar en el GDT (no se puede guardar en el LDT ni en el IDT). Cualquier programa o procedimiento con acceso al descriptor TSS puede ejecutar la tarea con un CALL o con un JMP. En el modo de 64 bits el cambio de tarea no está soportado, pero los descriptores TSS siguen existiendo (expandidos a 16 bytes).
- Registro de tarea: Contiene el selector de segmento de 16 bits y el descriptor de segmento completo para el TSS de la tarea en ejecución. Esta información se copia desde el descriptor TSS en el GDT a la tarea en ejecución. El registro de tarea tiene una parte 'visible' (se puede leer y cambiar por software) y una parte 'invisible' (mantenida por el procesador e inaccesible por software, hace operaciones que aumentan la eficiencia).
- Bandera NT en el registro EFLAGS.
Cuando se opera en modo protegido, el TSS y el descriptor TSS tiene que crearse antes que la tarea, y el selector de segmento para el TSS se tiene que cargar en el registro de tareas usando la instrucción LTR.
El procesador transfiere ejecuciones a otras tareas en uno de cuatro casos:
+ Cuando el programa en ejecución, tarea, o procedimiento ejecuta un JMP o un CALL a un descriptor TSS en el GDT.
+ Cuando el programa en ejecución, tarea, o procedimiento ejecuta un JMP o un CALL a un descriptor de puerta de tarea en el GDT o en la LDT actual.
+ Un vector de interrupción o de excepción apunta a un descriptor de puertas de tareas en el IDT.
+ La tarea actual ejecuta un IRET cuando la bandera NT en el registro EFLAGS se activa.
El campo previo de linkar tareas del TSS y la bandera NT del EFLAGS se usan para retornar la ejecución a la tarea anterior. EFLAGS.NT=1 indica que la tarea en ejecución está anidada en otra tarea. Cuando un CALL, una interrupción, o una excepción causa un cambio de tarea, el procesador copia el selector de segmento del TSS actual al campo previo de linkar tareas del TSS para la nueva tarea (entonces pone EFLAGS.NT=1). Si el software usa una instrucción IRET para suspender la nueva tarea, el procesador comprueba que EFLAGS.NT=1; entonces usa el valor del campo previo de linkar tareas para volver a la tarea previa. Cuando se usa JMP para un cambio de tarea, la nueva tarea no está anidada. Es recomendable usar JMP cuando no se requiere anidamiento.
El espacio de direcciones para una tarea consiste en los segmentos a los que la tarea puede acceder. Incluye código, datos, pilas, y segmentos del sistema referenciados en el TSS y cualquier otro segmento accesible por el código de la tarea. Los segmentos se mapean en el espacio de direcciones lineales del procesador. El campo de segmentos LDT en el TSS se puede usar para a las tareas su propio LDT. Esto permite aislarla de otras tareas guardando los descriptores de segmento para todos los segmentos asociados a la tarea, en el LDT de la tarea. Aunque también es posible que múltiples tareas utilicen la misma LDT. Esto aumenta la eficiencia de la memoria cuando se permite especificar tareas para comunicarse o controlar a otras tareas, sin romper las barreras de protección del sistema. Las tareas se pueden mapear al espacio de direcciones lineales y al espacio de direcciones físicas en una de las dos maneras:
- Compartiendo entre todas las tareas un espacio de mapeo de direcciones lineales a físicas.
- Cada tarea tiene su propio espacio de direcciones lineales que está mapeado al espacio de direcciones físicas.
Para permitir la compartición de datos entre tareas, se usan las siguientes técnicas para crear un espacio mapeado de direcciones lógicas a físicas compartido por los segmentos de datos:
+ A través de los descriptores de segmentos en la GDT.
+ A través de los LDT compartidos.
+ A través de descriptores de segmentos en distintas LDTs que están mapeadas a direcciones comunes en el espacio de direcciones lineales.
En el modo de 64 bits, la estructura de las tareas y el estado de las tareas es similar a lo anterior en modo protegido. Sin embargo, el mecanismo de cambio de tarea disponible en modo protegido no está soportado en el modo de 64 bits. La administración de tareas y de sus cambios se tiene que controlar por software.

No hay comentarios: