07.04.2014 Views

Principper for Samtidighed og Styresystemer - Interrupts

Principper for Samtidighed og Styresystemer - Interrupts

Principper for Samtidighed og Styresystemer - Interrupts

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Principper</strong> <strong>for</strong> <strong>Samtidighed</strong> <strong>og</strong> <strong>Styresystemer</strong><br />

<strong>Interrupts</strong><br />

René Rydhof Hansen<br />

APR 2009<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 1 / 19


Mini-projekt<br />

Udleveres torsdag 23 APR 2009 kl. 12:00.<br />

Afleveres fredag 29 MAJ 2009 kl. 12:00.<br />

Følgende <strong>for</strong>elæsninger <strong>og</strong> øvelser er aflyst til <strong>for</strong>del <strong>for</strong> arbejde med<br />

mini-projektet:<br />

Forelæsning <strong>og</strong> øvelse torsdag 23 APR 2009.<br />

Øvelse tirsdag 28 APR 2009.<br />

Forelæsning <strong>og</strong> øvelse torsdag 30 APR 2009.<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 2 / 19


Opgaver<br />

Processorspecifikke mutex-instruktioner<br />

Låste sider (MMU)<br />

Tilgangstid (cache vs. primær lager)<br />

Processorspecifikke caches<br />

∗ Detaljeret beskrivelse af hukommelsestilgang<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 3 / 19


Result af Popup Test #1<br />

For nem<br />

For kort<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 4 / 19


Mål<br />

At kunne redegøre <strong>for</strong> brugen af “user-” <strong>og</strong> “kernelmode”.<br />

At kunne definere <strong>og</strong> redegøre <strong>for</strong> generering <strong>og</strong> håndtering af<br />

“exceptions” (herunder interrupts).<br />

At kunne redegøre <strong>for</strong> <strong>for</strong>skellige <strong>for</strong>mer <strong>for</strong> I/O (herunder<br />

interruptstyret).<br />

At kunne redegøre <strong>for</strong> håndtering af systemkald.<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 5 / 19


Part II<br />

<strong>Interrupts</strong><br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 6 / 19


User- <strong>og</strong> Kernelmode<br />

Behov <strong>for</strong> at sikre dele af styresystemet mod “andre”<br />

Husk: styresystem mappet ind øverst i process-hukommelse<br />

Sikring af priviligerede instruktioner<br />

Instruktioner der kan påvirke andre processer negativt<br />

Standsning af processoren, mode-change, deaktivering af interrupts, . . .<br />

User-mode: til “almindelige” pr<strong>og</strong>rammer<br />

Kernel-mode: til styresystemet<br />

Hvordan skiftes mode?<br />

Example (Pentium)<br />

Fire modes (kaldet rings): 0–3. Windows <strong>og</strong> Linux bruger kun de to.<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 7 / 19


2009-05-05<br />

<strong>Interrupts</strong><br />

User- <strong>og</strong> Kernel-mode<br />

User- <strong>og</strong> Kernelmode<br />

User- <strong>og</strong> Kernelmode<br />

Behov <strong>for</strong> at sikre dele af styresystemet mod “andre”<br />

Husk: styresystem mappet ind øverst i process-hukommelse<br />

Sikring af priviligerede instruktioner<br />

Instruktioner der kan påvirke andre processer negativt<br />

Standsning af processoren, mode-change, deaktivering af interrupts, . . .<br />

User-mode: til “almindelige” pr<strong>og</strong>rammer<br />

Kernel-mode: til styresystemet<br />

Hvordan skiftes mode?<br />

Example (Pentium)<br />

Fire modes (kaldet rings): 0–3. Windows <strong>og</strong> Linux bruger kun de to.<br />

• Mode-skift v.hj.a. exception fx ved at udføre “illegal” instruktion som halt<br />

• Hvad kan/skal man bruge mere end to modes til?


Exceptions<br />

Exceptions genereres af CPU’en som følge af en hændelse i eller<br />

uden<strong>for</strong> CPU’en<br />

Eksempler<br />

Faults<br />

Division by zero<br />

Brug af illegale instruktioner<br />

Utilstrækkelige rettigheder<br />

Traps<br />

Software interrupts/trap instruktioner fx INT<br />

<strong>Interrupts</strong><br />

Exceptions genereret af hardwaren (uden<strong>for</strong> CPU’en)<br />

<strong>Interrupts</strong> er, i reglen, u<strong>for</strong>udsigelige<br />

Afbryder det kørende pr<strong>og</strong>ram <strong>og</strong> aktiverer en “interrupt service<br />

routine” i styresystemet<br />

