INTERRUPCIONES SOFTWARE y EXCEPCIONES



Documentos relacionados
Conmutación de Tareas

Entorno de Ejecución del Procesador Intel Pentium

6-REGISTROS DEL 8086 Y DEL 80286

Arquitectura intel Preámbulo de OSO para alumnos formados en el procesador MIPS. Asignatura Sistemas Operativos Murcia abril de 2005

Ensamblador. Interrupciones. Dentro de una computadora existen dos clases de interrupciones:

Escalada de privilegios mediante infección ELF

Manejo Básico de Tareas

Manejo Básico de Tareas y Scheduler

Arquitectura IA-32 Modo Real. Autor:Alejandro Furfaro

Apellidos Nombre DNI

Tema 2: Arquitectura del repertorio de instrucciones. Visión del computador que tiene el programador en bajo nivel.

Requerimientos Principales de un Sistema Operativo. Descripción y Control de Procesos. Proceso

JUGANDO CON C, ASM Y SYSCALLS Alejandro Hernández

1. Procesos vs Hilos 2. Cuando se ejecutan los procesos 3. Fork 4. Clone 5. Cómo se ejucuta el fork? 6. do_fork() 7. copy_process 8.

Arquitectura IA-32 Modo Real. Autor:ALejandro Furfaro

Entrada/Salida. Polling e Interrupciones. Verano de Mariano Moscato. Organización del Computador 1

Aprendiendo Sistemas Operativos: Programación de Procesadores de Arquitectura IA-32

Hilos, comunicación y competencia entre procesos. Dr. Alonso Ramírez Manzanares 2-Sep-2010

INTERRUPCIONES. La comunicación asíncrona de los sistemas periféricos con la CPU, en ambos sentidos, se puede establecer de dos maneras fundamentales:

Cuadro Comparativo Registros de Microprocesadores

Taller de Sistemas Operativos. System Calls 2012

Generación de código para funciones. Generación de código para funciones. Generación de código para funciones. Generación de código para funciones

Sistemas Operativos. Curso 2016 Procesos

INTRODUCCIÓN. Interrupciones.

Unidad 1: Conceptos generales de Sistemas Operativos.

Requerimientos principales de un sistema operativo

El soporte del sistema operativo. Hace que un computador sea más fácil de usar. Permite que los recursos del computador se aprovechen mejor.

Ensamblador x86: lazos y procedimientos

Conmutación de Tareas

Capítulo 1 Introducción a la Computación

Tema 1. Conceptos fundamentales de los Sistemas Operativos

Contenido. Sistemas de Entrada/Salida. Categorias de los Dispositivos de Entrada/Salida. Categorias de los Dispositivos de Entrada/Salida

SOLUCION EXAMEN junio 2006

Anexo B. Comunicaciones entre mc y PC

Unidad 1: Conceptos generales de Sistemas Operativos.

"Programación en Ensamblador del microprocesador Pentium (I)"

PROTEUS Depuración de programas para microprocesadores

Estructura de datos y de la información Boletín de problemas - Tema 7

Organización del Computador I 1er. Parcial 17-Mayo Turno:

Tema 4. Gestión de entrada/salida

Señal de petición de Interrupción

Estructuras de Sistemas Operativos

PRACTICA #1. Aprender a programar una interrupción software empleando C y/o Ensamblador.

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACION DE COMPUTACIÓN PROYECTO DE CÁTEDRA. MATERIA: Introducción a la Programación

2º CURSO INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN TEMA 5 ENTRADA/SALIDA. JOSÉ GARCÍA RODRÍGUEZ JOSÉ ANTONIO SERRA PÉREZ Tema 5.

ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA

Estructura de Computadores

7. Manejo de Archivos en C.

Tema 14. Interrupciones. Las. C. F. G.S. D.P.E. Módulo de Proyectos 1

Arquitectura IA-32 Pila. Autor:Alejandro Furfaro

CICLO DE LOS PARTES DE TRABAJO EN EL PROGRAMA PARA LA GESTIÓN DEL MANTENIMIENTO

INTERRUPCIONES. Existen 256 interrupciones En el modo real cada una tiene un vector asociado Vectores de 4 bytes: segmento + offset 32 F0 50 8A

