Principper for Samtidighed og Styresystemer - Interrupts
Principper for Samtidighed og Styresystemer - Interrupts
Principper for Samtidighed og Styresystemer - Interrupts
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