Kan deaktiveres med en særlig instruktion<br />

Bruges til I/O uden polling<br />

Processkifte kan aktiveres af timerinterrupt<br />

Hardware kan signalere fejlsituationer<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 8 / 19


2009-05-05<br />

<strong>Interrupts</strong><br />

Exceptions<br />

Exceptions<br />

Exceptions<br />

Exceptions genereres af CPU’en som følge af en hændelse i eller<br />

uden<strong>for</strong> CPU’en<br />

Eksempler<br />

Faults<br />

Division by zero<br />

Brug af illegale instruktioner<br />

Utilstrækkelige rettigheder<br />

Traps<br />

Software interrupts/trap instruktioner fx INT<br />

<strong>Interrupts</strong><br />

Exceptions genereret af hardwaren (uden<strong>for</strong> CPU’en)<br />

<strong>Interrupts</strong> er, i reglen, u<strong>for</strong>udsigelige<br />

Afbryder det kørende pr<strong>og</strong>ram <strong>og</strong> aktiverer en “interrupt service<br />

routine” i styresystemet<br />

Kan deaktiveres med en særlig instruktion<br />

Bruges til I/O uden polling<br />

Processkifte kan aktiveres af timerinterrupt<br />

Hardware kan signalere fejlsituationer<br />

• Ofte: ingen klar skelnen mellem exceptions, interrupts <strong>og</strong> faults<br />

• Exceptions tillader user-mode at kommunikere med kernel-mode<br />

– Primær(t) kontrol-kommunikation<br />

– Data udveksles via shared memory<br />

• Som regel: et lille antal <strong>for</strong>skellige exceptions (kendt på <strong>for</strong>hånd)<br />

• <strong>Interrupts</strong> deaktiveres fx <strong>for</strong> at beskytte en interrupt handler (så den ikke<br />

afbrydes af et tilsvarende interrupt)


Exceptions<br />

Medfører kald af en exception<br />

handler<br />

Pr<strong>og</strong>ramtæller <strong>og</strong><br />

statusregisteret gemmes på<br />

stakken<br />

Pr<strong>og</strong>ramtælleren sættes til<br />

adresssen på exception<br />

handleren<br />

Kernen skifter til kerne-mode<br />

Yderligere in<strong>for</strong>mation gemmes<br />

Nuværende processor mode<br />

In<strong>for</strong>mationer om hvad der<br />

udløste denne exception<br />

Exception vektor<br />

Tabel med adresser på<br />

exception handlere<br />

Initialiseres af styresystemet<br />

save pr<strong>og</strong>ram<br />

counter and<br />

status register<br />

load pr<strong>og</strong>ram<br />

counter from exception<br />

vector<br />

switch processor<br />

to kernel mode<br />

use pr<strong>og</strong>ram<br />

counter to fetch<br />

next instruction<br />

exception<br />

vector<br />

exception<br />

handler<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 9 / 19


2009-05-05<br />

<strong>Interrupts</strong><br />

Exceptions<br />

Exceptions<br />

Exceptions<br />

Medfører kald af en exception<br />

handler<br />

Pr<strong>og</strong>ramtæller <strong>og</strong><br />

statusregisteret gemmes på<br />

stakken<br />

save pr<strong>og</strong>ram<br />

Pr<strong>og</strong>ramtælleren sættes til counter and<br />

adresssen på exception<br />

status register<br />

handleren<br />

Kernen skifter til kerne-mode load pr<strong>og</strong>ram<br />

Yderligere in<strong>for</strong>mation gemmes counter from exception<br />

vector<br />

Nuværende processor mode<br />

In<strong>for</strong>mationer om hvad der switch processor<br />

udløste denne exception to kernel mode<br />

Exception vektor<br />

Tabel med adresser på<br />

use pr<strong>og</strong>ram<br />

exception handlere<br />

counter to fetch<br />

Initialiseres af styresystemet next instruction<br />

exception<br />

vector<br />

exception<br />

handler<br />

• Exceptions der ikke er genereret af et interrupt opstår (som regel) på<br />

veldefinerede steder i en process’ udførsel<br />

• Exception handleren opfattes som en del af den udløsende tråd<br />

– Der skiftes ikke til en speciel kerne-tråd el. lign.<br />

