Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduccin y Tabla de Pr
JuanCarlos PerezCortes
Table of Contents
Tema 8. Gestin de procesos..............................................................................................................................1
8.1 Introduccin.......................................................................................................................................1
8.2 Cambiado el contexto de memoria....................................................................................................2
8.3 Cambiando la pila y el puntero de instruccin...................................................................................2
8.4 El resto del cambio de contexto.........................................................................................................4
8.5 Resgistros de coma flotante y MMX.................................................................................................4
8.1 Introduccin
El algoritmo de planificacin es el encargado de elegir, en un momento dado, el proceso ms
prioritario del sistema, de entre los que estn preparados para ejecucin.
Una vez se ha elegido el siguiente proceso que debe ejecutarse en la CPU, hay que ponerlo en
ejecucin, sustituyendo al proceso actual. Este proceso se denomina cambio de contexto.
El cambio de contexto se lleva a cabo, una vez se ha elegido el siguiente proceso a ejecutar, en tres
partes:
Al final de la funcin schedule()[kernel/sched.c#L664] se realizan los cambios relacionados
con la memoria.
En la macro switch_to()[include/asmi386/system.h#L16] se cambia el puntero de pila del
proceso (%esp) y el puntero de instruccin (%eip).
En la funcin __switch_to()[arch/i386/kernel/process.c#L679] se realizan el resto de los
cambios.
Primero se salvan algunos registros del procesador en la pila (%esi, %edi y %ebp) que se
recuperar al final de la macro. [#179] y [#268]
Posteriormente se intercambian los punteros de pila del proceso antiguo y el nuevo proceso,
utilizando para ello la estructura thread de cada proceso. [#201] Este es uno de los puntos clave del
cambio de contexto, ya que aqu es donde la pila de prev, asociada a su entrada en la tabla de
procesos, deja de ser la pila del procesador, pasando a ocupar este papel la pila de next. De esta
forma, cuando se vuelva a cdigo de usuario, se restaurarn los registros que guard SAVE_ALL en
la pila cuando next salt a cdigo de ncleo.
Se establece la etiqueta 1 como direccin de retorno para el proceso que va a abandonar la CPU. [#22]
...
Se almacena la direccin de retorno del nuevo proceso en la pila para que se cargue en el registro
%eip con la instruccin ret al final de la funcin __switch_to(). [#23]
Se salta a la funcin __switch_to() para que lleve a cabo el resto del cambio de contexto.
Notese que al invocarse mediante una instruccin de salto no se almacenar la direccin de retorno
en la pila y, por lo tanto, se utilizar la almacenada en la lnea 22. [#24]
El resto de los parmetros de la directiva asm se utilizan para forzar al compilador a colocar los parmetros
de la macro switch_to en algunos registros especficos, utilizados por la funcin __switch_to().
prev en el registro %eax, next en el %edx. Adems se asegura que el valor que haba en prev se
almacena en el registro %ebx y posteriormente en el parmetro last.
Necesitamos el valor de prev despus del cambio de contexto, pero al haber cambiado la pila del
ncleo, el valor de prev no coincidira con el valor real, sino con el que fue prev cuando
next adquirio la CPU por ltima vez.
Para solventar este problema se fuerza al compilador a que el valor que hay en prev este en last al
final de la macro switch_to, es decir, se pasa el valor de prev almacenado en la pila del proceso
8.2 Cambiado el contexto de memoria
Salva los registros %fs y %gs en la estructura thread asociada al proceso anterior. [#6967]
Carga los registros %fs y %gs con los valores de la estructura thread asociada al proceso
siguiente. [#7023]
Si hay informacin til en los registros de depuracin del siguiente proceso, estos se cargan en los
registros del procesador. [#70816]
Si alguno de los dos procesos tena acceso directo a los puesrtos de entrada/salida [#718], entonces:
Si el proceso siguiente tiene un mapa vlido de E/S, ste se copia en la TSS (io_bitmap) y
se hace que el desplazamiento bitmap apunte al campo io_bitmap. [#71930]
Si el proceso siguiente no tiene un mapa vlido de E/S, se hace que el campo
bitmap apunte a una posicin invlida, de forma que se lance una excepcin si se intenta
acceder a un puerto de E/S. Cualquier llamada posterior a sys_ioperm() pondr el campo
bitmap a un valor adecuado. [#738]
Recordemos que esta funcin se invoc mediante una instruccin de salto y que, por lo tanto, la direccin de
retorno que hay en la pila corresponde con el puntero de instruccin %eip del siguiente proceso.