Diseño de Sistemas Operativos

Slides:



Advertisements
Presentaciones similares
Capítulo I Gestión de E/S 1.- Gestión de E/S 2.- Hardware de E/S 3.- Software de E/S.
Advertisements

Arquitectura de Sistema de E/S
UNIX COMP 240.
Sistema operativo Componentes de un sistema operativo
T1-Introducción SO-Grado 2013_2014_Q1.
I.T.E.S.R.C. Romina Tamez Andrea Martínez Ma. De Lourdes Solís
Subsistemas De un Sistema Operativo Celeste Domínguez Romo
Sistemas en estratos. Descripción: se organiza en una jerarquía de estratos, estando construido cada uno de ellos sobre el otro que tiene menor jerarquía.
Sistemas Operativos Unidad II Procesos.
Introducción a los Sistemas Operativos Memoria Virtual
Modelo de procesos de dos estados
Estructuras en Sistemas Operativos
Base de la biblioteca de threads a nivel usuario del proyecto SODIUM.
Teoría de lenguajes y compiladores
SISTEMAS OPERATIVOS UNIDAD 1..
UTFSM - Sistemas Operativos
Multiprogramación Procesos Cecilia Hernández
ConceptoDefiniciónCaracterísticas (palabra clave) Ejemplo/Aplicación Sistema operativo Un sistema operativo es un software, es decir, forma parte de la.
HILOS Y COMUNICACIÓN ENTRE PROCESOS
Signal, kill, sigaction y máscara de señales
Tema 10: Gestión de Memoria
Semana 5 Subprogramas..
Unidad 7 Entrada/Salida
UNIDAD 3 Conceptos de Sistemas Operativos.
Unidad III Administración de procesos
Hilos - Lightweight process - Procesos ligeros
Archivos.
Introducción a la Programación. Lenguaje de Máquina.
Estructura del sistema operativo
Profesor: Rodrigo Sanhueza Figueroa
Tema 10.3: Asignación de Espacio No Contiguo. Tema 10.3: 2 Silberschatz, Galvin and Gagne ©2005 Fundamentos de los Computadores (ITT, Sist. Electr.),
Asignación de Espacio No Contiguo
Soporte HW para Administración de Memoria Cecilia Hernández
Hebras Cecilia Hernández. Qué es un proceso? Consiste Espacio de direccionamiento Código a ejecutar Datos estáticos y dinámicos Pila o stack CPU: PC,
Arquitectura NFS El servidor NFS exporta uno o más directorios
Introducción a los Sistemas Operativos
Introducción al tiempo real en sistemas empotrados
Gestión de procesos Sistemas Operativos Edwin Morales
TEMA 10. SISTEMAS OPERATIVOS DISTRIBUIDOS
Sistemas Operativos Tema 4
Introducción a Procesos.  Contexto de ejecución: Conjunto de variables y parámetros, que tiene independencia de otro procesos.  Contexto de E/S ◦ Descriptores.
Estructuras en Sistemas Operativos DAISY KATERINE RODRÍGUEZ.
1 Descripción y control de procesos Capítulo 3. 2 Requerimientos de un SO relacionados con procesos Ejecutar concurrentemente múltiples procesos para.
Teoría de Sistemas Operativos Procesos Departamento de Electrónica 2º Semestre, 2003 Gabriel Astudillo Muñoz
Memoria virtual.
Administrador de procesos
“Organización y Arquitectura de Computadores” William Stallings
Gestión de Memoria.
Breve introducción a la arquitectura de 32 bits intel.
CONCEPTOS FUNDAMENTALES DEL NIVEL DEL SISTEMA OPERATIVO
Breve introducción a la arquitectura de 32 bits intel.
Sistemas Distribuidos
El núcleo del sistema operativo
Sistemas Operativos Unidad III Procesos.
Estructura de los Sistemas Operativos
INTRODUCCION A SISTEMAS OPERATIVOS
UNIDAD 3 C ONCEPTOS DE S ISTEMAS O PERATIVOS. El ordenador es un sistema programable formado por un conjunto de elementos hardware que necesitan instrucciones.
ARQUITECTURA DE SISTEMAS OPERATIVOS.
CARACTERÍSTICAS Es un lenguaje de programación estructurado de propósito general. Está estrechamente asociado al sistema operativo UNIX, ya que el propio.
Unidad 2 – Gestión de Procesos
INTERRUPCIONES – ABRAZO MORTAL
Licenciatura Tecnologías de la Información y Comunicación
Elementos y tipos de sistemas operativos
Estructuras en Sistemas Operativos DAISY KATERINE RODRÍGUEZ.
ò Unidad Aritmético-Lógica ò Unidad de Control ò Buses internos ò Registros ò Puntero de Instrucciones (IP o PC) ò Acumulador ò De uso Generales ò.
Arquitectura de Computadores Clases Interrupciones de software y hardware IIC 2342 Semestre Rubén Mitnik Pontificia Universidad Católica.
Gestión de Memoria – Parte 2
Omar Herrera Caamal Rigoberto Lizárraga Luis Cetina Luna.
Estructura del sistema operativo
SISTEMAS ELECTRÓNICOS 3ºGIERM1 1. Introducción 2. Tipos de datos 3. Estructuras típicas de programación 4. Manejo de bits Tema 7. Programación de microcontroladores.
Transcripción de la presentación:

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

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

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

Í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

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

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

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.1. Interrupciones y excepciones val = a/0;

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

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

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

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

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

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

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 48 255 Excepciones 0 31 Interrupciones 32 47 8.1. Interrupciones y excepciones Llamadas al sistema 128

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

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

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()

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

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

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,...)

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,...)

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

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

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

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

Finalización de la gestión Procedimiento: Bottom half? Gestión de interrupción o excepción Ejecuta los procedimientos Sí 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()

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()

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

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

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

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(){

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

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

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

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: 00000000 <__libc_read>: 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 <__libc_read+0x1c> 20: c3 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

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

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() 

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

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

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

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

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

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

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

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

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

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

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

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

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 0 1 2 3 4 n 1 pendientes = 1 8.3. Señales

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

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

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

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

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

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

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

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

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

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

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

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

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