Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

Gestión de Interrupciones en Sistemas Operativos (página 2)




Enviado por Pablo Turmero



Partes: 1, 2

Monografias.com

17
Gestión de excepciones
Gestión de excepciones en Linux
Los gestores de excepciones tienen una estructura estándar que consiste en tres fases:
Guarda los contenidos de la mayoría de los registros en la pila de kenel
Invoca a la función correspondiente: do_excepcion

Monografias.com

18
Gestión de excepciones
Gestión de excepciones en Linux
Los gestores de excepciones tienen una estructura estándar que consiste en tres fases:
Guarda los contenidos de la mayoría de los registros en la pila de kenel
Invoca a la función correspondiente: do_excepcion
Continúa la ejecución en la siguiente instrucción

Monografias.com

19
Gestión de interrupciones
Gestión de interrupciones en Linux
Consideraciones previas:
Las interrupciones pueden llegar en cualquier instante
Con frecuencia, no están relacionadas con el proceso al cual interrumpen. Ejemplo: Transferencia de datos de disco
Por limitaciones hardware, varios dispositivos pueden compartir la misma línea de interrupciones (IRQ)
El vector de interrupciones no es suficiente
Se asocian varias “rutinas de servicio de interrupciones” a un gestor
Cuando ocurre una interrupción, no todas las acciones tienen la misma urgencia.

Monografias.com

20
Gestión de interrupciones
(Gp:) PIC
(Gp:) IRQn

IDT[32+n]
CPU
Procedimiento de gestión
Guardar el valor de IRQ y el contenido de los registros en la pila de kernel
Enviar el acuse de recibo de la interrupción al PIC, permitiendo que éste atienda nuevas interrupciones
Ejecutar las rutinas de servicio de interrupciones asociadas con todos los dispositivos asociados a la IRQ
Finalizar la gestión
(Gp:) ISR 1
(Gp:) ISR 3
(Gp:) ISR 2

(Gp:) descriptor n
(Gp:) Estructuras involucradas

Monografias.com

21
Procedimientos diferidos
Procedimientos diferidos: Bottom-halves
Un procedimiento diferido es una función de baja prioridad que espera a que el kernel encuentre un momento conveniente para ejecutarse.
Este mecanismo permite al sistema operativo la gestión rápida de las interrupciones de múltiples dispositivos.
Los procedimientos diferidos se ejecutan cuando:
Finaliza la gestión de una llamada al sistema
Finaliza la gestión de una excepción
Finaliza la gestión de una interrupción
Cuando se desplanifica a un proceso
Implementación:
Lista de funciones por bottom-half

(Gp:) ?
?
?
(Gp:) Timer
(Gp:) Red
(Gp:) Teclado

(Gp:) Tim_1
(Gp:) Tim_2
(Gp:) Tim_3

(Gp:) Net_2
(Gp:) Net_1

Monografias.com

22
Finalización de la gestión
Procedimiento:
Bottom
half?
(Gp:) Ejecuta los procedimientos
(Gp:) Sí

No
Gestión de interrupción
o excepción
Interrupciones
anidadas
(Gp:) Si
(Gp:) Recupera contexto hardware

Monografias.com

23
Finalización de la gestión
Procedimiento:
(Gp:) Bottom
half?
(Gp:) Ejecuta los procedimientos
(Gp:) Si
(Gp:) No
(Gp:) Gestión de interrupción
o excepción
(Gp:) Interrupciones
anidadas
(Gp:) Si
(Gp:) Recupera contexto hardware

(Gp:) Si
(Gp:) Planificador schedule()

(Gp:) Planificación
(Gp:) No

(Gp:) Si
(Gp:) Gestor señales do_signal()

(Gp:) señales
(Gp:) No

Monografias.com

Llamadas al sistema
??? read(fd,buf,5)
write(f,buf2,3)
???

Monografias.com

