Vous êtes sur la page 1sur 4

Estudio de un S.O. Servicios Internos. Bottomhalves.

JuanCarlos PerezCortes

Estudio de un S.O. Servicios Internos. Bottomhalves.

Table of Contents
Tema 6. Servicios internos.................................................................................................................................1
6.1 Introduccin.......................................................................................................................................1
6.2 Estructuras de datos...........................................................................................................................1
6.3 Instalacin y desinstalacin de bottomhalves..................................................................................1
6.4 Marcando una bottomhalf para su ejecucin...................................................................................2
6.5 Ejecutando las bottomhalves...........................................................................................................2

Tema 6. Servicios internos


Bottomhalves
Juan Carlos Prez y Sergio Sez
Juan Carlos Prez jcperez@disca.upv.es
Sergio Sez ssaez@disca.upv.es

6.1 Introduccin
Como ya se ha visto, el mecanismo preferido para ejecutar funciones de forma diferida son las
tasklets.
Aun as, por compatibilidad con el cdigo existente, tambin se da soporte a las bottomhalves, que
son el antiguo mecanismo que haba hasta Linux 2.2.X.
Las bottomhalves son parecidas a las softirqs, salvo que slo se puede ejecutar una bottomhalf en
el sistema cada vez.
El nmero de bottomhalves existentes en el sistema tambin est limitado a 32.
Las bottomhalves se implementan mediante tasklets predefinidas y se asegura que no se ejecuta ms
de una en el sistema mediante un cerrojo global: global_bh_lock.

6.2 Estructuras de datos


Las estructuras de datos que utilizan las bottomhalves son las siguientes:
bh_base[32][kernel/softirq.c#L273]: es un vector que contiene los 32 punteros a las funciones que
representan a las posibles bottomhalves.
bh_task_vec[32][kernel/softirq.c#L273]: es un vector que contiene las 32 tasklets que representan a
las correspondientes bottomhalves.
global_bh_lock[kernel/softirq.c#L278]: es un cerrojo global que se utiliza para mantener la exclusin
mutua mientras se ejecutan las bottomhalves.
Existen adems unas bottomhalves predefinidas[include/linux/interrupt.h#L24]. En relalidad, lo que
est predefinido es la entrada que ocupan en el vector bh_base[]. Las bottomhalves de mayor
interes son TIMER_BH (0), TQUEUE_BH (1) y IMMEDIATE_BH (9).

6.3 Instalacin y desinstalacin de bottomhalves


Las funciones que instalan y desinstalan una bottomhalf son init_bh[kernel/softirq.c#L312] y
remove_bh[kernel/softirq.c#L318]
init_bh[kernel/softirq.c#L312]: Simplemente copia el puntero a la funcin que se debe invocar en la
Tema 6. Servicios internos

Estudio de un S.O. Servicios Internos. Bottomhalves.


entrada indicada (nr) del vector bh_base. Despus ejecuta una funcin de barrera antes de volver
para asegurarse que la actualizacin se ha escrito realmente en memoria.
remove_bh[kernel/softirq.c#L318]: Pone a NULL la entrada indicada (nr) del vector bh_base. Antes se
asegura de que la tasklet equivalente no est planificada en ninguna cola para su ejecucin. Para ello
utiliza la funcin tasklet_kill()[kernel/softirq.c#L255].
La instalacin de las tasklets que van a representar a las bottomhalves se realiza en la funcin
softirq_init()[kernel/softirq.c#L324]. La funcin que se instala en todas las tasklets es
bh_action()[kernel/softirq.c#L288] y el nmero de la entrada como parmetro.

6.4 Marcando una bottomhalf para su ejecucin


Para marcar una bottomhalf como pendiente para ejecucin se utiliza la funcin
mark_bh()[include/linux/interrupt.h#L227].
Est funcin lo nico que realiza es la planificacin de la tasklet equivalente, almacenada en el vector
bh_task_vec[nr], en la cola de tasklets prioritarias (HI_SOFTIRQ).
Ntese que, a diferencia de las tasklets y de forma similar a las softirqs, las funciones que se deben ejecutar
no se indican cuando se planifica una bottomhalf para su ejecucin, sino cuando se instala la bottomhalf.
As pues, la funcin a ejecutar, aunque puede cambiar, suele ser fija.
Las funciones que se ejecutan con las bottomhalves TIMER_BH (0), TQUEUE_BH (1) y
IMMEDIATE_BH (9) se instalan en la funcin sched_init()[kernel/sched.c#L1319][#13357].

6.5 Ejecutando las bottomhalves


La ejecucin de las bottomhalves corre a cargo de la funcin bh_action()[kernel/softirq.c#L288]. Los pasos
que sigue son:
Obtiene el identificador de la CPU en la que se est ejecutando. [#291]
Intenta obtener el cerrojo global global_bh_lock, para asegurar la exclusin mutua entre todas
las bottomhalves. Si no lo consigue salta a la lnea 308 marcando nuevamente la bottomhalf para
su ejecucin. [#2934]
Comprueba que no se est ejecutando ningn manejador de interrupciones en todo el sistema,
utilizando para ello la funcin hardirq_trylock()[include/asmi386/hardirq.h#L31]. En caso afirmativo
salta a la lnea 306, liberando el cerrojo global_bh_lock y marcando la bottomhalf para su
posterior ejecucin. La realidad es que las funciones hardirq_trylock() y
hardirq_endlock() no adquieren ni liberan ningn cerrojo, incluso en la versin
multiprocesador, aunque su nombre parezca indicar lo contrario.[#2967]
Finalmente, invoca a la funcin almacenada en la entrada nr del vector bh_base[], tras
comprobar que la funcin no es nula, liberando a continuacin el cerrojo global_bh_lock.
[#299304]

6.4 Marcando una bottomhalf para su ejecucin

Vous aimerez peut-être aussi