Título: Extracción de estructuras OLE (Reversing structured storage serialized) Autor: Andrés Tarascó Acuña:

GUIAS ÚNICAS DE LABORATORIO GENERADOR DE NÚMEROS PRIMOS AUTOR: ALBERTO CUERVO

ACTIVIDADES TEMA 1. EL LENGUAJE DE LOS ORDENADORES. 4º E.S.O- SOLUCIONES.

Circuitos Electrónicos. Septiembre 2005/2006. Problema 1º parcial

Procesadores de 64 bits

La Unidad Procesadora.

Tema 6: Generación de código (parte 2)

Uso de excepciones en Java

Visual Basic 1. Empleo de módulos y Procedimientos. Procedimientos definidos por el usuario

Ensamblador x86. Ing. Jorge Castro-Godínez

Tiempo de Compilación. Programa fuente. Secuencia. de caracteres. Scanner. Secuencia. de símbolos Parser. Compilador.

La arquitectura del 8086/8088

Práctica 3: Programación con subrutinas

UNIDADES FUNCIONALES DEL ORDENADOR TEMA 3

Capítulo 9. Archivos de sintaxis

Modo Real vs Modo Protegido. Pasaje a modo protegido

Asignación de Procesadores

Ilustrar el mecanismo de llamadas al sistema para solicitar servicios al sistema operativo.

GUIA DE USO DEL ACCPRO

Gestión de procesos DEFINICIONES DE PROCESOS

Examen de Fundamentos de sistemas distribuidos

Funciones. Diseño de funciones. Uso de instrucción jal y retorno de subrutina.

Módulo 08 Lenguaje Ensamblador

Hardware y Estructuras de Control. Memoria Virtual. Ejecución de un Programa. Ejecución de un Programa

ISA (Instruction Set Architecture) Arquitectura del conjunto de instrucciones

Autor: Microsoft Licencia: Cita Fuente: Ayuda de Windows

Aplicateca API Validador de Móviles Certificados SMS -

BENEMÉRITA UNIVERSIDAD AUTÓNOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN

Sistemas de archivos distribuidos. Alvaro Ospina Sanjuan

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

La memoria principal. Los subsistemas de E/S. Los buses del sistema

SIIGO Pyme. Procesos Gestión de Ventas. Cartilla I

Capítulo 4 Gestión de memoria

Programación Orientada a Objetos en Java

Ingeniería Superior de Informática. Curso 3º. Sistemas Operativos. Examen Final. TEORÍA. 31 de Enero de 2005

SCT Software para la calibración de transductores de fuerza. Versión 3.5. Microtest S.A.

Copia de seguridad y restauración de un Curso en la Plataforma Moodle

Actividad 4: Comunicación entre PLC s vía Ethernet

Gestión de la Configuración

Temporizadores y contadores en tiempo real: El módulo Timer0 y el prescaler del PIC

Pilas y Colas. Capítulo 3

Mesa de Ayuda Interna

Tema 2: Implementación del núcleo de un Sistema Operativo

Transcripción:

INTERRUPCIONES SOFTWARE y EXCEPCIONES S.CANDELA Universidad de Las Palmas de Gran Canaria (c) ULPGC 1

Interrupciones Una interrupción n se genera cuando se quiere que la CPU deje de ejecutar el proceso en curso y ejecute una función específica de quien produce la interrupción. n. Cuando se ejecuta esta función n específica decimos que la CPU está atendiendo la interrupción. n. Podemos realizar una clasificación n de las interrupciones, atendiendo a la fuente que las produce. Interrupcion software,, se produce cuando un usuario solicita una llamada del sistema. Interrupciones hardware,, son causadas cuando un dispositivo hardware requiere la atención n de la CPU para que se ejecute su manejador. Excepciones,, son interrupciones causadas por la propia CPU, cuando ocurre algún n suceso, por ejemplo una división n por cero. (c) ULPGC 2

