420 likes | 559 Views
Multiprogrammering[1]: Ydre enheder og multiprogrammer. Datalogi 1F: Forår 2003 Jørgen Sværke Hansen cyller@diku.dk. Planen for idag. Samspil mellem CPU og ydre enheder: Generelt Kontrolregistre Afbrydelser Specifikt for Alpha AXP (kernemaskinerne) Multiprogrammering: Eksplicit I/O
E N D
Multiprogrammering[1]:Ydre enheder og multiprogrammer Datalogi 1F: Forår 2003 Jørgen Sværke Hansen cyller@diku.dk
Planen for idag • Samspil mellem CPU og ydre enheder: • Generelt • Kontrolregistre • Afbrydelser • Specifikt for Alpha AXP (kernemaskinerne) • Multiprogrammering: • Eksplicit I/O • Implicit I/O Datalogi 1F: Multiprogrammering[1]
Systemarkitektur CPU cache hukommelsesbus lager I/O bro I/O bus I/O styreenhed disk I/O styreenhed netkort I/O styreenhed skærm Datalogi 1F: Multiprogrammering[1]
Kontrol af ydre enheder • De ydre enheder styres af styreenheder (eng.: controllers) • Styreenhederne udfører kontrolprogram specifikt for en type af ydre enheder • CPU og styreenhed udveksler data som led i kontrol af de ydre enheder • Kommunikationen mellem CPU og ydre enheder foregår via kontrolregistre placeret på styreenheden for den ydre enhed Datalogi 1F: Multiprogrammering[1]
Synkronisering mellem styreenhed og CPU Hvordan opdager CPU ændringer i kontrolregistre: • Aktiv venten (eng.: polling): • En venteløkke, hvor CPU hele tiden læser indhold af kontrolregister • Afbrydelser: • Styreenhed signalerer til CPU at der er sket ændringer i kontrolregistre Datalogi 1F: Multiprogrammering[1]
Synkronisering ved aktiv venten • Synkronisering sker via to bit: ready og start • ready - ændres af styreenhed og læses af CPU • 0 betyder at styreenheden ikke er klar til at modtage nye ordre • 1 betyder at den er klar • start - ændres af CPU og læses af styreenhed: • signal fra CPU om at styreenhed kan påbegynde en operation • Når start sættes, sættes ready til 0 (styreenhed kan ikke modtage en ny ordre) Datalogi 1F: Multiprogrammering[1]
Udskrivning af tegn på seriel linie • Styreenhed er en UART = Universal Asynchronous Receiver-Transmitter • Kontrolregistre: • THR (Transmit Holding data Register): • Fungerer som start men samtidig som data register: • Skrivning igangsætter transmission (latch register) • LSR (Line Status control Register) • Bit 5 svarer til ready fra før Datalogi 1F: Multiprogrammering[1]
Kontrolregistre på UART Datalogi 1F: Multiprogrammering[1]
UART’en – tæt på RESET: LSR<5:5> = 1 repeat repeat until <store til THR> LSR<5:5> = 0 udsend THR bit for bit LSR<5:5> = 1 forever
Programstump for aktiv ventenCPU siden main() { wrio(com1Lcr, 0x87); // choose divisor latch wrio(com1Dlm, 0x00); // set 9600 bps (MSB) wrio(com1Dll, 0x0C); // set 9600 bps (LSB) wrio(com1Lcr, 0x07); // set 8 bit, 2 stop bit wrio(com1Mcr, 0x0F); // set DTR and RTS for(char* p = line; *p; p++) { // indtil ’\0’ while ((rdio(com1Lsr) & 0x20) == 0) // venteløkke /* tom */; // gennemløbes 107000 gange/tegn wrio(com1Thr, *p); // skriv næste tegn til UART } } Datalogi 1F: Multiprogrammering[1]
Adgang til kontrolregistre • Kontrolregistre har en I/O adresse: • COM1 starter ved I/O adresse 0x3F8 • Tilgås enten via specielle I/O instruktioner: • wrio r1, 0x3F8 # skriver tegn på seriel linie • Eller via alm. instruktioner gennem specielt lagerområde (lagerafbildet I/O): • stl r1, 0x8580007FA0 # Alpha AXP Datalogi 1F: Multiprogrammering[1]
Inden vi går videre • Nu bliver det hele lidt mere kernemaskine specifikt – vi skal have lidt AlphaPC164SX information (KB5 – Kapitel 2): • PAL • I/O busser • I/O lagerområder • Afbrydelser • Vigtigste ydre enheder • Systemkald Datalogi 1F: Multiprogrammering[1]
PAL • PAL = Priviliged Architecture Library • Erstatning for nye instruktioner kodet i mikrokode • Bruges også til systemkald • Eksempler: • PAL_halt varmstart af maskinen • PAL_wrent skriv indhopsværdi • PAL_callsys systemkald • PAL_rti retur fra afbrydelse Datalogi 1F: Multiprogrammering[1]
I/O busser i Alpha AXP • ISA (Industry Standard Architecture): • 8 MHz, 16 bit bus, 2 klokcykler per overførsel: • max. 8,33 MB/s • Udvidelse EISA: 32-bit bus • Max. 33 MB/s • PCI (Peripheral Component Interconnection): • I dag den mest almindelige • 33 MHz, 32-bit bredde = max. 132 MB/s • Findes også i 66 MHz og 64 bit udgaver samt PCI-X (533 MHz og 64 bit) Datalogi 1F: Multiprogrammering[1]
I/O lagerområder • CPU adresserer: • Fysisk lager (typisk op til 1 GB) • Ydre enheder (typisk PCI, men også ISA) • Interne registre: • Konfigurering af Alpha’ernes PAL-kode • Adresserum: • 32 bit på Intel PC: (kan udvides til 36-bit) • ”64 bit” på Alpha = 40 bit = rigeligt med plads Datalogi 1F: Multiprogrammering[1]
Adgang til ISA registre • PC • Registrene ligger i de lavere fysiske adresser: kunne adresseres per byte • Alpha164SX: • Et register per 32 byte • Start på adresse: 0x85.8000.0000 • Makroer: wrio() og rdio() • Eksempel: COM1 (0x3F8) får adressen: 0x85.8000.0000 + 0x3F8*0x20 = 0x85.8000.7FA0 Datalogi 1F: Multiprogrammering[1]
Udsnit af lagerorganisering på Alphamaskinerne • PAL-kode + opstartskode • Symbolsk debugger • Dataområde til debugger og kernestak • Frit lager • PCI sparse memory: • Delt lager mellem CPU og ydre enheder • PCI sparse I/O: • kontrolregistre 0x0000.0000 1 MB 0x0010.0000 1 MB 0x0020.0000 1 MB 0x0030.0000 29 MB 0x80.0000.0000 0x85.8000.0000 0x85.FFFF.FFFF Datalogi 1F: Multiprogrammering[1]
afbrydelse Systemarkitektur CPU cache hukommelsesbus lager I/O bro I/O bus I/O styreenhed disk I/O styreenhed netkort I/O styreenhed skærm Datalogi 1F: Multiprogrammering[1]
Afbrydelser på Alpha’erne • 33 afbrydelser i alt: • 16 for ISA • 17 for PCI • Eksempler på ISA afbrydelser: 0 Timer 6 Diskette 1 Tastatur 7 Parallelport 3 COM2 12 Mus 4 COM1 14/15 Harddisk/CDROM Datalogi 1F: Multiprogrammering[1]
Hvornår afbrydes ? • En afbrydelse kan blive genereret af en ydre enhed på et vilkårligt tidspunkt MEN: • Forskellige ydre enheder kan have forskellige tolerancetærskler med hensyn til hvor hurtigt en afbrydelse skal serviceres • CPU’en kan have opgaver, der ikke må afbrydes Datalogi 1F: Multiprogrammering[1]
Niveauer for afbrydelser 0 normal tilstand 3 Ydre enheder, lav prioritet 4 Ydre enheder, høj prioritet 5 ur 6 strømafbrydelse 7 Maskincheck (bruges ikke) Styres af OS med PAL_swpipl men også automatisk ved afbrydelser Datalogi 1F: Multiprogrammering[1]
Tillad/bloker for afbrydelser • Den enkelte ydre enhed kan sættes op til at afbryde eller ej • Ydre enheder bliver ved med at afbryde indtil der kvitteres for afbrydelsen • Når en afbrydelse modtages på niveau i sættes niveauet til i og sættes først ned når afbrydelsen er behandlet • Afbrydelse tillades KUN hvis ydre enhed har højere niveau end det aktuelle • CPU kan blokere for afbrydelser: • PAL_swpipl(7) Datalogi 1F: Multiprogrammering[1]
Installation af afbrydelsesroutine • PAL kaldet PAL_wrint • a0 er adressen for routinen • a1 er typen: 0 ekstern afbrydelse 1 aritmetisk fejl 3 ugyldig ordre 5 systemkald • Eksempel: lda a0, ADDR lda a1, 0 call_pal PAL_wrent Datalogi 1F: Multiprogrammering[1]
PAL håndtering af afbrydelse • Ved en afbrydelse hoppes til PAL koden på adresse 0x100 • PAL koden undersøger om afbrydelsen har et tilstrækkeligt højt afbrydelsesniveau: • Hvis ikke, returneres uden videre • Ellers skiftes til kernetilstand (hvis nødvendigt), og de registre, som afbrydelseshåndteringen påvirker, gemmes på stakken Datalogi 1F: Multiprogrammering[1]
Stakramme for afbrydelser register a2 register a1 register a0 global pointer gp programtæller pc statusregister ps Datalogi 1F: Multiprogrammering[1]
Start af afbrydelsen • ps registeret indeholder kernetilstanden • Bit 3 indikerer kernetilstand • Bit 0-2 indikerer afbrydelsesniveau • gp indeholder kernens global pointer • a2 indeholder afbrydelsestypen 1 periodisk 3 ekstern afbrydelse Datalogi 1F: Multiprogrammering[1]
Afslutning af afbrydelsen • Kvitter for afbrydelsen i den ydre enhed: • Skrivning til kontrolregister • Gælder ikke for uret (sker automatisk) • Udfør kaldet: • call_pal PAL_rti Datalogi 1F: Multiprogrammering[1]
Tegnudskrivning via afbrydelser main() { forbid(); // luk for afbrydelser wrio(com1Lcr, 0x87); // divisor latch …… // som forrige eksempel wrio(com1Ier, 0x02); // set TX empty enable wrent(ent_int, o); // set interrupt entry point p = line, finished = 0; permit(); // åbn for afbrydelser char c=*p++; wrio(com1Thr, c); // skriv 1. tegn while (!finished) ; // vent på at vi er færdige wrio(com1Ier, 0x00); // luk for afbrydelser fra // UART } Datalogi 1F: Multiprogrammering[1]
Afbrydelsesroutinen extern ”C” void KInterruptHandler () { if ((rdio(com1Iir) & 6) == 2) { // kvittering if(!finished) wrio(com1Thr, *p++); // skriv // tegn if(!*p) finished = 1; } } Datalogi 1F: Multiprogrammering[1]
Vigtigste ydre enheder • PC16550 UART (har vi set) • Olicom OC-2173 ISA 10 Mbit/s Ethernetkort • Dallas Semiconductor 1287 TOY/RTC (Time Of Year/Real Time Clock) • Holder styr på klokkeslættet • Genererer automatiske afbrydelser Datalogi 1F: Multiprogrammering[1]
Systemkald • PAL kaldet callsys • Kan kun bruges fra brugertilstand, ikke kernetilstand (omvendt privilegeret) • Opbygger en stak ramme magen til en afbrydelse Datalogi 1F: Multiprogrammering[1]
Multiprogrammering • Eksplicit ressourcedeling • Overlappende læsning • Implicit ressourcedeling Datalogi 1F: Multiprogrammering[1]
Eksplicit ressourcedeling while(true) { <læs linie (transaktion) fra terminal 1>; <udfør transaktion til/fra pladelageret>; <læs linie (transaktion) fra terminal 2>; <udfør transaktion til/fra pladelageret>; <læs linie (transaktion) fra terminal 3>; <udfør transaktion til/fra pladelageret>; } Datalogi 1F: Multiprogrammering[1]
Terminal 1 Terminal 3 Terminal 2 Pladelager Transaktionssystem:liniebaseret indlæsning læs linie læs linie læs linie læs linie udfør trans- aktion udfør trans- aktion udfør trans- aktion Datalogi 1F: Multiprogrammering[1]
Overlappende læsning while(true) { if (<terminal 1 klar>) { <læs næste tegn>; if (<sidste tegn i linie>) <udfør transaktion til/fra pladelageret>; } if (<terminal 2 klar>) { <læs næste tegn>; if (<sidste tegn i linie>) <udfør transaktion til/fra pladelageret>; } if (<terminal 3 klar>) { <læs næste tegn>; if (<sidste tegn i linie>) <udfør transaktion til/fra pladelageret>; } } Datalogi 1F: Multiprogrammering[1]
Terminal 1 Terminal 3 Terminal 2 Pladelager Overlappende læsning (2) læs tegn læs tegn læs tegn læs tegn læs tegn læs tegn læs tegn læs tegn udfør trans- aktion Datalogi 1F: Multiprogrammering[1]
Overlap læsning med besvarelse while(true) { if (indlæs_1 && <terminal 1 klar>) { <læs næste tegn>; if (<sidste tegn i linie>) transaktion_1 = TRUE, indlæs_1 = FALSE; } if (transaktion_1 && <pladelager klar>) { <læs næste blok fra pladelager>; if (<post fundet> || <sidste blok læst>) udskriv_1 = TRUE, transaktion_1 = FALSE; } if (udskriv_1 && <terminal 1 klar>) { <skriv næste tegn>; if (<sidste tegn i svar>) indlæs_1 = TRUE, udskriv_1 = FALSE; } // det samme for terminal 2 og 3 } Datalogi 1F: Multiprogrammering[1]
Implicit ressourcedeling Vi vil have multiprogrammer: proces 1 { while (TRUE) { <læs linie fra terminal 1>; < udfør transaktioner>; } } proces 2 { while (TRUE) { <læs linie fra terminal 2>; < udfør transaktioner>; } } proces 3 { while (TRUE) { <læs linie fra terminal 3>; < udfør transaktioner>; } } Datalogi 1F: Multiprogrammering[1]
tegn klar tegn klar tegn klar CPU CPU CPU tegn læst tegn læst tegn læst Multiprogrammeret transaktionssystem • Blokerende systemkald sætter proces til at vente, f.eks., fgetc(stdout). Proces 1 Proces 2 Proces 3 Datalogi 1F: Multiprogrammering[1]
Opsummering • Ydre enheder: • Synkronisering • aktiv venten • Afbrydelser • Hvordan sker det hele på Alpha’erne? • Multiprogrammering: • Eksplicit versus implicit ressourcedeling Datalogi 1F: Multiprogrammering[1]
Kilder • Disse slides er baseret på KB4: Kapitel 1-3, KB5: Kapitel 2, samt slides fra tidligere forelæsere på Dat 1F Datalogi 1F: Multiprogrammering[1]