1 System Call ancora Vediamo passo passo come funziona una SC
2 Text Data Stack Area vuota Traduzione in assembler delle funzioni che compongono il programma Variabili globali Pila di FRAME, uno per ogni chiamata di funzione da cui non abbiamo ancora fatto ritorno Spazio di indirizzamento Come è organizzata la memoria accessibile ad un programma in esecuzione ?
3 Come funziona lo stack
4 Possibile allocazione del codice (parte testo) in RAM RAM CALL Fun1 main program Fun1 … CALL Fun2 … Fun2 RETURN
5 Possibile allocazione dello stack RAM CALL Fun1 main Fun1 … CALL Fun2 … Fun2 RETURN indirizzi Contenuto iniziale SP
6 Situazione iniziale processore RAM CALL Fun1 main F1 … CALL Fun2 … F2 RETURN indirizzi Contenuto iniziale SP 4000 PC SP RAM indirizzi Proc
7 Sto per eseguire: CALL RAM CALL Fun1 … CALL Fun2 … RETURN indirizzi Contenuto iniziale SP 4101 PC SP RAM indirizzi Proc
8 Ho eseguito: CALL RAM CALL Fun1 … CALL Fun2 … RETURN indirizzi Contenuto iniziale SP 4500 PC SP RAM indirizzi Proc 4101
9 Sto per eseguire:CALL RAM CALL Fun1 Fun1 … CALL Fun2 … Fun2 RETURN indirizzi Contenuto iniziale SP 4601 PC SP RAM indirizzi Proc 4101
10 RAM CALL Fun1 Fun1 … CALL Fun2 … Fun2 RETURN indirizzi Contenuto iniziale SP PC SP RAM indirizzi Proc Ho eseguito:
11 Fun2 termina: sto per eseguire RAM CALL Fun1 Fun1 … CALL Fun2 … Fun2 RETURN indirizzi Contenuto iniziale SP PC SP RAM indirizzi Proc
12 Ho eseguito: RAM CALL Fun1 Fun1 … CALL Fun2 … Fun2 RETURN indirizzi Contenuto iniziale SP 4601 PC SP RAM indirizzi Proc 4101
13 Sto per eseguire: CALL RAM CALL Fun1 Fun1 … CALL Fun2 … Fun2 RETURN indirizzi Contenuto iniziale SP 4651 PC SP RAM indirizzi Proc 4101
14 RAM CALL Fun1 Fun1 … CALL Fun2 … Fun2 RETURN indirizzi Contenuto iniziale SP PC SP RAM indirizzi Proc Ho eseguito: CALL
15 Fun2 termina: sto per eseguire RAM CALL Fun1 Fun1 … CALL Fun2 … Fun2 RETURN indirizzi Contenuto iniziale SP PC SP RAM indirizzi Proc
16 Ho RAM CALL Fun1 Fun1 … CALL Fun2 … Fun2 RETURN indirizzi Contenuto iniziale SP 4651 PC SP RAM indirizzi Proc 4101
17 Fun1 termina: sto per eseguire RAM CALL Fun1 Fun1 … CALL Fun2 … Fun2 RETURN indirizzi Contenuto iniziale SP 4701 PC SP RAM indirizzi Proc 4101
18 Ho eseguito: RAM CALL Fun1 Fun1 … CALL Fun2 … Fun2 RETURN indirizzi Contenuto iniziale SP 4101 PC SP RAM indirizzi Proc
19 …e i parametri? I parametri possono essere passati in vario modo –registri generali (convenzione fra chiamante e chiamato) –memoria centrale –stack (più comune)
20 Chiamata sto per eseguire RAM Fun1 Fun2 RETURN … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP 4598 PC SP RAM indirizzi Proc
21 Chiamata sto per eseguire RAM Fun1 Fun2 RETURN … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP 4599 PC SP RAM indirizzi Proc par1
22 Chiamata sto per eseguire RAM Fun1 Fun2 RETURN … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP 4600 PC SP RAM indirizzi Proc par1 par2
23 Chiamata sto per eseguire RAM Fun1 Fun2 RETURN … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP 4601 PC SP RAM indirizzi Proc par1 par2 par3
24 Chiamata ho eseguito RAM Fun1 Fun2 RETURN … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP PC SP RAM indirizzi Proc par1 par2 par3 4601
25 Chiamata sto per eseguire RAM … Fun1 Fun2 RETURN … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP PC SP RAM indirizzi Proc par1 par2 par3 4601
26 Chiamata ho eseguito RAM … Fun1 Fun2 RETURN … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP 4601 PC SP RAM indirizzi Proc par1 par2 par3
27 Chiamata elimino il RAM … Fun1 Fun2 RETURN … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 ADD #3 SP indirizzi Contenuto iniziale SP 4602 PC SP RAM indirizzi Proc
28 …e le variabili locali ? I compilatori di molti linguaggi (es C) allocano le variabili locali (cioè quelle "definite ed usabili solo dentro” la funzione) sulla pila –vengono allocate con delle PUSH all’inizio –vengono rimosse prima di uscire vediamo un semplice esempio...
29 Chiamata sto per eseguire RAM … Fun1 Fun2 … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP 4598 PC SP RAM indirizzi Proc PUSH i PUSH j ADD #2 SP RETURN
30 Chiamata ho eseguito RAM Fun1 Fun2 … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP PC SP RAM indirizzi Proc par1 par2 par PUSH i PUSH j ADD #2 SP RETURN
31 Esecuzione ho eseguito RAM Fun1 Fun2 … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP PC SP RAM indirizzi Proc par1 par2 par PUSH i PUSH j ADD #2 SP RETURN i
32 Esecuzione ho eseguito RAM Fun1 Fun2 … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP PC SP RAM indirizzi Proc par1 par2 par PUSH i PUSH j ADD #2 SP RETURN i j
33 Esecuzione sto per eseguire RAM Fun1 Fun2 … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP PC SP RAM indirizzi Proc par1 par2 par PUSH i PUSH j ADD #2 SP RETURN i j
34 Esecuzione ho eseguito RAM Fun1 Fun2 … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 indirizzi Contenuto iniziale SP PC SP RAM indirizzi Proc par1 par2 par PUSH i PUSH j ADD #2 SP RETURN
35 Esecuzione ho eseguito RAM Fun1 Fun2 … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 ADD #3 SP indirizzi Contenuto iniziale SP 4601 PC SP RAM indirizzi Proc par1 par2 par3 PUSH i PUSH j ADD #2 SP RETURN
36 Chiamata elimino il RAM … Fun1 Fun2 RETURN … PUSH par1 PUSH par2 PUSH par3 CALL Fun2 ADD #3 SP indirizzi Contenuto iniziale SP 4602 PC SP RAM indirizzi Proc
37 Come avviene una system call
PC SP RGen PSW DisabIntKernel-User Mode RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi
PC SP RGen PSW DisabIntKernel-User Mode RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Spazio indirizzamento di B testo dati stack
PC SP RGen PSW DisabIntKernel-User Mode ProcessControlBlock di B ProcessIdentifier (pid) Stato Priorita Program Counter Registri Generali SP PSW Informazioni memoria (es. Base, Limite) Kernel stack Informazioni sui file in uso Stato system call in esecuzione RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi
PC SP RGen PSW DisabIntKernel-User Mode ProcessControlBlock di B Stato = RUNNING Program Counter = ?? Registri Generali = ?? SP = ?? PSW = ?? Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB
42 Chiamata a read(fd, buffer, nbytes) Spazio kernel (sistema op.) Spazio utente DISPATCH System Call Handler Smistatore (dispatch) Gestore della chiamata di sistema Tabella di corrispondenza Codice della funzione di libreria read() Codice della chiamata a read() da parte del programma utente Incrementa SP (Stack Pointer) CALL read Push di fd Push di &buffer Push di nbyte RETURN (ritorno al programma chiamante) TRAP al kernel Metti il codice della read() nel registro 0 AddrMax
43 Spazio kernel (sistema op.) Spazio utente DISPATCH System Call Handler Codice della funzione di libreria read() Codice della chiamata a read() da parte del programma utente Incrementa SP (Stack Pointer) CALL read Push di fd Push di &buffer Push di nbyte RETURN (ritorno al programma chiamante) TRAP al kernel Metti il codice della read() nel registro 1,2,3 read(fd, buffer, nbytes) (2) Passi 1,2,3 : si ricopia il valore dei parametri sullo stack 0 AddrMax
PC SP RGen PSW DisabIntKernel-User Mode ProcessControlBlock di B Stato = RUNNING Program Counter = ?? Registri Generali = ?? SP = ?? PSW = ?? Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB
PC SP RGen PSW DisabIntKernel-User Mode RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Stack Utente di B stack nbytes &buffer fd Kernel Stack ProcB
46 Spazio kernel (sistema op.) Spazio utente DISPATCH System Call Handler Codice della funzione di libreria read() Codice della chiamata a read() da parte del programma utente Incrementa SP (Stack Pointer) CALL read Push di fd Push di &buffer Push di nbyte RETURN (ritorno al programma chiamante) TRAP al kernel Metti il codice della read() nel registro 4 read(fd, buffer, nbytes) (3) Passo 4 : chiamata di read() –salto alla prima istruzione di read() + push indirizzo di ritorno (X) sullo stack 0 AddrMax X
PC SP RGen PSW DisabIntKernel-User Mode Dopo esecuzione Stato = RUNNING Program Counter = ?? Registri Generali = ?? SP = ?? PSW = ?? Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB
PC SP RGen PSW DisabIntKernel-User Mode RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Stack Utente di B stack nbytes &buffer fd Kernel Stack ProcB 8404
49 Spazio kernel (sistema op.) Spazio utente DISPATCH System Call Handler Codice della funzione di libreria read() Codice della chiamata a read() da parte del programma utente Incrementa SP (Stack Pointer) CALL read Push di fd Push di &buffer Push di nbyte RETURN (ritorno al programma chiamante) TRAP al kernel Metti il codice della read() nel registro Rx 5 read(fd, buffer, nbytes) (4) Passo 5 : Inizia l’esecuzione della read() : –caricamento del codice della system call in un registro fissato Rx 0 AddrMax X
PC SP RGen PSW DisabIntKernel-User Mode Inserisco il codice della read (25) in un registro generale fissato Stato = RUNNING Program Counter = ?? Registri Generali = ?? SP = ?? PSW = ?? Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx
51 Spazio kernel (sistema op.) Spazio utente DISPATCH System Call Handler Codice della funzione di libreria read() Codice della chiamata a read() da parte del programma utente Incrementa SP (Stack Pointer) CALL read Push di fd Push di &buffer Push di nbyte RETURN (ritorno al programma chiamante) TRAP al kernel Metti il codice della read() nel registro 6 read(fd, buffer, nbytes) (5) Passo 6 : Esecuzione TRAP –passaggio in kernel mode, disabilita le interruzioni, salva PC sullostack, salto al codice dello smistatore 0 AddrMax X Y
PC SP RGen PSW DisabIntKernel-User Mode TRAP: (hw) Disabilita le interruzioni Stato = RUNNING Program Counter = ?? Registri Generali = ?? SP = ?? PSW = ?? Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx
PC SP RGen PSW DisabIntKernel-User Mode TRAP: (hw) Salva PC / PSW sullo stack Stato = RUNNING Program Counter = ?? Registri Generali = ?? SP = ?? PSW = ?? Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx
PC SP RGen PSW DisabIntKernel-User Mode RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Stack Utente di B stack nbytes &buffer fd Kernel Stack ProcB 8404 UsrPSW 9002
PC SP RGen PSW DisabIntKernel-User Mode TRAP: (hw) Salta al dispatcher in kernel mode Stato = RUNNING Program Counter = ?? Registri Generali = ?? SP = ?? PSW = ?? Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx
56 Spazio kernel (sistema op.) Spazio utente DISPATCH System Call Handler Codice della funzione di libreria read() Codice della chiamata a read() da parte del programma utente Incrementa SP (Stack Pointer) CALL read Push di fd Push di &buffer Push di nbyte RETURN (ritorno al programma chiamante) TRAP al kernel Metti il codice della read() nel registro 7-8 read(fd, buffer, nbytes) (6) Passo7-8: Seleziona la SC secondo il codice in Rx, salva stato processore nella tabella dei processi, assegna a SP indirizzo della kernel stack, riabilita interruzioni, esegui codice handler 0 AddrMax X Y
PC SP RGen PSW DisabIntKernel-User Mode Dispatcher: (ASS) Salva PC/PSW nel PCB, POP sulla pila utente (incrementa SP) Stato = RUNNING Program Counter = 9002 Registri Generali = ?? SP = ?? PSW = userPSW Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx
PC SP RGen PSW DisabIntKernel-User Mode RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Stack Utente di B stack nbytes &buffer fd Kernel Stack ProcB 8404
PC SP RGen PSW DisabIntKernel-User Mode Dispatcher: (ASS) Salva SP e Registri Gen nel PCB Stato = RUNNING Program Counter = 9002 Registri Generali = 25,RGen SP = PSW = userPSW Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx
PC SP RGen PSW DisabIntKernel-User Mode Dispatcher: (ASS) Prepara kernel stack e riabilita interruzioni Stato = RUNNING Program Counter = 9002 Registri Generali = 25,RGen SP = PSW = userPSW Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx
PC SP RGen PSW DisabIntKernel-User Mode Dispatcher: (ASS) Seleziona la SC (25) e salta al codice del gestore (indirizzo TabSC[25]=2100) Stato = RUNNING Program Counter = 9002 Registri Generali = 25,RGen SP = PSW = userPSW Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx TabellaSC Codice gestore
PC SP RGen PSW DisabIntKernel-User Mode Gestore: esegue azioni richieste dalla SC Stato = RUNNING Program Counter = 9002 Registri Generali = 25,RGen SP = PSW = userPSW Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB XX Rx TabellaSC Codice gestore
63 Spazio kernel (sistema op.) Spazio utente DISPATCH System Call Handler Codice della funzione di libreria read() Codice della chiamata a read() da parte del programma utente Incrementa SP (Stack Pointer) CALL read Push di fd Push di &buffer Push di nbyte RETURN (ritorno al programma chiamante) TRAP al kernel Metti il codice della read() nel registro 9 read(fd, buffer, nbytes) (7) Passo 9 : Ritorno alla funzione di libreria –disabilita interruzioni, ripristina user mode, ripristina stato processore, carica PC con l’indirizzo dell’istruzione successiva alla TRAP (Y), riabilita interruzioni 0 AddrMax X Y
PC SP RGen PSW DisabIntKernel-User Mode Gestore: (ASS) Disabilita interruzioni, Ripristina stack utente, Stato = RUNNING Program Counter = 9002 Registri Generali = 25,RGen SP = PSW = userPSW Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB XX Rx TabellaSC Codice gestore
PC SP RGen PSW DisabIntKernel-User Mode Gestore: (ASS) Ricarica registri processore Stato = RUNNING Program Counter = 9002 Registri Generali = 25,RGen SP = PSW = userPSW Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx TabellaSC Codice gestore
PC SP RGen PSW DisabIntKernel-User Mode Gestore: (hw) Ricarica PC-PSW, modalità utente riabilita interruzioni Stato = RUNNING Program Counter = 9002 Registri Generali = 25,RGen SP = PSW = userPSW Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx TabellaSC Codice gestore
67 Spazio kernel (sistema op.) Spazio utente DISPATCH System Call Handler Codice della funzione di libreria read() Codice della chiamata a read() da parte del programma utente Incrementa SP (Stack Pointer) CALL read Push di fd Push di &buffer Push di nbyte RETURN (ritorno al programma chiamante) TRAP al kernel Metti il codice della read() nel registro 10 read(fd, buffer, nbytes) (8) Passi : Ritorno al codice utente (nel modo usuale) –PC = X, SP viene incrementato per eliminare il frame della read() 0 AddrMax 11 X
PC SP RGen PSW DisabIntKernel-User Mode ProcessoB: esegue Stato = RUNNING Program Counter = 9002 Registri Generali = 25,RGen SP = PSW = userPSW Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx TabellaSC Codice gestore
PC SP RGen PSW DisabIntKernel-User Mode RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Stack Utente di B stack nbytes &buffer fd Kernel Stack ProcB
PC SP RGen PSW DisabIntKernel-User Mode ProcessoB: libera la pila Stato = RUNNING Program Counter = 9002 Registri Generali = 25,RGen SP = PSW = userPSW Informazioni memoria (Base, Limite) = 8000,4000 Kernel stack = 15000,1000 Stato SC = ?? RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Kernel Stack ProcB 25 Rx TabellaSC Codice gestore
PC SP RGen PSW DisabIntKernel-User Mode RAM Dispatcher Processo A Processo B Processo C Base Limite 100 SOentry Tabella dei processi Stack Utente di B stack Kernel Stack ProcB
72 Fine!