Interrupción software (1) Una Interrupción software se produce cuando un usuario solicita un recurso del núcleo, mediante una llamada al sistema, open, write, read, mount,.. El proceso usuario solicita la función correspondiente de la librería libc. df = open (fichero, modo); La función de librería coloca los parámetros de la llamada en los registros del procesador y ejecuta la instrucción INT 0x80 Se conmuta a modo núcleo mediante las tablas IDT y GDT Entra a ejecutarse una función del núcleo, system_call, Interfase entre el usuario y el núcleo. Cuando se termina la llamada, system_call retorna al proceso que la llamo y se retorna a modo usuario. (c) ULPGC 3

Interrupción software (2) Llega la interrupción software INT 80h y se busca en la IDT la entrada correspondiente a la interrupción. Se obtiene un puntero desplazamiento al núcleo (D) Y una entrada (S) a GDT La entrada en la GDT indica una base (B) y un limite (L) del núcleo Se llega al manejador de interrupción system_call. (c) ULPGC 4

Interrupciones Software gráfico df = open(ficheor, modo); open libc INT 80 INT 0 1 2 33 80 IDT TR LDTR GDT B L A B L A B L A B L A B L A B L A B L A TSS EAX EBX ECX... CS FLG LDT Descriptor 1 Descriptor 2 Descriptor 3 Descriptor n Descriptor Base + Desplazamiento MEMORIA NÚCLEO system_call: save_all call sys_open restore_all sys_open 255 B L A B IDTR L B GDTR L Limite S Selector D Desplazamiento (c) ULPGC A Atributos B Base 5 L - Limite

sys_call SAVE_ALL Guardar el estado del procesador, registros internos, en el stack se va a asignar la CPU a otro proceso. CALL SYS_XXX Se llama a una función que implementa la llamada al sistema. RESTORE_ALL Se recupera el estado de la máquina con los valores guardados en el stack para reanudar el proceso que se interrumpió. (c) ULPGC 6

System_call ENTRY(system_call) /* el primer argumento de system_call es el número n de la llamada al sistema * a invocar; se indicará en el registro EAX. * System_call permite hasta cuatro argumentos mas que serán n pasados a * lo largo de la llamada al sistema. Uno de los argumentos puede e ser * un puntero a una estructura */ 244 ENTRY(system_call) 245 pushl %eax # save orig_eax /* SAVE_ALL hace una copia de todos los registros de la CPU en la pila. * Cualquier función n de C que sea llamada encontrará sus argumentos en la pila porque SAVE_ALL los pone allí */ 246 SAVE_ALL (c) ULPGC 7

System_call /* Comprueba si la llamada al sistema esta haciendo una traza. AlgunosA * programas permiten hacer trazas en las llamadas al sistema como una * herramienta para curiosos o para obtener información n extra de depuración n */ 247 GET_THREAD_INFO(%ebp) 248 # system call tracing in operationo 249 testb $(_TIF_SYSCALL_TRACE _TIF_SYSCALL_AUDIT),TI_flags(%ebp TIF_SYSCALL_TRACE _TIF_SYSCALL_AUDIT),TI_flags(%ebp) 250jnz syscall_trace_entry /* Compara si el numero de la llamada al sistema (EAX) excede del numeron * máximo m de llamadas al sistema */ 251 cmpl $(nr_syscalls nr_syscalls), %eax% 252 jae syscall_badsys (c) ULPGC 8

System_call /* Llama a la función n del sistema. Sys_call_table es una tabla de punteros a funciones del núcleo n que implementan las llamadas al sistema. */ /* El segundo conjunto de paréntesis en la línea l contiene tres argumentos: * la dirección n base del vector, * el índice (EAX, el numero de la llamada al sistema), * y la escala o numero de bytes en cada elemento del vector. */ 253 syscall_call: 254 call *sys_call_table(,%eax,4) (c) ULPGC 9

System_call /* La etiqueta restore_all es el punto de salida para system_call. * Su contenido es simple como la macro RESTORE_ALL,, que * recupera los argumentos guardados por SAVE_ALL y retorna * al llamador del system_call.. */ 263 restore_all: 264 RESTORE_ALL (c) ULPGC 10

