INTERRUPCIONES SOFTWARE y EXCEPCIONES -...

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

Transcript of INTERRUPCIONES SOFTWARE y EXCEPCIONES -...

(c) ULPGC 1

INTERRUPCIONES SOFTWARE y EXCEPCIONES

S.CANDELA

© Universidad de Las Palmas de Gran Canaria

(c) ULPGC(c) ULPGC 22

Interrupciones Interrupciones Una interrupciUna interrupcióón se genera cuando se quiere que la CPU deje n se genera cuando se quiere que la CPU deje de ejecutar el proceso en curso y ejecute una funcide ejecutar el proceso en curso y ejecute una funcióón n especespecíífica de quien produce la interrupcifica de quien produce la interrupcióón. Cuando se ejecuta n. Cuando se ejecuta esta funciesta funcióón especn especíífica decimos que la CPU estfica decimos que la CPU estáá atendiendo la atendiendo la interrupciinterrupcióón. Podemos realizar una clasificacin. Podemos realizar una clasificacióón de las n de las interrupciones, atendiendo a la fuente que las produce.interrupciones, atendiendo a la fuente que las produce.

InterrupcionInterrupcion softwaresoftware, se produce cuando un usuario solicita , se produce cuando un usuario solicita una llamada del sistema.una llamada del sistema.Interrupciones hardwareInterrupciones hardware, son causadas cuando un , son causadas cuando un dispositivo hardware requiere la atencidispositivo hardware requiere la atencióón de la CPU para que n de la CPU para que se ejecute su manejador.se ejecute su manejador.ExcepcionesExcepciones, son interrupciones causadas por la propia CPU, , son interrupciones causadas por la propia CPU, cuando ocurre algcuando ocurre algúún suceso, por ejemplo una divisin suceso, por ejemplo una divisióón por cero.n por cero.

(c) ULPGC 3

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 4

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 5

Interrupciones Software gráfico

S – SelectorD – DesplazamientoA – AtributosB – BaseL - Limite

EAXEBXECX...CSFLG

TSSDescriptor 1

Descriptor 2

Descriptor 3

Descriptor n

Descriptor

LDT

system_call:save_allcall sys_openrestore_all

sys_open

MEMORIANÚCLEO

Base

Limite

Desplazamiento

+S D AS D AS D A

S D AS D AS D AS D A

S D A255

80

33

210

IDT

INT

B LIDTR

B L AB L AB L A

B L AB L AB L AB L A

B L A

GDT

B LGDTR

df = open(ficheor, modo);open – libcINT 80

TR

LDTR

(c) ULPGC(c) ULPGC 66

sys_callsys_call

Se llama a una función que implementa la llamada al sistema.

Se recupera el estado de la máquina con los valores guardados en el stack para reanudar el proceso que se interrumpió.

Guardar el estado del procesador, registros Guardar el estado del procesador, registros internos, en el internos, en el stackstack se va a asignar la CPU se va a asignar la CPU a otro procesoa otro proceso..

SAVE_ALLSAVE_ALL

CALL CALL SYS_XXXSYS_XXX

RESTORE_ALLRESTORE_ALL

(c) ULPGC(c) ULPGC 77

System_callSystem_callENTRY(system_callENTRY(system_call))/* /* el primer argumento de el primer argumento de system_callsystem_call es el nes el núúmero de la llamada al sistemamero de la llamada al sistema* a invocar; se indicar* a invocar; se indicaráá en el registro EAX.en el registro EAX.* * System_callSystem_call permite hasta cuatro argumentos mas que serpermite hasta cuatro argumentos mas que seráán pasados an pasados a* lo largo de la llamada al sistema. Uno de los argumentos pued* lo largo de la llamada al sistema. Uno de los argumentos puede sere ser* un puntero a una estructura */* un puntero a una estructura */

244244 ENTRY(system_callENTRY(system_call))245245 pushlpushl %%eaxeax # save # save orig_eaxorig_eax

/* /* SAVE_ALLSAVE_ALL hace una copia de todos los registros de la CPU en la pila.hace una copia de todos los registros de la CPU en la pila.* Cualquier funci* Cualquier funcióón de C que sea llamada encontrarn de C que sea llamada encontraráá sus argumentos en sus argumentos en •• la pila porque la pila porque SAVE_ALLSAVE_ALL los pone alllos pone allíí */*/

