5
  ESO. Tema 5. Gestión de interrupciones hardware Juan Carlos Perez, Sergio Saez

05-2-interrupciones

Embed Size (px)

DESCRIPTION

tema asignatura eso

Citation preview

  • ESO. Tema 5. Gestin de interrupciones hardwareJuan Carlos Perez, Sergio Saez

  • Table of ContentsTema 5. Gestin de interrupciones hardware..................................................................................................1

    5.1 Introduccin.......................................................................................................................................15.2 El manejador de la interrupcin de reloj............................................................................................15.3 El manejador de reloj: timer_interrupt y do_timer............................................................................25.4 Actualizando los tiempos de un proceso............................................................................................25.5 La segunda mitad del manejador de reloj..........................................................................................2

    ESO. Tema 5. Gestin de interrupciones hardware

    i

  • Tema 5. Gestin de interrupciones hardwareEl manejador de la interrupcin de reloj

    Juan Carlos Prez y Sergio Sez

    Juan Carlos Prez (Ingls)Sergio Sez

    [email protected]@disca.upv.es

    5.1 IntroduccinNormalmente los manejadores de interrupcin se organizan en dos partes:

    Urgente: Se debe ejecutar cada vez que llega una interrupcin del tipo correspondiente. En esta partese suelen ejecutar las acciones que no pueden esperar, como la interaccin con el dispositivo fsico,etc.

    Menos urgente: Se debe ejecutar despus de que llegue una interrupcin del tipo correspondiente,pero las acciones a realizar no son demasiado urgentes. Por esta causa, se intenta que su ejecucin nointerfiera con la de otros manejadores de interrupciones. Normalmente, esta parte se ejecuta despusde que se hayan atendido todas las interrupciones hardware pendientes.

    5.2 El manejador de la interrupcin de relojDurante el proceso de arranque, desde la rutina start_kernel [init/main.c#L545] se llama a dosfunciones relacionadas con la interrupcin de reloj: la funcin init_IRQ() [arch/i386/kernel/i8259.c#L443][#560]

    y la funcin time_init() [arch/i386/kernel/time.c#L637]. [#563]

    La funcin init_IRQ() [arch/i386/kernel/i8259.c#L443] inicializa todos los vectores de interrupcin de lasinterrupciones externas (perifricos) y programa el circuito de reloj para que interrumpa 100 veces porsegundo (cada 10 ms) [#4928].

    La funcin time_init() [arch/i386/kernel/time.c#L637] inicializa la variable xtime con el contenido delreloj de la CMOS [#6412] e instala el manejador de la interrupcin de reloj como la primerainterrupcin externa [#714]. El circuito temporizador est conectado a la primera lnea de interrupcindel PIC 8259 maestro.

    La estructura irqaction de este manejador est declarada estticamente como la variable irq0[arch/i386/kernel/time.c#L557]

    . Como ya se ha visto, esta estructura indica que la funcin manejadora estimer_interrupt [arch/i386/kernel/time.c#L463], y que el manejador de interrupcin se ejecutar con lasinterrupciones deshabilitadas (El bit SA_INTERRUPT est activo en el campo flags del manejador.).

    Tema 5. Gestin de interrupciones hardware 1

  • 5.3 El manejador de reloj: timer_interrupt y do_timerLa funcin timer_interrupt simplemente pone un cerrojo sobre la variable xtime e invoca a lafuncin do_timer_interrupt [arch/i386/kernel/time.c#L389], que mantiene actualizado el reloj detiempo real del sistema e invoca a la funcin do_timer [kernel/timer.c#L674].

    En la funcin do_timer [kernel/timer.c#L674] se llevan a cabo las acciones independientes de laarquitectura.

    Se actualizan los ticks que se han producido desde el arranque del sistema. [#676] Se actualizan los tiempos del proceso actual. [#680] Se activa la bottomhalf del manejador de reloj. [#682] Si hay tareas pendientes en la cola de tareas del temporizador, se activa la bottomhalf quelas debe ejecutar. [#6834]

    5.4 Actualizando los tiempos de un procesoEn cada tick del reloj del sistema (cada 10 ms) hay que actualizar el quantum restante del proceso enejecucin y calcular el tiempo utilizado por dicho proceso. La funcin update_process_times()[kernel/timer.c#L575]

    lleva a cabo estas actualizaciones.

    Al entrar en la funcin, el parmetro user_tick valdr 1 si el proceso en ejecucin estaba en modousuario y 0 si estaba en modo ncleo, y por lo tanto, system valdr lo contrario (0 y 1respectivamente). [#579,582]

    La funcin update_one_process() [kernel/timer.c#L565] actualiza las estadisticas del proceso actual. Si el proceso actual no es init_task [#585], le decrementa uno a su quantum y si es cero o negativo,lo pone a cero e indica que se debe invocar al planificador, ya que su quantum ha expirado. [#5869]

    Finalmente, actualiza las estadsticas de esta CPU.

    La funcin update_one_process() [kernel/timer.c#L565] actualiza los tiempos relativos al proceso.

    Esta funcin recibe como parmetro el proceso, y los ticks que han transcurrido en modo usuario,user, y en modo ncleo, system y la CPU en la que se est ejecutando.

    Actualiza las estadsticas de este proceso para la CPU en la que se est ejecutando. [#56970] La funcin do_process_times() [kernel/timer.c#L521] comprueba si el proceso ha excedido loslmites de tiempo de CPU que tena establecidos. Se le enviar una seal SIGXCPU por cada segundoque se exceda del lmite actual y la seal SIGKILL si supera el mximo establecido. [#571]

    Comprueba si han vencido los posibles temporizadores del proceso, invocando a las funcionesdo_it_virt() [kernel/timer.c#L538] y do_it_prof() [kernel/timer.c#L552], envindole las sealescorrespondientes. [#5723]

    5.5 La segunda mitad del manejador de relojLa funcin timer_bh [kernel/timer.c#L669] representa la bottomhalf del manejador de la interrupcinde reloj.

    ESO. Tema 5. Gestin de interrupciones hardware

    5.3 El manejador de reloj: timer_interrupt y do_timer 2

  • Esta bottomhalf se activa en la funcin do_timer [kernel/timer.c#L674] [#682] y queda pendiente deejecucin hasta que se hayan ejecutado todos los manejadores de interrupcin pendientes. Esto se veren el tema "6. Servicios Internos".

    Esta funcin invoca a otras dos funciones:La funcin update_times() [kernel/timer.c#L648] actualiza la hora actual (xtime) y extraeestadsticas sobre la carga del sistema.

    La funcin run_timer_list() [kernel/timer.c#L288] controla si ha expirado alguno de lostemporizadores. No vamos a analizar este cdigo.

    La funcin update_times() [kernel/timer.c#L648] actualiza la hora actual teniendo encuenta cuantos ticks hanpasado desde la ltima vez que se invoco a esta funcin (normalmente slo un tick.)

    Primero pone un cerrojo sobre la variable xtime[#657], ya que va a modificar su valor. Este cerrojo selibera en [#664].

    Calcula la diferencia entre los ticks contabilizados (wall_jiffies) y los ticks que se hanproducido (jiffies). Normalmente la diferencia ser uno. [#659]

    Si la diferencia no es cero, actualiza los ticks contabilizados (wall_jiffies) e invoca a la funcinupdate_wall_time() [kernel/timer.c#L500], que invocar a la funcinupdate_wall_time_one_tick() [kernel/timer.c#L462] para actualizar la variable xtime con losvalores adecuados al avanzar un tick.

    Finalmente, invoca a la funcin calc_load() [kernel/timer.c#L625], que actualiza las estadsticas sobrela carga del sistema.

    ESO. Tema 5. Gestin de interrupciones hardware

    5.3 El manejador de reloj: timer_interrupt y do_timer 3

    Table of ContentsTema 5. Gestin de interrupciones hardware5.1 Introduccin5.2 El manejador de la interrupcin de reloj5.3 El manejador de reloj: timer_interrupt y do_timer5.4 Actualizando los tiempos de un proceso5.5 La segunda mitad del manejador de reloj