25
Esquema
Llamadas al sistema
Introducción
Visión de las llamadas al sistema desde el espacio de usuario
Implementación a nivel de núcleo de las llamadas al sistema

Monografias.com

26
Introducción
Llamadas al sistema:
Interfaz entre los procesos que se ejecutan en modo usuario y los dispositivos hardware
Objetivos:
Facilita la programación de aplicaciones
Aísla al programador de las características de bajo nivel de los dispositivos
Incrementa la seguridad del sistema
El acceso a las zonas claves se realiza a través de un conjunto bien definido de funciones
Incrementa la portabilidad de las aplicaciones
Las aplicaciones pueden ser compiladas en otros sistemas que ofrezcan la misma interfaz

Monografias.com

27
Visión general de las llamadas
???
pid=fork();
???
modo usuario
modo kernel
(Gp:) open() {
???
}
fork(){
???
}
???
(Gp:) libc

sys_open() {
???
}
sys_ fork(){
???
}
???
(Gp:) Interrupción software

Monografias.com

28
Visión desde el espacio de usuario
La biblioteca libc contiene todas las llamadas
Oculta los detalles de la implementación de la llamada en la arquitectura correspondiente
Se invoca de forma análoga a cualquier función en C
Recogen el código de retorno en la variable errno.
Inicialmente mantenida por Linus Torvalds. Actualmente se utiliza la librería de GNU (glibc)
El código de la biblioteca no se encuentra en espacio de kernel
Dos versiones:
Librería estática: libc.a
Librería dinámica: libc.so
Se puede obtener todos los ficheros que la componen:
# ar t /usr/lib/libc.a

Monografias.com

29
Implementación de la biblioteca
Implementación de la interfaz ofrecida al usuario:
En la arquitectura i386 se utiliza la instrucción int 0x80 como puerta única de entrada al núcleo.
Un proceso en modo usuario no puede acceder al espacio de direcciones del kernel:
En el registro A (eax) se especifica el código de la llamada
Cada llamada tiene un código estático que la representa
En caso de tener que pasar algún parámetro en la llamada, se realiza a través de los registros del procesador
Arg 1 ? Registro ebx
Arg 2 ? Registro ecx
???
Arg 5 ? Registro edi
Si se necesitan más parámetros se interpreta el último como una dirección donde reside el resto de los parámetros

Monografias.com

30
Implementación de la biblioteca
Implementación de la interfaz ofrecida al usuario:
Código de retorno:
En la arquitectura i386 se devuelve el código de retorno en el registro eax
Cuando ocurre un error ? valor negativo
Copia el valor ( entre –1 y – 125 ) a la variable global errno
Devuelve –1 como valor de retorno de la función
La variable errno contiene el código de error de la última llamada al sistema que falló (-eax)
Si no existe error:
Devuelve como código de retorno el valor almacenado en eax

Monografias.com

31
(Gp:) 4. Tratamiento de errores
y código de retorno

(Gp:) 3. Interrupción software:
Entrada al kernel

(Gp:) 2. Código de la llamada en registro eax

(Gp:) 1. Copia de parámetros a los registros

Implementación de la biblioteca
Ejemplo: num=read(fd,buf,count);
# ar x /usr/lib/libc.a read.o
# objdump –d read.o

read.o: file format elf32-i386
Disassembly of section .text:
00000000 :
0: 53 push %ebx
1: 8b 54 24 10 mov 0x10(%esp,1),%edx
5: 8b 4c 24 0c mov 0xc(%esp,1),%ecx
9: 8b 5c 24 08 mov 0x8(%esp,1),%ebx
d: b8 03 00 00 00 mov $0x3,%eax
12: cd 80 int $0x80
14: 5b pop %ebx
15: 3d 01 f0 ff ff cmp $0xfffff001,%eax
1a: 0f 83 fc ff ff ff jae 1c
20: c3 ret

Monografias.com

