La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Diseño de Sistemas Operativos

Presentaciones similares


Presentación del tema: "Diseño de Sistemas Operativos"— Transcripción de la presentación:

1 Diseño de Sistemas Operativos
Gestión de Interrupciones Concurso a la Plaza de Profesor Titular de Universidad DF 1452/TU Área de Conocimiento: Física Aplicada Juan Carlos Pérez Darias Diciembre 2003

2 Diseño de Sistemas Operativos
Introducción al Sistema Operativo Unix Optimización de prestaciones: Buffer cache Gestión de ficheros y directorios Interfaz de acceso al subsistema de Entrada/Salida Controladores de dispositivos Procesos e hilos Gestión de memoria Gestión de interrupciones Gestión de procesos Planificación de procesos Comunicación entre procesos Introducción a los sistemas operativos distribuidos Bloque 1: Subsistema de Entrada/Salida Bloque 2: Subsistema de procesos Programa de teoría Bloque 3: Sistemas operativos distribuidos

3 Esquema general B A señales periféricos Llamadas al sistema CPU disco
Tema 8. Gestión de interrupciones excepciones CPU

4 Índice 8.0 Repaso conceptos básicos 8.1 Interrupciones y excepciones
8.2 Llamadas al sistema 8.3 Señales 8.4 Resumen Tema 8. Gestión de interrupciones

5 Introducción Estructura interna de un proceso en Linux 4 Gb 3 Gb Modo
8.0. Repaso de conceptos básicos código datos pila int main (int argc, char** argv) { int i, size, status,n_sons = 0; pid_t name_sons[16]; do { rank = fork(); name_sons[n_sons] = rank; n_sons++; } while ((rank != 0) && (n_sons < 16)); if (rank != 0) waitpid (name_sons[15], &status, 0); else Multiplica(); return (0); } Modo usuario