– Exception handleren er, konceptuelt, et funktionskald (jvf. systemkald<br />

• Exception vektor giver et begrænset antal “indgange” ind i kernen <strong>for</strong><br />

user-mode processer<br />

– Nemmere at implementere <strong>og</strong> kontrollere<br />

– Sikrer, at kun særlig kode udføres i kerne-mode


Instruction fetch-løkke med interrupts<br />

1 Kopier instruktionen givet ved pr<strong>og</strong>ramtælleren til<br />

instruktionsregisteret<br />

2 Inkrementer pr<strong>og</strong>ramtælleren<br />

3 Afkod instruktionen<br />

4 Hent operander<br />

5 Udfør instruktionen<br />

6 Gem resulatet <strong>og</strong> opdater statusregisteret<br />

7 Hvis interrupts ikke er aktiveret: goto 1<br />

8 Hvis der ikke er udestående interrupts: goto 1<br />

9 Gem pr<strong>og</strong>ramtæller <strong>og</strong> statusregister på stakken<br />

10 Udløs interruptnummer: i<br />

11 Brug interruptvektor til at opdatere pr<strong>og</strong>ramtæller: ivec[i]<br />

12 Deaktiver interrupts (hvad med re-aktivering?)<br />

13 Skift til kerne-mode<br />

14 goto 1<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 10 / 19


2009-05-05<br />

<strong>Interrupts</strong><br />

Exceptions<br />

Instruction fetch-løkke med interrupts<br />

Instruction fetch-løkke med interrupts<br />

1 Kopier instruktionen givet ved pr<strong>og</strong>ramtælleren til<br />

instruktionsregisteret<br />

2 Inkrementer pr<strong>og</strong>ramtælleren<br />

3 Afkod instruktionen<br />

4 Hent operander<br />

5 Udfør instruktionen<br />

6 Gem resulatet <strong>og</strong> opdater statusregisteret<br />

7 Hvis interrupts ikke er aktiveret: goto 1<br />

8 Hvis der ikke er udestående interrupts: goto 1<br />

9 Gem pr<strong>og</strong>ramtæller <strong>og</strong> statusregister på stakken<br />

10 Udløs interruptnummer: i<br />

11 Brug interruptvektor til at opdatere pr<strong>og</strong>ramtæller: ivec[i]<br />

12 Deaktiver interrupts (hvad med re-aktivering?)<br />

13 Skift til kerne-mode<br />

14 goto 1<br />

• <strong>Interrupts</strong> er (som regel) u<strong>for</strong>udsigelige <strong>og</strong> genereret uden<strong>for</strong> CPU’en (i<br />

modsætning til “almindelige” exceptions)<br />

• Giver anledning til en interrupt exception<br />

• Skal håndteres specielt i “ifetch”-løkken da de ikke (nødvendigvis) opstår<br />

som en del af den kørende process’ udførsel<br />

• Et interrupt håndteres af en tilsvarende Interrupt Service Routine (ISR)<br />

• Interruptvektor gemmer startadresse på tilhørende ISR<br />

• Speciel instruktion til retur fra ISR (Pentium: IRET); genetablerer status fr<br />

før kald herunder re-aktivering af interrupts


Interrupt Service Routine (ISR)<br />

pc<br />

sp<br />

r 1<br />

.<br />

psw<br />

r 10<br />

4287<br />

start<br />

push reg’s<br />

pop,restore<br />

return<br />

bruger<br />

proces<br />

ISR<br />

stak<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 11 / 19


Interrupt Service Routine (ISR)<br />

pc<br />

sp<br />

r 1<br />

.<br />

psw<br />

r 10<br />

4287<br />

start<br />

push reg’s<br />

pop,restore<br />

return<br />

psw ∗<br />

pc(4287)<br />

bruger<br />

proces<br />

ISR<br />

stak<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 11 / 19


Interrupt Service Routine (ISR)<br />

pc<br />

sp<br />

r 1<br />

.<br />

psw<br />

r 10<br />

4287<br />

start<br />

push reg’s<br />

pop,restore<br />

return<br />

r 10<br />

.<br />

r 1<br />

psw ∗<br />

pc(4287)<br />

bruger<br />

proces<br />

ISR<br />

stak<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 11 / 19


Interrupt Service Routine (ISR)<br />

pc<br />

sp<br />

r 1<br />

.<br />

psw ∗<br />

r 10<br />

4287<br />

start<br />

push reg’s<br />

pop,restore<br />

return<br />

bruger<br />

proces<br />

ISR<br />

stak<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 11 / 19


<strong>Interrupts</strong><br />

Interruptdeling<br />

Nødvendigt <strong>for</strong>di interrupts er en meget begrænset ressource<br />

Bruges når flere enheder deler samme interrupt<br />

Kræver at ISR kan identificere kilden til interruptet<br />

Chain of responsibility pattern<br />

Prioriterede interrupts<br />

ISR kan afbrydes af interrupts med højere prioritet<br />

Nyttigt?<br />

Hvad kan man bruge interrupts til?<br />

Example (Pentium)<br />

Interrupt multiplexing med on-CPU PIC (Pr<strong>og</strong>rammable Interrupt<br />

Controller).<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 12 / 19


2009-05-05<br />

<strong>Interrupts</strong><br />

Exceptions<br />

<strong>Interrupts</strong><br />

<strong>Interrupts</strong><br />

Interruptdeling<br />

Nødvendigt <strong>for</strong>di interrupts er en meget begrænset ressource<br />

Bruges når flere enheder deler samme interrupt<br />

Kræver at ISR kan identificere kilden til interruptet<br />

Chain of responsibility pattern<br />

Prioriterede interrupts<br />

ISR kan afbrydes af interrupts med højere prioritet<br />

Nyttigt?<br />

Hvad kan man bruge interrupts til?<br />

Example (Pentium)<br />

Interrupt multiplexing med on-CPU PIC (Pr<strong>og</strong>rammable Interrupt<br />

Controller).<br />

• <strong>Interrupts</strong> kan bruges til at implementere I/O uden brug af polling<br />

• På Pentium styres interrupt prioriteter af PIC’en


Input/Output (I/O)<br />

Kommunikation med eksterne enheder<br />

Eget I/O adresserum<br />

Port baseret I/O<br />

Kræver specielle instruktioner til læsning <strong>og</strong> skrivning<br />

Porte kan beskyttes i user-mode med permission bits<br />

Delt adresserum<br />

Afbildet i samme adresserum som memory<br />

Kræver ingen specielle instruktioner<br />

Memory-mapped I/O<br />

Adresser <strong>for</strong> primærlager<br />

Adresser <strong>for</strong> I/O<br />

Ubrugte adresser<br />

Example (Pentium)<br />

Bruger permission bit map til at afgøre om en given port er tilgængelig i<br />

user mode.<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 13 / 19


Typer af I/O<br />

Pr<strong>og</strong>rammeret I/O<br />

Shared memory: bruger to words i hukommelsen: et til dataregister <strong>og</strong><br />

et til kontrol-/status-register<br />

Dataregisteret benyttes til udveksling af data<br />

Status- eller kontrolregisteret benyttes til at synkronisere<br />

CPU’en <strong>for</strong>etager kopiering af data<br />

<strong>Interrupts</strong>tyret I/O<br />

Enheden genererer interrupt når data er klar<br />

ISR ansvarlig <strong>for</strong> at flytte data ud eller ind i dataregisteret<br />

Polling kan undgås<br />

Processoren er stadig ansvarlig <strong>for</strong> kopiering af data<br />

Direct Memory Access (DMA)<br />

I/O uddelegeres til en DMA-kontroller<br />

Har adgang til adresse- <strong>og</strong> databussen<br />

Interrupt udløses når I/O operationen er fuldført<br />

Aflaster processoren<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 14 / 19


Systemkald<br />

Hvordan kan processer interagere med styresystemet når de<br />

ikke kan skrive til styresystemets hukommelse<br />

ikke kan udføre kald til styresystemets kode<br />

ikke kan skifte processoren til kerne-mode<br />

Exceptions er den eneste måde at udløse et skift fra user-mode til<br />

kerne-mode<br />

Processoren har instruktioner til at udløse traps<br />

Kaldes <strong>og</strong>så “software interrupts”<br />

Kan bruges til at skifte til kerne-mode <strong>og</strong> aktivere styresystemet<br />

Example (Pentium)<br />

INT instruktionen udløser en interrupt exception. På Linux bruges<br />

exception 0x80 til systemkald.<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 15 / 19


Systemkald<br />

Styresystemets “værktøjskasse” <strong>og</strong>/eller interface til<br />

(system-)pr<strong>og</strong>rammører<br />

Systemkald implementeres ved at udløse en trap (fx INT-instruktion<br />

på Pentium)<br />

N<strong>og</strong>le arkitekturer har en specialiseret instruktion til systemkald<br />

Systemkald er nummererede<br />

CPU register bruges til at udpege den ønskede funktion<br />

Parametre overføres via registre enten direkte eller indirekte som en<br />

adresse der peger på en parameterblok<br />

Kernen skal validere alle parametre<br />

Pointere: skal pege på hukommelse der må tilgås af processen<br />

Pentium har særlige instruktioner til validering (VERR <strong>og</strong> VERW)<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 16 / 19


2009-05-05<br />

<strong>Interrupts</strong><br />

Systemkald<br />

Systemkald<br />

Systemkald<br />

Styresystemets “værktøjskasse” <strong>og</strong>/eller interface til<br />

(system-)pr<strong>og</strong>rammører<br />

Systemkald implementeres ved at udløse en trap (fx INT-instruktion<br />

på Pentium)<br />

N<strong>og</strong>le arkitekturer har en specialiseret instruktion til systemkald<br />

Systemkald er nummererede<br />

CPU register bruges til at udpege den ønskede funktion<br />

Parametre overføres via registre enten direkte eller indirekte som en<br />

adresse der peger på en parameterblok<br />

Kernen skal validere alle parametre<br />

Pointere: skal pege på hukommelse der må tilgås af processen<br />

Pentium har særlige instruktioner til validering (VERR <strong>og</strong> VERW)<br />

• Systemkald tilbyder services:<br />

– Oprettelse af vinduer (på OS’er med indbygget GUI)<br />

– Adgang til filsystem(er), netværk, mus, ...<br />

• Eftersom kernen kan tilgå al hukommelse skal systemkaldsparametre der<br />

består af pointere til proceshukommelse valideres inden brug<br />

• VERR <strong>og</strong> VERW verificerer om et givent kald til hhv. READ eller WRITE ville<br />

være legalt i user-mode


Systemkald<br />

User pr<strong>og</strong>ram<br />

API call<br />

User-mode API library<br />

Set up params.<br />

System call<br />

Return result<br />

Kernel<br />

validate params.<br />

Find and call<br />

correct routine<br />

Return result<br />

System call table<br />

Call implementation<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 17 / 19


Systemkald<br />

User pr<strong>og</strong>ram<br />

API call<br />

User-mode API library<br />

Set up params.<br />

System call<br />

Return result<br />

Kernel<br />

validate params.<br />

Find and call<br />

correct routine<br />

Return result<br />

System call table<br />

Call implementation<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 17 / 19


Systemkald<br />

User pr<strong>og</strong>ram<br />

API call<br />

User-mode API library<br />

Set up params.<br />

System call<br />

Return result<br />

Kernel<br />

validate params.<br />

Find and call<br />

correct routine<br />

Return result<br />

System call table<br />

Call implementation<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 17 / 19


Systemkald<br />

User pr<strong>og</strong>ram<br />

API call<br />

User-mode API library<br />

Set up params.<br />

System call<br />

Return result<br />

Kernel<br />

validate params.<br />

Find and call<br />

correct routine<br />

Return result<br />

System call table<br />

Call implementation<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 17 / 19


Systemkald<br />

User pr<strong>og</strong>ram<br />

API call<br />

User-mode API library<br />

Set up params.<br />

System call<br />

Return result<br />

Kernel<br />

validate params.<br />

Find and call<br />

correct routine<br />

Return result<br />

System call table<br />

Call implementation<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 17 / 19


Systemkald<br />

User pr<strong>og</strong>ram<br />

API call<br />

User-mode API library<br />

Set up params.<br />

System call<br />

Return result<br />

Kernel<br />

validate params.<br />

Find and call<br />

correct routine<br />

Return result<br />

System call table<br />

Call implementation<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 17 / 19


Systemkald<br />

User pr<strong>og</strong>ram<br />

API call<br />

User-mode API library<br />

Set up params.<br />

System call<br />

Return result<br />

Kernel<br />

validate params.<br />

Find and call<br />

correct routine<br />

Return result<br />

System call table<br />

Call implementation<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 17 / 19


Systemkald<br />

User pr<strong>og</strong>ram<br />

API call<br />

User-mode API library<br />

Set up params.<br />

System call<br />

Return result<br />

Kernel<br />

validate params.<br />

Find and call<br />

correct routine<br />

Return result<br />

System call table<br />

Call implementation<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 17 / 19


Opgaver<br />

Processorspecifikke mutex-instruktioner<br />

Låste sider (MMU)<br />

Tilgangstid (cache vs. primær lager)<br />

Processorspecifikke caches<br />

∗ Detaljeret beskrivelse af hukommelsestilgang<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 18 / 19


Opsummering <strong>og</strong> næste gang<br />

Exceptions<br />

<strong>Interrupts</strong><br />

I/O<br />

Systemkald<br />

Næste gang<br />

Processer <strong>og</strong> tråde, tilstandmodel, oprettelse <strong>og</strong> nedlæggelse,<br />

implementering<br />

Processer <strong>og</strong> tråde i Linux<br />

Scheduling-politikker<br />

PSS’09 (Forelæsning 10) <strong>Interrupts</strong> APR 2009 19 / 19

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!