Você está na página 1de 10

Ampliacin de Sistemas Operativos

Tema 7: Cambio de Contexto

Introduccin
El cambio de contexto tiene lugar una vez que el planificador ha decidido a qu tarea realizarlo
La conmutacin se lleva a cabo en la macro switch_to El descriptor de la tarea saliente estar apuntado por prev y el de la tarea entrante por next

Recordemos la arquitectura de Linux en cuanto al ncleo y los procesos


En Linux, acceder al ncleo no supone un cambio de contexto Las tareas comparten el espacio de direcciones del ncleo El cambio de contexto se hace bajo demanda, conmutando la parte de usuario
(c) 2004 J. Ignacio Garca Tejedor Cambio de Contexto - 2

Asistencia Hardware
La CPU puede tener cierta asistencia HW al cambio de contexto
Lgicamente, dependiente de la arquitectura En el i386 tenamos los Task Gates. Un salto a un Task Gate supona realizar un cambio de contexto basado en el TSS apuntado por el descriptor Pero no es obligatorio hacer uso de estos mecanismos

Linux anteriormente empleaba la asistencia HW, pero Linux 2.2 realiza el cambio de contexto ntegramente mediante SW
Mejor control de los datos que se cargan en el cambio Mayor flexibilidad y permite mayores optimizaciones El tiempo empleado es similar a la conmutacin HW
(c) 2004 J. Ignacio Garca Tejedor Cambio de Contexto - 3

Anlisis (I)
Podemos dividir un cambio de contexto de un proceso en dos partes
Cambio de contexto hardware: Implica cambiar

Segmento de tarea (TSS): Registro TR Tabla de descriptores local (LDT): Registro LDTR Directorio Global de Pginas: Registro CR3 Registros de propsito general de cada proceso
Recordar que esto incluye SS:ESP, con lo que conmutar de registros implica tambin conmutar de pilas

Cambio de contexto software

El descriptor de proceso actual (current) debe cambiar a next


Cambio de Contexto - 4

(c) 2004 J. Ignacio Garca Tejedor

Anlisis (II)
El cambio de contexto HW es el que realiza la CPU de forma automtica si empleamos sus facilidades
Se realiza el salto a un Task Gate, que apunta a un TSS Se guardan los registros en el TSS y se cargan los del nuevo TSS Se carga LDTR y CR3 contenidos en el TSS Se carga TR con el contenido del descriptor del Task Gate

Sin embargo, aunque no usemos los mecanismos HW es necesario tener un segmento con el formato del TSS y cargar TR adecuadamente. Por qu, si no vamos a usar los campos LDTR y CR3, que podemos almacenar y cargar a mano?
Porque los punteros a pila de los diferentes niveles son usados por la CPU al saltar de uno a otro nivel Porque la CPU usa el mapa de bits de E/S residente en la TSS para determinar los permisos de uso de los puertos de E/S
(c) 2004 J. Ignacio Garca Tejedor Cambio de Contexto - 5

Anlisis (III)
En lugar de realizar un salto a un Task Gate, el descriptor de proceso almacena TR; el ndice de la GDT donde se encuentra el descriptor de la TSS del proceso (que tambin est almacenado en el descriptor del proceso)
Este descriptor (TSSD) es creado y guardado por el kernel cuando se crea el proceso

Es necesario recordar que cuando se realiza el cambio de contexto estamos en modo kernel, por lo que se puede cambiar LDTR y CR3 sin problemas
(c) 2004 J. Ignacio Garca Tejedor Cambio de Contexto - 6

Implementacin (I)
En el descriptor del proceso tenemos un campo con el Linux TSS del proceso
El TSS de Linux coincide en sus 104 primeros bytes con el del i386, aadindole algunos campos

TR y CR2 Registros de depuracin Registros del coprocesador matemtico

Linux almacena parte del contexto del proceso en el TSS y parte en la pila del kernel
En lugar de usar el TSS para almacenar los registros se usa la pila de modo kernel En definitiva, todo queda almacenado en el descriptor del proceso
(c) 2004 J. Ignacio Garca Tejedor Cambio de Contexto - 7

Implementacin (II)
La macro switch_to realiza el cambio de contexto
Guarda registros en la pila del ncleo de prev para realizar el cambio de contexto Carga el ESP de next

Este paso realiza el cambio del proceso current, puesto que el resultado de la macro depende de ESP Salva los registros de la FPU si es necesario Carga TR Carga LDTR y CR3 si es necesario Restaura los segmentos FS y GS Restaura los registros de debug si es necesario

Llama a la funcin __switch_to()


Los registros de usuario no hace falta salvarlos puesto que se salvaron al entrar en modo ncleo con SAVE_ALL
(c) 2004 J. Ignacio Garca Tejedor Cambio de Contexto - 8

Implementacin (III)
Para los registros de la FPU se da un tratamiento especial
No todos los procesos los usan, por lo que sera un gasto intil guardarlos y restaurarlos siempre Para evitarlo existe el bit TS en el registro CR0

Cada vez que se realiza cambio de contexto, se pone a 1 Cada vez que un proceso intenta usar la FPU, si TS est a 1 se genera una excepcin. En el manejador se restauran los registros de la FPU y se pone TS a 0 para que sucesivas instrucciones de FPU no generen excepcin No se restauran los registros hasta que se necesitan Si un proceso no usa la FPU, no se salvan ni restauran los registros

De esta forma

El bit PF_USEDFPU de los flags del proceso indica si se ha usado la FPU


(c) 2004 J. Ignacio Garca Tejedor Cambio de Contexto - 9

Linux 2.4
Se elimina la necesidad de una TSS para cada proceso.
En su lugar hay un puntero a una estructura de datos que almacena la informacin que sola estar en la TSS; contenidos de registros y el mapa de E/S. Cuando ocurre un cambio de contexto el kernel cambia el mapa por el adecuado para cada proceso Slo hay un TSSD y el campo TR de todos los procesos es igual por lo que no hay que recargarlo

(c) 2004 J. Ignacio Garca Tejedor

Cambio de Contexto - 10

Você também pode gostar