246246 SAVE_ALLSAVE_ALL

(c) ULPGC(c) ULPGC 88

System_callSystem_call/* Comprueba si la llamada al sistema esta haciendo una traza. A/* Comprueba si la llamada al sistema esta haciendo una traza. Algunoslgunos* programas permiten hacer trazas en las llamadas al sistema co* programas permiten hacer trazas en las llamadas al sistema como unamo una* herramienta para curiosos o para obtener informaci* herramienta para curiosos o para obtener informacióón extra de depuracin extra de depuracióón */n */247247 GET_THREAD_INFO(%ebpGET_THREAD_INFO(%ebp))248248 # system call tracing in o# system call tracing in operationperation249249 testbtestb

$(_$(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_flags(%ebpTIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_flags(%ebp))250250jnzjnz syscall_trace_entrysyscall_trace_entry

/* /* Compara si el numero de la llamada al sistema (EAX) excede del nCompara si el numero de la llamada al sistema (EAX) excede del numeroumero* m* mááximo de llamadas al sistema */ximo de llamadas al sistema */251251 cmplcmpl $($(nr_syscallsnr_syscalls), %), %eaxeax252252 jaejae syscall_badsyssyscall_badsys

(c) ULPGC(c) ULPGC 99

System_callSystem_call/* Llama a la funci/* Llama a la funcióón del sistema. n del sistema. Sys_call_tableSys_call_table es una tabla de punteros a funciones es una tabla de punteros a funciones

del ndel núúcleo que implementan las llamadas al sistema. cleo que implementan las llamadas al sistema. */*/

/* El segundo conjunto de par/* El segundo conjunto de parééntesis en la lntesis en la líínea nea contiene tres argumentos:contiene tres argumentos:

* la direcci* la direccióón base del vector, n base del vector, * el * el ííndice (EAX, el numero de la llamada al sistema), ndice (EAX, el numero de la llamada al sistema), * y la escala o numero de * y la escala o numero de bytesbytes en cada elemento del en cada elemento del

vector. */vector. */

253253 syscall_callsyscall_call::254254 call *sys_call_table(,%eax,4)call *sys_call_table(,%eax,4)

(c) ULPGC(c) ULPGC 1010

System_callSystem_call/* La etiqueta /* La etiqueta restore_allrestore_all es el punto de salida para es el punto de salida para

system_callsystem_call. . * Su contenido es simple como la macro * Su contenido es simple como la macro

RESTORE_ALLRESTORE_ALL, que , que * recupera los argumentos guardados por * recupera los argumentos guardados por SAVE_ALLSAVE_ALL

y retorna y retorna * al llamador del * al llamador del system_callsystem_call. */. */

263263 restore_allrestore_all::264264 RESTORE_ALLRESTORE_ALL

(c) ULPGC(c) ULPGC 1111

System_callSystem_call/* Comprueba si no existe trabajo pendiente *//* Comprueba si no existe trabajo pendiente */276276 movlmovl TI_flags(%ebpTI_flags(%ebp), %), %ecxecx277277 andlandl $_TIF_WORK_MASK, %$_TIF_WORK_MASK, %ecxecx # is there any work to be done other# is there any work to be done other278278 # than # than syscallsyscall tracing?tracing?279279 jzjz restore_allrestore_all/* Comprueba si se tiene que volver a asignar la CPU *//* Comprueba si se tiene que volver a asignar la CPU */280280 testbtestb $_TIF_NEED_RESCHED, %$_TIF_NEED_RESCHED, %clcl281281 jnzjnz work_reschedwork_resched282282/* Comprueba si tiene se/* Comprueba si tiene seññales pendientes y vuelve al modo nales pendientes y vuelve al modo núúcleo modo virtual */cleo modo virtual */283283 work_notifysigwork_notifysig: # deal with pending signals and: # deal with pending signals and284284 # notify# notify--resume requestsresume requests285285 testltestl $VM_MASK, $VM_MASK, EFLAGS(%espEFLAGS(%esp))286286 movlmovl %%espesp, %, %eaxeax287287 jnejne work_notifysig_v86 # returning to kernelwork_notifysig_v86 # returning to kernel--space orspace or288288 # vm86# vm86--spacespace/* Comprueba si existe trabajo pendiente *//* Comprueba si existe trabajo pendiente */289289 xorlxorl %%edxedx, %, %edxedx290290 call call do_notify_resumedo_notify_resume291291 jmpjmp restore_allrestore_all292292

(c) ULPGC(c) ULPGC 1212

System_callSystem_call/* Si retornamos a modo virtual llamamos a /* Si retornamos a modo virtual llamamos a save_v86save_v86__statestate */*/294294 work_notifysig_v86:work_notifysig_v86:295295 pushlpushl %%ecxecx # save # save ti_flagsti_flags for for do_notify_resumedo_notify_resume296296 call save_v86_state # %call save_v86_state # %eaxeax contains contains pt_regspt_regs pointerpointer297297 poplpopl %%ecxecx298298 movlmovl %%eaxeax, %, %espesp299299 xorlxorl %%edxedx, %, %edxedx300300 call call do_notify_resumedo_notify_resume301301 jmpjmp restore_allrestore_all302302/* Punto de entrada /* Punto de entrada si la llamada al sistema del proceso actualsi la llamada al sistema del proceso actual* esta haciendo una traza */* esta haciendo una traza */303303 # perform # perform syscallsyscall exit tracingexit tracing304304 ALIGNALIGN305305 syscall_trace_entrysyscall_trace_entry::306306 movlmovl $$--ENOSYS,EAX(%espENOSYS,EAX(%esp))307307 movlmovl %%espesp, %, %eaxeax308308 xorlxorl %%edx,%edxedx,%edx309309 call call do_syscall_tracedo_syscall_trace310310 movlmovl ORIG_EAX(%espORIG_EAX(%esp), %), %eaxeax311311 cmplcmpl $($(nr_syscallsnr_syscalls), %), %eaxeax312312 jnaejnae syscall_callsyscall_call313313 jmpjmp syscall_exitsyscall_exit314314315315 # perform # perform syscallsyscall exit tracingexit tracing

(c) ULPGC(c) ULPGC 1313

System_callSystem_call316316 ALIGNALIGN/* comprueba si hay trabajo pendiente si se vuelve del modo traz/* comprueba si hay trabajo pendiente si se vuelve del modo traza */a */317317 syscall_exit_worksyscall_exit_work::318318 testbtestb

$(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP), $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP), %%clcl

319319 jzjz work_pendingwork_pending/* /* HabilitaHabilita laslas interrupcionesinterrupciones */*/320320 stisti # could let # could let do_syscall_tracedo_syscall_trace() call() call321321 # schedule() instead# schedule() instead322322 movlmovl %%espesp, %, %eaxeax323323 movlmovl $1, %$1, %edxedx/* se llama al modo traza *//* se llama al modo traza */324324 call call do_syscall_tracedo_syscall_trace/* se vuelve al modo usuario *//* se vuelve al modo usuario */325325 jmpjmp resume_userspaceresume_userspace326326327327 ALIGNALIGN

(c) ULPGC(c) ULPGC 1414

System_callSystem_call/* si se produce un error guardar el estado, obtener la /* si se produce un error guardar el estado, obtener la

informaciinformacióónn* del hilo y volver al espacio de usuario */* del hilo y volver al espacio de usuario */328328 syscall_faultsyscall_fault::329329 pushlpushl %%eaxeax # save # save orig_eaxorig_eax330330 SAVE_ALLSAVE_ALL331331 GET_THREAD_INFO(%ebpGET_THREAD_INFO(%ebp))332332 movlmovl $$--EFAULT,EAX(%espEFAULT,EAX(%esp))333333 jmpjmp resume_userspaceresume_userspace334334335335 ALIGNALIGN/* si la llamada no es correcta volver al espacio de usuario *//* si la llamada no es correcta volver al espacio de usuario */336336 syscall_badsyssyscall_badsys::337337 movlmovl $$--ENOSYS,EAX(%espENOSYS,EAX(%esp))338338 jmpjmp resume_userspaceresume_userspace339339

(c) ULPGC(c) ULPGC 1515

posiciones de los registros en posiciones de los registros en enen el el stackstackDDespuespuéés de volver de una llamada, muchos procedimientos necesitan estas de volver de una llamada, muchos procedimientos necesitan esta informaciinformacióón en n en el el stackstack..El registro EBX contiene la variable El registro EBX contiene la variable ““currentcurrent”” la direccila direccióón que apunta a la entrada en la tabla n que apunta a la entrada en la tabla de procesos del proceso que realiza la llamada.de procesos del proceso que realiza la llamada.

66 66 67 CF_MASK = 0x0000000167 CF_MASK = 0x0000000168 IF_MASK = 0x0000020068 IF_MASK = 0x0000020069 NT_MASK = 0x0000400069 NT_MASK = 0x0000400070 VM_MASK = 0x0002000070 VM_MASK = 0x0002000071 71 72 /*72 /*73 * these are offsets into the task73 * these are offsets into the task--structstruct..74 */74 */75 state = 075 state = 076 flags = 476 flags = 477 77 sigpendingsigpending = 8= 878 78 addr_limitaddr_limit = 12= 1279 79 exec_domainexec_domain = 16= 1680 80 need_reschedneed_resched = 20= 20

51 EBX = 0x0051 EBX = 0x0052 ECX = 0x0452 ECX = 0x0453 EDX = 0x0853 EDX = 0x0854 ESI = 0x0C54 ESI = 0x0C55 EDI = 0x1055 EDI = 0x1056 EBP = 0x1456 EBP = 0x1457 EAX = 0x1857 EAX = 0x1858 DS = 0x1C58 DS = 0x1C59 ES = 0x2059 ES = 0x2060 60 ORIG_EAXORIG_EAX = 0x24= 0x2461 EIP = 0x2861 EIP = 0x2862 CS = 0x2C62 CS = 0x2C63 EFLAGS = 0x3063 EFLAGS = 0x3064 OLDESP = 0x3464 OLDESP = 0x3465 OLDSS = 0x3865 OLDSS = 0x38

(c) ULPGC(c) ULPGC 1616

SAVE_ALLSAVE_ALL#define SAVE_ALL #define SAVE_ALL

cldcld; ; pushlpushl %%eses; ; pushlpushl %%dsds; ; pushlpushl %%eaxeax; ; pushlpushl %%ebpebp; ; pushlpushl %%ediedi; ; pushlpushl %%esiesi; ; pushlpushl %%edxedx; ; pushlpushl %%ecxecx; ; pushlpushl %%ebxebx; ; movlmovl $(__$(__USER_DS),%edxUSER_DS),%edx; ; movlmovl %dx%dx,,%ds%ds; ; movlmovl %dx%dx,,%es%es;;

(c) ULPGC(c) ULPGC 1717

RESTORE_ALLRESTORE_ALL(RECUPERA EL ESTADO DEL PROCESO INTERRUMPIDO)(RECUPERA EL ESTADO DEL PROCESO INTERRUMPIDO)

9999 #define RESTORE_INT_REGS #define RESTORE_INT_REGS \\100100 poplpopl %%ebxebx; ; \\101101 poplpopl %%ecxecx; ; \\102102 poplpopl %%edxedx; ; \\103103 poplpopl %%esiesi; ; \\104104 poplpopl %%ediedi; ; \\105105 poplpopl %%ebpebp; ; \\106106 poplpopl %%eaxeax107107108108 #define RESTORE_REGS #define RESTORE_REGS \\109109 RESTORE_INT_REGS; RESTORE_INT_REGS; \\110110 1: 1: poplpopl %%dsds; ; \\111111 2: 2: poplpopl %%eses; ; \\112112 .section ..section .fixup,"axfixup,"ax"; "; \\113113 3: 3: movlmovl $0,(%esp); $0,(%esp); \\114114 jmpjmp 1b; 1b; \\115115 4: 4: movlmovl $0,(%esp); $0,(%esp); \\116116 jmpjmp 2b; 2b; \\117117 .previous; .previous; \\

(c) ULPGC(c) ULPGC 1818

RESTORE_ALLRESTORE_ALL

125 #define RESTORE_ALL 125 #define RESTORE_ALL 126 RESTORE_REGS 126 RESTORE_REGS 127 127 addladdl $4, %$4, %espesp; ; 128 1: 128 1: iretiret; ; 129 .section .129 .section .fixup,"axfixup,"ax"; "; 130 2: 130 2: stisti; ; 131 131 movlmovl $(__USER_DS), %$(__USER_DS), %edxedx; ; 132 132 movlmovl %%edxedx, %, %dsds; ; 133 133 movlmovl %%edxedx, %, %eses; ; 134 134 movlmovl $11,%eax; $11,%eax; 135 call 135 call do_exitdo_exit; ; 136 .previous; 136 .previous; 137 .section __137 .section __ex_table,"aex_table,"a";";138 .align 4; 138 .align 4; 139 .long 1b,2b; 139 .long 1b,2b; 140 .140 .previousprevious141 141

(c) ULPGC(c) ULPGC 1919

SYS_CALL_TABLESYS_CALL_TABLE 11. . Tabla con todas la funciones que tratan las llamadas al sistema.Tabla con todas la funciones que tratan las llamadas al sistema.

578578 ENTRY(sys_call_tableENTRY(sys_call_table))579579 .long .long sys_restart_syscallsys_restart_syscall /* 0 /* 0 -- old "setup()" system call, old "setup()" system call,

used for restarting */used for restarting */580580 .long .long sys_exitsys_exit581581 .long .long sys_forksys_fork582582 .long .long sys_readsys_read583583 .long .long sys_writesys_write584584 .long .long sys_opensys_open /* 5 *//* 5 */585585 .long .long sys_closesys_close586586 .long .long sys_waitpidsys_waitpid587587 .long .long sys_creatsys_creat588588 .long .long sys_linksys_link589589 .long .long sys_unlinksys_unlink /* 10 *//* 10 */590590 .long .long sys_execvesys_execve

(c) ULPGC(c) ULPGC 2020

SYS_CALL_TABLESYS_CALL_TABLE 22591591 .long .long sys_chdirsys_chdir592592 .long .long sys_timesys_time593593 .long .long sys_mknodsys_mknod594594 .long .long sys_chmodsys_chmod /* 15 *//* 15 */595595 .long sys_lchown16.long sys_lchown16596596 .long .long sys_ni_syscallsys_ni_syscall /* old break /* old break syscallsyscall holder */holder */597597 .long .long sys_statsys_stat598598 .long .long sys_lseeksys_lseek599599 .long .long sys_getpidsys_getpid /* 20 *//* 20 */600600 .long .long sys_mountsys_mount601601 .long .long sys_oldumountsys_oldumount602602 .long sys_setuid16.long sys_setuid16603603 .long sys_getuid16.long sys_getuid16604604 .long .long sys_stimesys_stime /* 25 *//* 25 */605605 .long .long sys_ptracesys_ptrace606606 .long .long sys_alarmsys_alarm……

(c) ULPGC(c) ULPGC 2121

SYS_CALL_TABLESYS_CALL_TABLE 33853853 .long .long sys_mbindsys_mbind854854 .long .long sys_get_mempolicysys_get_mempolicy855855 .long .long sys_set_mempolicysys_set_mempolicy856856 .long .long sys_mq_opensys_mq_open857857 .long .long sys_mq_unlinksys_mq_unlink858858 .long .long sys_mq_timedsendsys_mq_timedsend859859 .long .long sys_mq_timedreceivesys_mq_timedreceive /* 280 *//* 280 */860860 .long .long sys_mq_notifysys_mq_notify861861 .long .long sys_mq_getsetattrsys_mq_getsetattr862862 .long .long sys_ni_syscallsys_ni_syscall /* reserved for /* reserved for kexeckexec */*/863863 .long .long sys_waitidsys_waitid864864 .long .long sys_ni_syscallsys_ni_syscall /* 285 */ /* available *//* 285 */ /* available */865865 .long .long sys_add_keysys_add_key866866 .long .long sys_request_keysys_request_key867867 .long .long sys_keyctlsys_keyctl868868869869 syscall_table_sizesyscall_table_size=(.=(.--sys_call_tablesys_call_table))

(c) ULPGC(c) ULPGC 2222

Excepciones (1)Excepciones (1)Son interrupciones producidas por la propia CPU Son interrupciones producidas por la propia CPU cuando se producen ciertas situaciones como cuando se producen ciertas situaciones como divisidivisióón por cero, desbordamiento del n por cero, desbordamiento del stackstack, fallo de , fallo de ppáágina etc.gina etc.Como todas las interrupciones el nComo todas las interrupciones el núúcleo realiza los cleo realiza los siguientes pasos:siguientes pasos:

1. Guardar el estado del proceso en el 1. Guardar el estado del proceso en el stackstack..pushlpushl, , pushlpushl,,……

2. Llamar la funci2. Llamar la funcióón manejadora de la excepcin manejadora de la excepcióón.n.callcall ……

3. Recuperar el estado de la funci3. Recuperar el estado de la funcióón.n.pop, pop, pop, pop, ……

(c) ULPGC(c) ULPGC 2323

Excepciones (2)Excepciones (2)Cuando se produce una excepciCuando se produce una excepcióón, la propia CPU realiza una instruccin, la propia CPU realiza una instruccióón n de interrupcide interrupcióón INT 0xNN para saltar dentro de la tabla IDT (tabla de n INT 0xNN para saltar dentro de la tabla IDT (tabla de descriptores de segmento de interrupciones) en la posicidescriptores de segmento de interrupciones) en la posicióón NN.n NN.

En esta posiciEn esta posicióón se encuentra un selector a la GDT (tabla global de n se encuentra un selector a la GDT (tabla global de descriptores de segmento) y un desplazamiento para alcanzar la ddescriptores de segmento) y un desplazamiento para alcanzar la direcciireccióón n dentro del ndentro del núúcleo de la funcicleo de la funcióón (punto de entrada en el nn (punto de entrada en el núúcleo) que hay cleo) que hay que ejecutar cuando se produce esta excepcique ejecutar cuando se produce esta excepcióón.n.

(c) ULPGC(c) ULPGC 2424

Excepciones (3)Excepciones (3)

excepciones

syscall 0x80

S D A

S D A

S D A

S D A

S D A

S D A

S D A

S D A255

32

2

1

0

B L

IDTR

idt_table

S: selector o indiceD: desplazamientoA: atributosB: baseL: límite

(c) ULPGC(c) ULPGC 2525

Excepciones (4)Excepciones (4)378378 ENTRY(divide_errorENTRY(divide_error))379379 pushlpushl $0 # no error $0 # no error codecode380380 pushlpushl $do_divide_error$do_divide_error381381 ALIGNALIGN382382 error_codeerror_code::383383 pushlpushl %%dsds384384 pushlpushl %%eaxeax385385 xorlxorl %%eaxeax, %, %eaxeax386386 pushlpushl %%ebpebp387387 pushlpushl %%ediedi388388 pushlpushl %%esiesi389389 pushlpushl %%edxedx390390 decldecl %%eaxeax # # eaxeax = = --11391391 pushlpushl %%ecxecx392392 pushlpushl %%ebxebx393393 cldcld394394 movlmovl %%eses, %, %ecxecx

(c) ULPGC(c) ULPGC 2626

Excepciones (5)Excepciones (5)/* almacenar la direcci/* almacenar la direccióón de la funcin de la funcióón que atiende la excepcin que atiende la excepcióón en n en

el registro el registro ediedi */*/395395 movlmovl ES(%espES(%esp), %), %ediedi # get the function address# get the function address396396 movlmovl ORIG_EAX(%espORIG_EAX(%esp), %), %edxedx # get the error code# get the error code397397 movlmovl %%eaxeax, , ORIG_EAX(%espORIG_EAX(%esp))398398 movlmovl %ecx%ecx, ES(, ES(%esp%esp))

/* preparar registros de la CPU para realizar la llamada *//* preparar registros de la CPU para realizar la llamada */399399 movlmovl $(__$(__USER_DSUSER_DS), ), %ecx%ecx400400 movlmovl %ecx%ecx, , %ds%ds401401 movlmovl %ecx%ecx, , %es%es402402 movlmovl %%esp,%eaxesp,%eax # # pt_regspt_regs pointerpointer

/* llamada a la funci/* llamada a la funcióón que atiende la excepcin que atiende la excepcióón */n */403403 callcall **%edi%edi

(c) ULPGC(c) ULPGC 2727

Excepciones (6)Excepciones (6)

/* recuperar el proceso interrumpido *//* recuperar el proceso interrumpido */404404 jmpjmp ret_from_exceptionret_from_exception405405

Veamos como se recupera el estado del proceso interrumpido en Veamos como se recupera el estado del proceso interrumpido en una excepciuna excepcióón: n:

159159 ret_from_exceptionret_from_exception::/* /* desabilitadesabilita interrupciones interrupciones preempt_stoppreempt_stop se define como se define como clicli */*/160160 preempt_stoppreempt_stop161161 ret_from_intrret_from_intr::162162 GET_THREAD_INFO(%ebpGET_THREAD_INFO(%ebp))163163 movlmovl EFLAGS(%espEFLAGS(%esp), %), %eaxeax # mix EFLAGS and CS# mix EFLAGS and CS164164 movbmovb CS(%espCS(%esp), %al), %al

(c) ULPGC(c) ULPGC 2828

Excepciones (7)Excepciones (7)/* si es necesario volver al modo n/* si es necesario volver al modo núúcleo */cleo */165165 testltestl $(VM_MASK | 3), %$(VM_MASK | 3), %eaxeax166166 jzjz resume_kernelresume_kernel # returning to kernel or vm86# returning to kernel or vm86--spacespace

167167 ENTRY(resume_userspaceENTRY(resume_userspace))168168 clicli # make sure we don't miss an interr# make sure we don't miss an interruptupt169169 # setting # setting need_reschedneed_resched or or sigpendingsigpending170170 # between sampling and # between sampling and the the iretiret171171 movlmovl TI_flags(%ebpTI_flags(%ebp), %), %ecxecx172172 andlandl $_TIF_WORK_MASK, %$_TIF_WORK_MASK, %ecxecx # is there any work to be done on# is there any work to be done on173173 # # intint/exception return?/exception return?174174 jnejne work_pendingwork_pending

/* salta a recuperar el estado del proceso interrumpido *//* salta a recuperar el estado del proceso interrumpido */175175 jmpjmp restore_allrestore_all

(c) ULPGC(c) ULPGC 2929

Excepciones (8)Excepciones (8)Veamos el resto de puntos de entrada en el nVeamos el resto de puntos de entrada en el núúcleo de las excepciones.cleo de las excepciones.

406406 ENTRY(coprocessor_errorENTRY(coprocessor_error))407407 pushlpushl $0$0408408 pushlpushl $$do_coprocessor_errordo_coprocessor_error409409 jmpjmp error_codeerror_code410410411411 ENTRY(simd_coprocessor_errorENTRY(simd_coprocessor_error))412412 pushlpushl $0$0413413 pushlpushl $$do_simd_coprocessor_errordo_simd_coprocessor_error414414 jmpjmp error_codeerror_code

(c) ULPGC(c) ULPGC 3030

Excepciones (9)Excepciones (9)511511 ENTRY(int3)ENTRY(int3)512512 pushlpushl $$--1 # mark this as an 1 # mark this as an intint513513 SAVE_ALLSAVE_ALL514514 xorlxorl %%edx,%edxedx,%edx # zero error code# zero error code515515 movlmovl %%esp,%eaxesp,%eax # # pt_regspt_regs pointerpointer516516 call do_int3call do_int3517517 testltestl %%eax,%eaxeax,%eax518518 jnzjnz restore_allrestore_all519519 jmpjmp ret_from_exceptionret_from_exception520520521521 ENTRY(overflowENTRY(overflow))522522 pushlpushl $0$0523523 pushlpushl $$do_overflowdo_overflow524524 jmpjmp error_codeerror_code525525526526 ENTRY(boundsENTRY(bounds))527527 pushlpushl $0$0528528 pushlpushl $$do_boundsdo_bounds529529 jmpjmp error_codeerror_code530530531531 ENTRY(invalid_opENTRY(invalid_op))532532 pushlpushl $0$0533533 pushlpushl $$do_invalid_opdo_invalid_op534534 jmpjmp error_codeerror_code

(c) ULPGC(c) ULPGC 3131

Excepciones (10)Excepciones (10)541541 ENTRY(invalid_TSSENTRY(invalid_TSS))542542 pushlpushl $$do_invalid_TSSdo_invalid_TSS543543 jmpjmp error_codeerror_code544544545545 ENTRY(segment_not_presentENTRY(segment_not_present))546546 pushlpushl $$do_segment_not_presentdo_segment_not_present547547 jmpjmp error_codeerror_code548548553553 ENTRY(general_protectionENTRY(general_protection))554554 pushlpushl $$do_general_protectiondo_general_protection555555 jmpjmp error_codeerror_code556556/* punto de entrada cuando se produce un fallo de p/* punto de entrada cuando se produce un fallo de páágina, esto es la CPU gina, esto es la CPU

necesita datos y no estnecesita datos y no estáán en memoria principal y necesita traerlos de n en memoria principal y necesita traerlos de memoria segundaria */ memoria segundaria */

561561 ENTRY(page_faultENTRY(page_fault))562562 pushlpushl $$do_page_faultdo_page_fault563563 jmpjmp error_codeerror_code564564