6 Introducción Estructura interna de un proceso en Linux 4 Gb Modo
asmlinkage void schedule(void) { struct schedule_data * sched_data; struct task_struct * prev, * next; int this_cpu; prev = current; /* move an exhausted RR process to be last.. */ prev->need_resched = 0; if (!prev->counter && prev->policy == SCHED_RR) { prev->counter = prev->priority; move_last_runqueue(prev); } switch (prev->state) { case TASK_INTERRUPTIBLE:  Modo kernel código kernel datos kernel pila kernel Interrupción Llamada sistema 3 Gb 8.0. Repaso de conceptos básicos pila int main (int argc, char** argv) { int i, size, status,n_sons = 0; pid_t name_sons[16]; do { rank = fork(); name_sons[n_sons] = rank; n_sons++; } while ((rank != 0) && (n_sons < 16)); if (rank != 0) waitpid (name_sons[15], &status, 0); else Multiplica(); return (0); } Modo usuario datos código

7 Introducción Estructura interna de un proceso en Linux
El kernel se “mapea” en todos los procesos Cuando se ejecuta en modo kernel se ejecuta en el modo supervisor del procesador Arquitectura Intel: Anillo 0: Kernel Anillo 3: Procesos usuario código kernel datos kernel pila kernel código A datos A pila A código kernel datos kernel pila kernel código B datos B pila B Proceso B Proceso A 8.0. Repaso de conceptos básicos datos kernel código kernel Kernel

8 8.1. Interrupciones y excepciones
val = a/0;

9 Esquema Interrupciones y excepciones Introducción
Soporte hardware para la gestión de interrupciones Gestión de interrupciones y excepciones en Linux Gestión de excepciones Gestión de interrupciones Procedimientos diferidos: Bottom Half Finalización de gestión de interrupciones y excepciones 8.1. Interrupciones y excepciones

10 Introducción Interrupción: Clasificación de interrupciones:
Evento que altera la secuencia de instrucciones ejecutadas por el procesador Clasificación de interrupciones: Interrupciones síncronas (excepciones): Producidas por la unidad de control de la CPU mientras se ejecutan instrucciones. Se producen después de la ejecución de una instrucción. Interrupciones asíncronas (interrupciones): Son generadas por otros dispositivos hardware Se producen de forma independiente a las señales de reloj de la CPU a=a/0 8.1. Interrupciones y excepciones

11 Introducción Código de usuario Código de kernel Situación típica:
Interrupción de reloj var=3; If(var>2) printf(“mayor”);  Código de usuario 8.1. Interrupciones y excepciones jiffies++; lost_ticks++; mark_bh(TIMER_BH); Código de kernel

12 Introducción Aspectos a considerar:
Las interrupciones pueden llegar en cualquier instante El kernel necesita atenderlas lo más rápidamente posible Acciones urgentes: top-half Acciones diferidas: bottom-half Ejemplo: Marca la presencia de los datos Continúa con las operaciones previas Realiza el resto del procesado de la interrupción 8.1. Interrupciones y excepciones

13 Ejecución anidada de interrupciones Bloqueo de interrupciones
Introducción Aspectos a considerar Las interrupciones pueden producirse mientras se está atendiendo otras interrupciones/excepciones Secciones críticas Ejecución anidada de interrupciones 8.1. Interrupciones y excepciones Bloqueo de interrupciones

14 Ejecución anidada de interrupciones Bloqueo de interrupciones
Introducción Secciones críticas Gestor de interrupciones 1: Insertar elemento en lista Ejecución anidada de interrupciones 8.1. Interrupciones y excepciones B A C Bloqueo de interrupciones Gestor de interrupciones 2: Buscar elemento en lista

15 Soporte hardware Interrupciones y excepciones en Intel
Cada interrupción o excepción se identifica con un número de 0 a 255  vector de interrupción Linux usa los siguientes vectores Inter. software Excepciones Interrupciones 8.1. Interrupciones y excepciones Llamadas al sistema 128

16 Soporte hardware Tabla de Descriptores de Interrupción
Asocia cada vector de interrupción o excepción con la dirección del gestor correspondiente descriptor n 8.1. Interrupciones y excepciones Dirección de la función Permisos descriptor 2 descriptor 1 IDTR

17 Soporte hardware Gestión hardware de interrupciones y excepciones
Antes de ejecutar una instrucción se comprueba si se ha producido una excepción o interrupción. Determina el vector (0  i  255) asociado Lee la entrada i de la IDT y obtiene la dirección de la función que atiende ese evento Comprueba los permisos asociados. No se puede atender una interrupción en un nivel de protección inferior a donde se produce Si CPL  DPL  Se cambia a la pila del nivel específico (pila de kernel) 8.1. Interrupciones y excepciones

18 Soporte hardware Gestión hardware de interrupciones y excepciones
Cambio de pila valor=suma*3; for(i=0; i<100;i++) valor=valor+ i;  Código de usuario marco main() marco func1() Pila usuario Cambio pila 8.1. Interrupciones y excepciones marco raton() Pila kernel posx = x+desp; posy = y – desp;  Código de kernel jiffies++; lost_ticks++; mark_bh(TIMER_BH); Código de kernel marco reloj()

19 Soporte hardware Gestión hardware de interrupciones y excepciones
Antes de ejecutar una instrucción se comprueba si se ha producido una excepción o interrupción. Determina el vector (0  i  255) asociado Lee la entrada i de la IDT y obtiene la dirección de la función que atiende ese evento Comprueba los permisos asociados. No se puede atender una interrupción en un nivel de protección inferior a donde se produce Si CPL  DPL  Se cambia a la pila del nivel específico (pila de kernel) Invoca la función gestora 8.1. Interrupciones y excepciones

20 Gestión de excepciones
Gestión de excepciones en Linux Linux aprovecha las excepciones para conseguir dos objetivos: Enviar una señal a un proceso para notificar una condición anómala Implementar la estrategia de paginación bajo demanda var=0; temp=suma/var; printf(“%d”, temp);  Código de usuario 8.1. Interrupciones y excepciones Señal SIGPFE Proceso

21 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 Gestión de excepción 8.1. Interrupciones y excepciones Pila kernel Cont. Programa (pc) pila usuario (sp) Registros (A,B,...) Registros procesador Cont. Programa (pc) pila usuario (sp) Registros (A,B,...)

22 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 Pila kernel Cont. Programa (pc) pila usuario (sp) Registros (A,B,...) Registros procesador Gestión de excepción 8.1. Interrupciones y excepciones do_excepcion () do_excepcion pila kernel (sp) Registros (A,B,...)

23 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 8.1. Interrupciones y excepciones

24 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. 8.1. Interrupciones y excepciones

25 Gestión de interrupciones
PIC IRQn 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 IDT[32+n] 8.1. Interrupciones y excepciones descriptor n Estructuras involucradas CPU ISR 1 ISR 3 ISR 2

26 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 8.1. Interrupciones y excepciones Timer Red Teclado Net_2 Net_1 Tim_1 Tim_2 Tim_3

27 Finalización de la gestión
Procedimiento: Bottom half? Gestión de interrupción o excepción Ejecuta los procedimientos No posx = x+desp; posy = y – desp;  Código de kernel gestor ratón Interrupciones anidadas jiffies++; lost_ticks++; mark_bh(TIMER_BH); Código de kernel gestor reloj Si Recupera contexto hardware 8.1. Interrupciones y excepciones marco raton() Pila kernel marco reloj() marco raton()

28 Finalización de la gestión
Procedimiento: Bottom half? Ejecuta los procedimientos Si No Gestión de interrupción o excepción Interrupciones anidadas Recupera contexto hardware 8.1. Interrupciones y excepciones Planificación No Si Planificador schedule() señales No Si Gestor señales do_signal()

29 8.2. Llamadas al sistema  read(fd,buf,5) write(f,buf2,3) 

30 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 8.2. Llamadas al sistema

31 Introducción Llamadas al sistema: Objetivos:
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 8.2. Llamadas al sistema

32 Visión general de las llamadas
open() {  } fork(){ libc Interrupción software  pid=fork(); modo usuario modo kernel 8.2. Llamadas al sistema sys_open() {  } sys_ fork(){

33 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 8.2. Llamadas al sistema

34 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 8.2. Llamadas al sistema

35 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 8.2. Llamadas al sistema

36 Implementación de la biblioteca
Ejemplo: num=read(fd,buf,count); # ar x /usr/lib/libc.a read.o # objdump –d read.o 1. Copia de parámetros a los registros read.o: file format elf32-i386 Disassembly of section .text: <__libc_read>: 0: push %ebx 1: 8b mov 0x10(%esp,1),%edx 5: 8b 4c 24 0c mov 0xc(%esp,1),%ecx 9: 8b 5c mov 0x8(%esp,1),%ebx d: b mov $0x3,%eax 12: cd int $0x80 14: 5b pop %ebx 15: 3d 01 f0 ff ff cmp $0xfffff001,%eax 1a: 0f 83 fc ff ff ff jae 1c <__libc_read+0x1c> 20: c ret 2. Código de la llamada en registro eax 3. Interrupción software: Entrada al kernel 8.2. Llamadas al sistema 4. Tratamiento de errores y código de retorno

37 Implementación en el kernel
Situación de entrada al núcleo  mov 0xc(%esp,1),%ecx mov 0x8(%esp,1),%ebx mov $0x3,%eax int $0x80 pop %ebx system_call:  sys_read() ret_from_sys_call: iret main() { ••• num=read(fd,buf,count); int $0x80 Pila kernel marco sys_read() marco read() código A datos A marco main() código A datos A marco main() marco read() 8.2. Llamadas al sistema pila usuario Parámetros de la función (fd, buf, count) Dirección retorno

38 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 8.2. Llamadas al sistema sys_exit() sys_fork() sys_read() sys_write() sys_open() 

39 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 8.2. Llamadas al sistema Continúa la ejecución en modo usuario

40 8.3. Señales en Unix proceso A proceso B kernel

41 Esquema 8.3. Señales Introducción Fuentes de señales
Estructuras del núcleo para la gestión de señales Envío de una señal Recepción de una señal Tratamiento de las señales 8.3. Señales

42 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 8.3. Señales

43 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 8.3. Señales

44 Fuentes de señales Las señales se originan por diversas situaciones:
Exepciones Otros procesos Llamada al sistema kill Interrupciones de terminal a=b/0 señal excepción kernel 8.3. Señales Instrucción ilegal SIGINT Ctrl+C

45 Fuentes de señales Las señales se originan por diversas situaciones:
Control de ejecución: Alarmas pid=fork(); if(pid>0) wait (status);  Código pid=fork(); if(pid>0) wait (status); else exit(0); Código SIGCLD hijo padre 8.3. Señales SIGALRM

46 Estructuras de datos asociadas
Representación de los procesos en Linux Gestión de señales Señales Bloqueadas Pendientes Gestión gestión pendientes bloqueadas señales need_resched priority counter Parámetros de planificación prioridad tiempo ejecutado ycpid ppid pid Identificación del proceso o hilo Número de identificación (pid) Relación con otros procesos Padre, hermanos gestión pendientes bloqueadas señales  need_resched priority counter 8.3. Señales ycpid ppid pid Información de cada proceso: Task_struct

47 Estructuras de datos asociadas
Estructuras de datos para la gestión de señales hand_sighup() hand_sigint() 1 mifunc() Funciones que atienden las señales: 0: Acción por defecto 1: Ignora la señal  Array de 64 bits (1 por cada señal pendiente) gestión pendientes bloqueadas señales 0: No hay señales pendientes 1: Existe alguna señal pendiente  Array de señales bloqueadas  need_resched priority counter 8.3. Señales ycpid ppid pid Información de cada proceso: Task_struct

48 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) Procesos dormidos: Los procesos duermen a la espera de un determinado evento Finalización de una operación de E/S Liberación de recursos del sistema, ... Dependiendo de la certeza en la que se produzca el evento, se clasifican: Procesos ininterrumpibles: Existe seguridad que el evento ocurra Procesos interrumpibles: La ocurrencia del evento no es segura Introducción de datos desde teclado Liberación de un semáforo de usuario, ... Estos procesos despiertan al recibir una señal Recordatorio 8.3. Señales

49 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 Usuario Juan Usuario María 8.3. Señales Un proceso en modo usuario (salvo el superusuario) sólo puede enviar señales a procesos de su propiedad

50 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 task_struct proceso t ycpid ppid pid need_resched priority counter  gestión pendientes bloqueadas señales hand_sighup() hand_sigint() 1 mifunc() 2 3 n 8.3. Señales handler = 1 Ignora la señal handler

51 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 task_struct proceso t ycpid ppid pid need_resched priority counter  gestión pendientes bloqueadas señales  Array de 64 bits n 1 pendientes = 1 8.3. Señales

52 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 8.3. Señales Despierta al proceso

53 Señal pendiente de gestionar
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: task_struct proceso t ycpid ppid pid need_resched priority counter  gestión pendientes bloqueadas señales pendientes = 1 Señal pendiente de gestionar pendientes 8.3. Señales

54 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 8.3. Señales

55 Tratamiento de las señales
Ejecución de la acción por defecto Detener el proceso Situación típica utilizada por los depuradores hijo (depurado) task_struct proceso t estado ppid pid need_resched priority counter  gestión pendientes bloqueadas señales padre (depurador) señal 8.3. Señales estado = STOPPED

56 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 task_struct proceso t estado ppid pid need_resched priority counter  gestión pendientes bloqueadas señales 8.3. Señales hijo (depurado) estado = RUNNING

57 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 zombie código A datos A marco main() datos pila datos do_exit() 8.3. Señales marco main() marco main() datos A datos A fichero core

58 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 main(){ signal(SIGINT,funcion); while(1); } Código de usuario /* gestión interrup.  do_signal(); } Código de kernel 8.3. Señales CTRL+C void funcion(){ printf(“hola mundo”); } Código de usuario

59 Tratamiento de las señales
Captura de la señal Solución propuesta en Linux Situación cuando se atiende la señal: marco main() pila usuario pila kernel Info retorno do_signal 8.3. Señales Gestión CTRL+C

60 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 1. Modificar la pila de usuario marco main() pila usuario pila kernel Info retorno do_signal 8.3. Señales parámetros func info retorno parámetros func info retorno sigreturn() parámetros func Info retorno Info retorno Info retorno

61 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 2. Modificar la dirección de retorno de la pila de kernel marco main() pila usuario parámetros func info retorno sigreturn() pila kernel Info retorno do_signal 8.3. Señales parámetros func info retorno parámetros func dirección func

62 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 3. Ejecutar la función que atiende la señal marco main() pila usuario parámetros func info retorno sigreturn() void funcion(){ printf(“hola mundo”); } main(){ signal(SIGINT,funcion); while(1); Código de usuario 8.3. Señales

63 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 3. Ejecutar la función que atiende la señal marco main() pila usuario parámetros func info retorno sigreturn() pila kernel sys_sigreturn 8.3. Señales info retorno info retorno info retorno info retorno info retorno

64 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 3. Ejecutar la función que atiende la señal marco main() pila usuario void funcion(){ printf(“hola mundo”); } main(){ signal(SIGINT,funcion); while(1); Código de usuario 8.3. Señales


Descargar ppt "Diseño de Sistemas Operativos"

Presentaciones similares


Anuncios Google