32
Implementación en el kernel
Situación de entrada al núcleo
main() {
•••
num=read(fd,buf,count);
•••
(Gp:) código A
(Gp:) datos A
(Gp:) marco main()

(Gp:) marco read()

pila usuario
(Gp:) ???
mov 0xc(%esp,1),%ecx
mov 0x8(%esp,1),%ebx
mov $0x3,%eax
int $0x80
pop %ebx
???

(Gp:) system_call:
???
sys_read()
???
ret_from_sys_call:
???
iret

int $0x80
(Gp:) código A
(Gp:) datos A
(Gp:) marco main()
(Gp:) marco read()

(Gp:) Pila
kernel
(Gp:) marco sys_read()

Parámetros de la función (fd, buf, count)
Dirección retorno

Monografias.com

33
Implementación en el kernel
Gestión de la llamada al sistema
La llamada al sistema se produce cuando se ejecuta la instrucción int 0x80 ? Interrupción
Misma interrupción para todas las llamadas al sistema
Permite implementar un número ilimitado de llamadas
Necesita algún mecanismo para diferenciar llamadas
Se accede al vector de interrupciones 128 de la IDT
La función asociada a esta interrupción es system_call:
Guarda los contenidos de los registros en la pila de kernel
Se comprueba si el número de llamada es válido o no está implementada la función asociada
Invoca a la rutina de servicio correspondiente
call *SYMBOL_NAME(sys_call_table)(,%eax,4)
Se finaliza la gestión de la llamada:
ret_from_sys_call
(Gp:) sys_exit()
sys_fork()
sys_read()
sys_write()
sys_open()
???

Monografias.com

34
Implementación en el kernel
Finalización de las llamadas: ret_from_sys_call
Durante la ejecución de la llamada pudieron haber ocurrido distintos eventos
Operaciones de Entrada/Salida
Aparición de otros procesos más prioritarios
Interrupciones de reloj, …
Se comprueba si alguno de estos eventos hace necesario desplanificar al proceso:
Variable need_resched ? planificador
Se comprueba si el proceso ha recibido alguna señal
Atiende la señal
Se copia el código de retorno en el registro eax
Se recupera el contexto de registros salvados en la pila

Monografias.com

Señales en Unix
proceso A
proceso B
kernel

Monografias.com

36
Introducción
Señales en Unix:
Una señal es un mensaje corto que puede ser enviado a un proceso o grupo de procesos
Se utilizan para comunicar eventos del sistema a los procesos
Constituyen un mecanismo primitivo de comunicación entre procesos
No proporciona más información que el tipo de señal
Presentes en los sistemas Unix durante más de 30 años
La interfaz de programación, el comportamiento y la implementación interna varían de una versión de Unix a otra

Monografias.com

37
Introducción
Características de las señales:
Pueden ser enviadas a un proceso en cualquier instante independientemente del estado del proceso receptor
Cuando se envían a procesos que no están ejecutándose, deben ser almacenadas para atenderlas cuando el proceso continúe su ejecución
Sólo se “recuerda” la recepción de una señal
Pueden ser selectivamente bloqueadas por un proceso
El proceso no recibirá la señal hasta que la desbloquee
Cuando un proceso “atiende” una señal, por defecto la bloquea hasta que finalice la gestión de la misma
Evita un “anidamiento” de señales

Monografias.com

38
Fuentes de señales
Las señales se originan por diversas situaciones:
Exepciones

Otros procesos
Llamada al sistema kill
Interrupciones de terminal

(Gp:) a=b/0

excepción
Instrucción ilegal
kernel
señal
SIGINT
Ctrl+C

Monografias.com

39
Fuentes de señales
Las señales se originan por diversas situaciones:
Control de ejecución:

Alarmas

(Gp:) pid=fork();
if(pid>0)
wait (status);
???
(Gp:) Código

(Gp:) pid=fork();
if(pid>0)
wait (status);
else
exit(0);
(Gp:) Código

(Gp:) SIGCLD

padre
(Gp:) hijo

(Gp:) SIGALRM

Monografias.com

40
Estructuras de datos asociadas
Representación de los procesos en Linux
Task_struct
Información de cada proceso:
(Gp:) ycpid
(Gp:) ppid
(Gp:) pid
(Gp:) Identificación del proceso o hilo
Número de identificación (pid)
Relación con otros procesos
Padre, hermanos

(Gp:) ycpid
(Gp:) ppid
(Gp:) pid

(Gp:) need_resched
(Gp:) priority
(Gp:) counter
(Gp:) Parámetros de planificación
prioridad
tiempo ejecutado

(Gp:) need_resched
(Gp:) priority
(Gp:) counter

???
(Gp:) Gestión de señales
Señales
Bloqueadas
Pendientes
Gestión
(Gp:) gestión
(Gp:) pendientes
(Gp:) bloqueadas
(Gp:) señales

(Gp:) gestión
(Gp:) pendientes
(Gp:) bloqueadas
(Gp:) señales

Monografias.com

41
Estructuras de datos asociadas
Estructuras de datos para la gestión de señales

Task_struct
Información de cada proceso:
(Gp:) ycpid
(Gp:) ppid
(Gp:) pid

(Gp:) need_resched
(Gp:) priority
(Gp:) counter

???
(Gp:) gestión
(Gp:) pendientes
(Gp:) bloqueadas
(Gp:) señales

(Gp:) ???
(Gp:) Array de 64 bits (1 por cada señal pendiente)

(Gp:) ???
(Gp:) Array de señales bloqueadas

(Gp:) 0: No hay señales pendientes
(Gp:) 1: Existe alguna señal pendiente

(Gp:) hand_sighup()
(Gp:) hand_sigint()
(Gp:) 0
(Gp:) 1
(Gp:) mifunc()
(Gp:) ?
?
?
(Gp:) Funciones que atienden las señales:
0: Acción por defecto
1: Ignora la señal

Monografias.com

42
Envío de señales
Primera fase de la gestión de señales: Envío
Un proceso recibe una señal porque:
El kernel le notifica un evento (excepción, interrupción)
Otro proceso envía la señal (llamada al sistema kill)
La señal puede ir destinada al proceso que se está ejecutando u a otro proceso (activo o en estado dormido)

Monografias.com

43
Envío de señales
Procedimiento de envío de señales
Objetivo: Comunicarle a un proceso t la ocurrencia de un determinado evento n
Comprobación de parámetros
Número de señal correcta ( 0 < n < 64)
Comprobación de permisos
Si la señal es enviada por un proceso en modo usuario

Un proceso en modo usuario (salvo el superusuario) sólo puede enviar señales a procesos de su propiedad

Monografias.com

44
Envío de señales
Procedimiento de envío de señales
Objetivo: Comunicarle a un proceso t la ocurrencia de un determinado evento n
Comprueba los parámetros
Número de señal correcta ( 0 < n < 64)
Comprueba los permisos
Si la señal es enviada por un proceso en modo usuario
Comprueba si el proceso destino t ignora la señal n

handler
(Gp:) handler = 1
(Gp:) Ignora la señal

Monografias.com

45
Envío de señales
Procedimiento de envío de señales
Objetivo: Comunicarle a un proceso t la ocurrencia de un determinado evento n
Comprueba los parámetros
Número de señal correcta ( 0 < n < 64)
Comprueba los permisos
Si la señal es enviada por un proceso en modo usuario
Comprueba si el proceso destino t ignora la señal n
Activa el bit correspondiente a la señal

Monografias.com

46
Envío de señales
Procedimiento de envío de señales
Objetivo: Comunicarle a un proceso t la ocurrencia de un determinado evento n
Comprueba los parámetros
Número de señal correcta ( 0 < n < 64)
Comprueba los permisos
Si la señal es enviada por un proceso en modo usuario
Comprueba si el proceso destino t ignora la señal n
Activa el bit correspondiente a la señal
Si el proceso está durmiendo en una prioridad interrumpible

(Gp:) Despierta al proceso

Monografias.com

47
Recepción de señales
Instante de recepción
Un proceso necesita estar ejecutándose para comprobar la presencia de señales pendientes
La detección de señales se realiza en ciertos puntos durante la ejecución de un proceso
Cuando finaliza la ejecución de una llamada al sistema
Cuando finaliza la gestión de una interrupción o excepción
Cuando se ejecuta un proceso que estaba en estado “dormido”
Procedimiento de detección:

Monografias.com

48
Tratamiento de las señales
Acciones que se realizan cuando se recibe una señal
Los procesos pueden reaccionar de dos formas cuando detectan que han recibido una señal:
Ejecutar la acción por defecto asociada a la señal
Abortar el proceso (Ej. Señal SIGINT)
Generar un fichero (core) con el estado actual de ejecución del proceso y abortar el proceso (Ej. violación segmento SIGSEGV)
Ignorar la señal
Detener el proceso
Continuar el proceso
Atrapar la señal
La señal se atiende ejecutando una función especificada por el usuario
Las señales KILL y STOP no pueden ser atrapadas

Monografias.com

49
Tratamiento de las señales
Ejecución de la acción por defecto
Detener el proceso
Situación típica utilizada por los depuradores

Monografias.com

50
Tratamiento de las señales
Ejecución de la acción por defecto
Detener el proceso
Situación típica utilizada por los depuradores
Continuar el proceso

Monografias.com

51
Tratamiento de las señales
Ejecución de la acción por defecto
Detener el proceso
Situación típica utilizada por los depuradores
Continuar el proceso
Abortar el proceso
Invoca la función do_exit() para finalizar el proceso
Abortar el proceso y generar fichero core

Monografias.com

52
Tratamiento de las señales
Captura de la señal
Implica la ejecución de una función de usuario para atender la señal.
Situación compleja
Insertar código de usuario dentro del ciclo de ejecución en modo kernel
Cambios de pilas de ejecución

Monografias.com

53
Tratamiento de las señales
Captura de la señal
Solución propuesta en Linux
Situación cuando se atiende la señal:

Monografias.com

54
Tratamiento de las señales
Captura de la señal
Solución propuesta en Linux
Añadir nuevo marco a la pila de usuario
Incluir los parámetros de la función que atiende la señal
Copiar los parámetros de retorno almacenados en la pila de kernel
Poner como dirección de retorno, la dirección de la llamada al sistema sigreturn

Monografias.com

55
Tratamiento de las señales
Captura de la señal
Solución propuesta en Linux
Añadir nuevo marco a la pila de usuario
Modificar la pila de kernel
Poner como dirección de retorno a modo usuario, la dirección de la función que gestiona la señal

Monografias.com

56
Tratamiento de las señales
Captura de la señal
Solución propuesta en Linux
Añadir nuevo marco a la pila de usuario
Modificar la pila de kernel
Ejecutar la función gestora de la señal
Se ejecuta el código de usuario
Al finalizar, la dirección de retorno apunta a la llamada al sistema sigreturn

Monografias.com

57
Tratamiento de las señales
Captura de la señal
Solución propuesta en Linux
Añadir nuevo marco a la pila de usuario
Modificar la pila de kernel
Ejecutar la función gestora de la señal
Ejecutar la llamada al sistema
Copia la información de retorno almacenada en la pila de usuario
Vuelve a modo usuario

Monografias.com

58
Tratamiento de las señales
Captura de la señal
Solución propuesta en Linux
Añadir nuevo marco a la pila de usuario
Modificar la pila de kernel
Ejecutar la función gestora de la señal
Ejecutar la llamada al sistema
Copia la información de retorno almacenada en la pila de usuario
Vuelve a modo usuario

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter