: Ydre enheder og multiprogrammer Forår 2003 Jørgen Sværke Hansen Planen for idag Samspil mellem CPU og ydre enheder: Generelt Kontrolregistre Afbrydelser Specifikt for Alpha AXP (kernemaskinerne) Multiprogrammering: Eksplicit I/O Implicit I/O 2 CPU cache lager Systemarkitektur disk I/O bro hukommelsesbus netkort I/O bus skærm Kontrol af ydre enheder De ydre enheder styres af styreenheder (eng.: controllers) Styreenhederne er 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 3 4 Synkronisering mellem styreenhed og CPU Hvordan opdager CPU ændringer i kontrolregistre: Aktiv venten (eng.: polling): En venteløkke, hvor CPU hele tiden er indhold af kontrolregister Afbrydelser: Styreenhed signalerer til CPU at der er sket ændringer i kontrolregistre Synkronisering ved aktiv venten Synkronisering sker via to bit: ready og start ready - ændres af styreenhed og es 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 es 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) 5 6 1
Udskrivning af på seriel Kontrolregistre på UART 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 Transmit Holding Data Register ST-ordrer Udes bit for bit Centralenhed (CPU) Fælles registre Styreenhed (UART) LD-ordrer Sættes når enheden er klar Line Status Control Register 7 8 Data bus drivers and registers Handshaking logic UART en tæt på Serial communications interface Interrupt request Read Write Status register Control register Data in buffer register 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 Data in shift register Serial input Programstump for aktiv venten CPU 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 Address decoder Address (from bus) Chip Select Data out buffer register Clock Data out shift register Serial output 9 while ((rdio(com1lsr) & 0x20) == 0) // venteløkke /* tom */; // gennemløbes 107000 gange/ wrio(com1thr, *p); // skriv næste til UART 10 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 på seriel Eller via alm. instruktioner gennem specielt lagerområde (lagerafbildet I/O): stl r1, 0x8580007FA0 # Alpha AXP 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 11 12 2
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 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) 13 14 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 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 15 16 Udsnit af lagerorganisering på Alphamaskinerne 0x0000.0000 0x0010.0000 0x0020.0000 0x0030.0000 0x80.0000.0000 0x85.8000.0000 0x85.FFFF.FFFF 1 MB 1 MB 1 MB 29 MB 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 17 CPU cache lager Systemarkitektur afbrydelse disk I/O bro hukommelsesbus netkort I/O bus skærm 18 3
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 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 19 20 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 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) 21 22 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 PAL håndtering af afbrydelse 1. Ved en afbrydelse hoppes til PAL koden på adresse 0x100 2. PAL koden undersøger om afbrydelsen har et tilstrækkeligt højt afbrydelsesniveau: 1. Hvis ikke, returneres uden videre 2. Ellers skiftes til kernetilstand (hvis nødvendigt), og de registre, som afbrydelseshåndteringen påvirker, gemmes på stakken 23 24 4
Stakramme for afbrydelser register a2 register a1 register a0 global pointer gp programtæller pc statusregister ps 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 25 26 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 27 Tegnudskrivning via afbrydelser main() { forbid(); wrio(com1lcr, 0x87); wrio(com1ier, 0x02); // luk for afbrydelser // divisor latch // som forrige eksempel // 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. while (!finished) ; // vent på at vi er færdige wrio(com1ier, 0x00); // luk for afbrydelser fra // UART 28 Afbrydelsesroutinen Vigtigste ydre enheder extern C void KInterruptHandler () { if ((rdio(com1iir) & 6) == 2) { // kvittering if(!finished) wrio(com1thr, *p++); // skriv // if(!*p) finished = 1; 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 29 30 5
Systemkald Multiprogrammering PAL kaldet callsys Kan kun bruges fra brugertilstand, ikke kernetilstand (omvendt privilegeret) Opbygger en stak ramme magen til en afbrydelse Eksplicit ressourcedeling Overlappende ning Implicit ressourcedeling 31 32 Eksplicit ressourcedeling Transaktionssystem: baseret indning while(true) { < () fra terminal 1>; < () fra terminal 2>; < () fra terminal 3>; Terminal 1 Terminal 2 Terminal 3 Pladelager 33 34 Overlappende ning while(true) { if (<terminal 1 klar>) { < næste >; if (<sidste i >) if (<terminal 2 klar>) { < næste >; if (<sidste i >) if (<terminal 3 klar>) { < næste >; if (<sidste i >) 35 Overlappende ning (2) Terminal 1 Terminal 2 Terminal 3 Pladelager 36 6
Overlap ning med besvarelse while(true) { if (ind_1 && <terminal 1 klar>) { < næste >; if (<sidste i >) _1 = TRUE, ind_1 = FALSE; if (_1 && <pladelager klar>) { < næste blok fra pladelager>; if (<post fundet> <sidste blok t>) udskriv_1 = TRUE, _1 = FALSE; if (udskriv_1 && <terminal 1 klar>) { <skriv næste >; if (<sidste i svar>) ind_1 = TRUE, udskriv_1 = FALSE; // det samme for terminal 2 og 3 37 Implicit ressourcedeling Vi vil have multiprogrammer: proces 1 { while (TRUE) { < fra terminal 1>; < er>; proces 2 { while (TRUE) { < fra terminal 2>; < er>; proces 3 { while (TRUE) { < fra terminal 3>; < er>; 38 Proces 1 Proces 2 Proces 3 Multiprogrammeret ssystem CPU klar t CPU klar t CPU klar t Blokerende systemkald sætter proces til at vente, f.eks., fgetc(stdout). Opsummering Ydre enheder: Synkronisering aktiv venten Afbrydelser Hvordan sker det hele på Alpha erne? Multiprogrammering: Eksplicit versus implicit ressourcedeling 39 40 Kilder Disse slides er baseret på KB4: Kapitel 1-3, KB5: Kapitel 2, samt slides fra tidligere foreere på Dat 1F 41 7