System_call /* Comprueba si no existe trabajo pendiente */ 276 movl TI_flags(%ebp), %ecx% 277 andl $_TIF_WORK_MASK, %ecx% # is there any work to be done other 278 # than syscall tracing? 279 jz restore_all /* Comprueba si se tiene que volver a asignar la CPU */ 280 testb $_TIF_NEED_RESCHED, %cl% 281 jnz work_resched 282 /* Comprueba si tiene señales pendientes y vuelve al modo núcleo n modo virtual */ 283 work_notifysig: : # deal with pending signals and 284 # notify-resume requests 285 testl $VM_MASK, EFLAGS(%esp) 286 movl %esp,, %eax% 287 jne work_notifysig_v86 # returning to kernel-space or 288 # vm86-space /* Comprueba si existe trabajo pendiente */ 289 xorl %edx,, %edx% 290 call do_notify_resume 291 jmp restore_all 292 (c) ULPGC 11

System_call /* Si retornamos a modo virtual llamamos a save_v86_state state */ 294 work_notifysig_v86: 295 pushl %ecx # save ti_flags for do_notify_resume 296 call save_v86_state # %eax% contains pt_regs pointer 297 popl %ecx 298 movl %eax,, %esp% 299 xorl %edx,, %edx% 300 call do_notify_resume 301 jmp restore_all 302 /* Punto de entrada si la llamada al sistema del proceso actual * esta haciendo una traza */ 303 # perform syscall exit tracing 304 ALIGN 305 syscall_trace_entry: 306 movl $-ENOSYS,EAX(%esp) 307 movl %esp,, %eax% 308 xorl %edx,%edx 309 call do_syscall_trace 310 movl ORIG_EAX(%esp), %eax% 311 cmpl $(nr_syscalls nr_syscalls), %eax% 312 jnae syscall_call 313 jmp syscall_exit 314 315 # perform syscall exit tracing (c) ULPGC 12

System_call 316 ALIGN /* comprueba si hay trabajo pendiente si se vuelve del modo traza a */ 317 syscall_exit_work: 318 testb $(_TIF_SYSCALL_TRACE _TIF_SYSCALL_AUDIT _TIF_SINGLESTEP), %cl 319 jz work_pending /* Habilita las interrupciones */ 320 sti # could let do_syscall_trace() call 321 # schedule() instead 322 movl %esp,, %eax% 323 movl $1, %edx% /* se llama al modo traza */ 324 call do_syscall_trace /* se vuelve al modo usuario */ 325 jmp resume_userspace 326 327 ALIGN (c) ULPGC 13

System_call /* si se produce un error guardar el estado, obtener la información * del hilo y volver al espacio de usuario */ 328 syscall_fault: 329 pushl %eax # save orig_eax 330 SAVE_ALL 331 GET_THREAD_INFO(%ebp) 332 movl $-EFAULT,EAX(%esp) 333 jmp resume_userspace 334 335 ALIGN /* si la llamada no es correcta volver al espacio de usuario */ 336 syscall_badsys: 337 movl $-ENOSYS,EAX(%esp) 338 jmp resume_userspace 339 (c) ULPGC 14

posiciones de los registros en en el stack Después s de volver de una llamada, muchos procedimientos necesitan esta información n en el stack. El registro EBX contiene la variable current la dirección n que apunta a la entrada en la tabla de procesos del proceso que realiza la llamada. 51 EBX = 0x00 52 ECX = 0x04 53 EDX = 0x08 54 ESI = 0x0C 55 EDI = 0x10 56 EBP = 0x14 57 EAX = 0x18 58 DS = 0x1C 59 ES = 0x20 60 ORIG_EAX = 0x24 61 EIP = 0x28 62 CS = 0x2C 63 EFLAGS = 0x30 64 OLDESP = 0x34 65 OLDSS = 0x38 66 67 CF_MASK = 0x00000001 68 IF_MASK = 0x00000200 69 NT_MASK = 0x00004000 70 VM_MASK = 0x00020000 71 72 /* 73 * these are offsets into the task-struct struct. 74 */ 75 state = 0 76 flags = 4 77 sigpending = 8 78 addr_limit = 12 79 exec_domain = 16 80 need_resched = 20 (c) ULPGC 15

SAVE_ALL #define SAVE_ALL cld; pushl %es; pushl %ds; pushl %eax; pushl %ebp; pushl %edi; pushl %esi; pushl %edx; pushl %ecx; pushl %ebx; movl $( USER_DS),%edx USER_DS),%edx; movl %dx,%ds %ds; movl %dx,%es %es; (c) ULPGC 16

RESTORE_ALL (RECUPERA EL ESTADO DEL PROCESO INTERRUMPIDO) 99 #define RESTORE_INT_REGS \ 100 popl %ebx; \ 101 popl %ecx; \ 102 popl %edx; \ 103 popl %esi; \ 104 popl %edi; \ 105 popl %ebp; \ 106 popl %eax 107 108 #define RESTORE_REGS \ 109 RESTORE_INT_REGS; \ 110 1: popl %ds; \ 111 2: popl %es; \ 112.section.fixup,"ax. fixup,"ax"; "; \ 113 3: movl $0,(%esp); \ 114 jmp 1b; \ 115 4: movl $0,(%esp); \ 116 jmp 2b; \ 117.previous; \ (c) ULPGC 17

RESTORE_ALL 125 #define RESTORE_ALL 126 RESTORE_REGS 127 addl $4, %esp% esp; 128 1: iret; 129.section.fixup,"ax. fixup,"ax"; "; 130 2: sti; 131 movl $( USER_DS), %edx% edx; 132 movl %edx,, %ds% ds; 133 movl %edx,, %es% es; 134 movl $11,%eax; 135 call do_exit; 136.previous; 137.section ex_table,"a ex_table,"a"; "; 138.align 4; 139.long 1b,2b; 140.previous. 141 (c) ULPGC 18

SYS_CALL_TABLE 1. Tabla con todas la funciones que tratan las llamadas al sistema. 578 ENTRY(sys_call_table) 579.long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ 580.long sys_exit 581.long sys_fork 582.long sys_read 583.long sys_write 584.long sys_open /* 5 */ 585.long sys_close 586.long sys_waitpid 587.long sys_creat 588.long sys_link 589.long sys_unlink /* 10 */ 590.long sys_execve (c) ULPGC 19

591.long sys_chdir SYS_CALL_TABLE 2 592.long sys_time 593.long sys_mknod 594.long sys_chmod /* 15 */ 595.long sys_lchown16 596.long sys_ni_syscall /* old break syscall holder */ 597.long sys_stat 598.long sys_lseek 599.long sys_getpid /* 20 */ 600.long sys_mount 601.long sys_oldumount 602.long sys_setuid16 603.long sys_getuid16 604.long sys_stime /* 25 */ 605.long sys_ptrace 606.long sys_alarm (c) ULPGC 20

853.long sys_mbind SYS_CALL_TABLE 3 854.long sys_get_mempolicy 855.long sys_set_mempolicy 856.long sys_mq_open 857.long sys_mq_unlink 858.long sys_mq_timedsend 859.long sys_mq_timedreceive /* 280 */ 860.long sys_mq_notify 861.long sys_mq_getsetattr 862.long sys_ni_syscall /* reserved for kexec */ 863.long sys_waitid 864.long sys_ni_syscall /* 285 */ /* available */ 865.long sys_add_key 866.long sys_request_key 867.long sys_keyctl 868 869 syscall_table_size=(. =(.-sys_call_table) (c) ULPGC 21

Excepciones (1) Son interrupciones producidas por la propia CPU cuando se producen ciertas situaciones como división n por cero, desbordamiento del stack,, fallo de página etc. Como todas las interrupciones el núcleo n realiza los siguientes pasos: 1. Guardar el estado del proceso en el stack. pushl, pushl, 2. Llamar la función n manejadora de la excepción. call 3. Recuperar el estado de la función. n. pop, pop, (c) ULPGC 22

Excepciones (2) Cuando se produce una excepción, la propia CPU realiza una instrucción de interrupción n INT 0xNN para saltar dentro de la tabla IDT (tabla de descriptores de segmento de interrupciones) en la posición n NN. En esta posición n se encuentra un selector a la GDT (tabla global de descriptores de segmento) y un desplazamiento para alcanzar la direccid irección dentro del núcleo n de la función n (punto de entrada en el núcleo) n que hay que ejecutar cuando se produce esta excepción. (c) ULPGC 23

Excepciones (3) idt_table 0 1 excepciones 2 32 syscall 0x80 B IDTR 255 L S: selector o indice D: desplazamiento A: atributos B: base L: límite (c) ULPGC 24

Excepciones (4) 378 ENTRY(divide_error) 379 pushl $0 # no error code 380 pushl $do_divide_error 381 ALIGN 382 error_code: 383 pushl %ds 384 pushl %eax 385 xorl %eax,, %eax% 386 pushl %ebp 387 pushl %edi 388 pushl %esi 389 pushl %edx 390 decl %eax # eax = -1 391 pushl %ecx 392 pushl %ebx 393 cld 394 movl %es,, %ecx% (c) ULPGC 25

Excepciones (5) /* almacenar la dirección n de la función n que atiende la excepción n en el registro edi */ 395 movl ES(%esp), %edi% # get the function address 396 movl ORIG_EAX(%esp), %edx% # get the error code 397 movl %eax, ORIG_EAX(%esp) 398 movl %ecx,, ES(%esp %esp) /* preparar registros de la CPU para realizar la llamada */ 399 movl $( USER_DS USER_DS), %ecx 400 movl %ecx, %ds 401 movl %ecx, %es 402 movl %esp,%eax # pt_regs pointer /* llamada a la función n que atiende la excepción n */ 403 call *%edi (c) ULPGC 26

Excepciones (6) /* recuperar el proceso interrumpido */ 404 jmp ret_from_exception 405 Veamos como se recupera el estado del proceso interrumpido en una excepción: 159 ret_from_exception: /* desabilita interrupciones preempt_stop se define como cli */ 160 preempt_stop 161 ret_from_intr: 162 GET_THREAD_INFO(%ebp) 163 movl EFLAGS(%esp), %eax% # mix EFLAGS and CS 164 movb CS(%esp), %al (c) ULPGC 27

Excepciones (7) /* si es necesario volver al modo núcleo n */ 165 testl $(VM_MASK 3), %eax% 166 jz resume_kernel # returning to kernel or vm86-space 167 ENTRY(resume_userspace) 168 cli # make sure we don't miss an interrupt 169 # setting need_resched or sigpending 170 # between sampling and the iret 171 movl TI_flags(%ebp), %ecx% 172 andl $_TIF_WORK_MASK, %ecx% # is there any work to be done on 173 # int/exception return? 174 jne work_pending /* salta a recuperar el estado del proceso interrumpido */ 175 jmp restore_all (c) ULPGC 28

Excepciones (8) Veamos el resto de puntos de entrada en el núcleo n de las excepciones. 406 ENTRY(coprocessor_error) 407 pushl $0 408 pushl $do_coprocessor_error 409 jmp error_code 410 411 ENTRY(simd_coprocessor_error) 412 pushl $0 413 pushl $do_simd_coprocessor_error 414 jmp error_code (c) ULPGC 29

Excepciones (9) 511 ENTRY(int3) 512 pushl $-1 1 # mark this as an int 513 SAVE_ALL 514 xorl %edx,%edx # zero error code 515 movl %esp,%eax # pt_regs pointer 516 call do_int3 517 testl %eax,%eax 518 jnz restore_all 519 jmp ret_from_exception 520 521 ENTRY(overflow) 522 pushl $0 523 pushl $do_overflow 524 jmp error_code 525 526 ENTRY(bounds) 527 pushl $0 528 pushl $do_bounds 529 jmp error_code 530 531 ENTRY(invalid_op) 532 pushl $0 533 pushl $do_invalid_op 534 jmp error_code (c) ULPGC 30

Excepciones (10) 541 ENTRY(invalid_TSS) 542 pushl $do_invalid_tss 543 jmp error_code 544 545 ENTRY(segment_not_present) 546 pushl $do_segment_not_present 547 jmp error_code 548 553 ENTRY(general_protection) 554 pushl $do_general_protection 555 jmp error_code 556 /* punto de entrada cuando se produce un fallo de página, p esto es la CPU necesita datos y no están n en memoria principal y necesita traerlos de memoria segundaria */ 561 ENTRY(page_fault) 562 pushl $do_page_fault 563 jmp error_code 564 (c) ULPGC 31