Principper for Samtidighed og Styresystemer Kursusgang 12: Device drivere mt@cs.aau.dk Ph.D.-studerende Distribuerede og Indlejrede Systemer Institut for Datalogi Aalborg Universitet 17. maj 2010
Intro Grænseflader Kategorier Interrupts Eksempler Overblik Hvad er en device driver? Overblik over kursusgangen Hvad er en device driver? Grænseflader Kategorier af device drivere i Linux Interrupts Eksempler Diskdriver Virtual File System i Linux Fokus: Monolitisk kerne og i høj grad Linux 2
Intro Grænseflader Kategorier Interrupts Eksempler Overblik Hvad er en device driver? Hvad er en device driver? Software der lader højniveau-software interagere med hardware Styresystemets grænseflade til hardware Fysiske enheder Diskenheder, f.eks. harddiske og DVD-drev Tastatur Grafikkort Netkort Busser, f.eks. PCI, USB og Firewire Virtuelle enheder Filsystemer Pseudo-devices til netværk, f.eks. loopback og bonding/trunk 3
Intro Grænseflader Kategorier Interrupts Eksempler Overblik Hvad er en device driver? Hvad er en device driver? Enten fast del af kernen eller et modul, der kan indsættes og fjernes Hardware tilsluttes og frakobles Kører i kernel mode Effektivitet Adgang til hardware Ingen programbiblioteker, heller ikke C/C++ standard library Ingen garanti om kontekst Ingen hukommelsesbeskyttelse Skal håndtere låsning korrekt (mange faldgrupper) Skal kunne køre på en multiprocessor-maskine Fejl er alvorlige Generelt eneste mulighed for at køre brugerkode i kernel mode 4
Intro Grænseflader Kategorier Interrupts Eksempler Overblik Hvad er en device driver? Placering af koden Ligger i shared kernel area/space Øverste 1 GiB 1 i Linux, øverste 2 GiB i Windows (Figur 8.2 fra English) 1 Gibibyte, dvs. 2 30 byte, http://www.iec.ch/zone/si/si_bytes.htm 5
Intro Grænseflader Kategorier Interrupts Eksempler Overblik Hvad er en device driver? Sprog og stil Drivere skrives typisk i C eller C++ Lavniveau højniveau-sprog Linux-drivere skrives i C Windows giver mulighed for både C og C++ Drivere skrives typisk i en objekt-orienteret stil OO i C: Strukturer med funktionspointere Tænk: Implementation af et driver-interface 6
Intro Grænseflader Kategorier Interrupts Eksempler Overblik K mod US K mod D D mod K Eksempel Grænseflader 7
Intro Grænseflader Kategorier Interrupts Eksempler Overblik K mod US K mod D D mod K Eksempel Kernens grænseflade mod user space Systemkald Hvis man vil lave fundamentale ændringer Kræver tildeling af et systemkaldsnummer Frarådes pga. kobling med systembiblioteket sys call table ikke længere eksporteret Device filer i /dev Character og block devices Major og minor nummer Problemer med tildeling af major nummer devfs (kernel space), udev (user space daemon), devtmpfs 2 Proc-filsystemet i /proc Driveren registrerer filer i proc-filsystemet 2 http://lwn.net/articles/330985/ http://lxr.linux.no/linux+*/drivers/base/devtmpfs.c 8
Intro Grænseflader Kategorier Interrupts Eksempler Overblik K mod US K mod D D mod K Eksempel Kernens grænseflade mod user space 9
Intro Grænseflader Kategorier Interrupts Eksempler Overblik K mod US K mod D D mod K Eksempel Kernens grænseflade mod user space 10
Intro Grænseflader Kategorier Interrupts Eksempler Overblik K mod US K mod D D mod K Eksempel Kernens grænseflade mod driveren Eksempler: Registrering, linux/init.h og linux/fs.h module init(initfn) module exit(exitfn) int register chrdev(unsigned int major, const char *name, const struct file operations *fops) void unregister chrdev(unsigned int major, const char *name) Beskeder til kerneloggen, linux/kernel.h int printk(const char *fmt,...) Hukommelsesallokering, linux/malloc.h void *kmalloc(size t size, int priority) void kfree(void * ptr) På Windows: Windows Driver Model (WDM) Standardiseret interface drivere på tværs af Windows versioner 11
Intro Grænseflader Kategorier Interrupts Eksempler Overblik K mod US K mod D D mod K Eksempel Driverens grænseflade mod kernen Callback til registrerede funktioner Eksempler: Initialisering og oprydning initfn i module init(initfn) exitfn i module exit(exitfn) Filoperationer (struct file operations) int open(struct inode *inode, struct file *file) int release(struct inode *inode, struct file *file) ssize t read(struct file *file, char *buffer, size t length, loff t *offset) ssize t write(struct file *file, const char *buffer, size t length, loff t *offset)... 12
Intro Grænseflader Kategorier Interrupts Eksempler Overblik K mod US K mod D D mod K Eksempel Driverens grænseflade mod kernen (Figur 8.1 fra English) 13
Intro Grænseflader Kategorier Interrupts Eksempler Overblik K mod US K mod D D mod K Eksempel Eksempel: Hello World! 14
Intro Grænseflader Kategorier Interrupts Eksempler Overblik K mod US K mod D D mod K Eksempel Eksempel: Hello World! 15
Intro Grænseflader Kategorier Interrupts Eksempler Character Block Net Eksempel Kategorier af devices i Linux Character devices Block devices Network devices 16
Intro Grænseflader Kategorier Interrupts Eksempler Character Block Net Eksempel Character devices Strøm af tegn Tastatur, mus, konsol/terminal, serielle porte, lydkort,... /dev/null, /dev/zero, /dev/random Grænseflade Filoperationer llseek, read, write, readdir, ioctl, mmap, open, flush, release,... Registreres af modulet register chrdev unregister chrdev Major nummer vælger driver (f.eks. terminaldriveren tty 3 ) Minor nummer vælger enhed (f.eks. terminalen tty42) 3 http://lxr.linux.no/linux+*/drivers/char/tty_io.c 17
Intro Grænseflader Kategorier Interrupts Eksempler Character Block Net Eksempel Block devices Data overføres i et antal blokke af fast størrelse Kø af requests, hvor driveren vælger behandlingsrækkefølgen Mulighed for I/O schedulering Formateres oftest med et filsystem Major og minor nummer ligesom et character device Eksempel: Driveren sd 4 og disken sda 5 Samme grænseflade som et character device Filoperationer register blkdev, unregister blkdev 4 http://lxr.linux.no/linux+*/drivers/scsi/sd.c 5 Prøv ls -l /dev/sd* og dmesg grep sda i en terminal. 18
Intro Grænseflader Kategorier Interrupts Eksempler Character Block Net Eksempel Network devices Næsten som block devices, men skal behandles separat Registrering af init/exit med module_{init,exit}(fn) Ved initialisering: pci_register_driver(&driver) driver er en struct pci_driver name, id_table, probe, remove,... int probe(struct pci_dev *pdev, const struct pci_device_id *id) Opsætning af I/O porte og Direct Memory Access (DMA) Initialisering af pdev Initialisering af private strukturer... meget mere! 19
Intro Grænseflader Kategorier Interrupts Eksempler Character Block Net Eksempel Eksempel: /dev/zero 20
Intro Grænseflader Kategorier Interrupts Eksempler ISR Top Half og Bottom Half Interrupts Tydeligt hvordan processer og kernen får hardware til at arbejde Men hvad så den anden vej? Hvis computeren f.eks. modtager en netværkspakke? Polling Interrupts Normen er interrupt-baseret I/O med prioriteter Computeren har en Programmable Interrupt Controller (PIC) Sørger for at Interrupt Service Routines (ISRs) kaldes 21
Intro Grænseflader Kategorier Interrupts Eksempler ISR Top Half og Bottom Half Interrupt Service Routines (ISRs) Eksempel: 1 Data ankommer til en serielport fra et modem 2 Serielport-hardwaren genererer et interrupt 3 Serielport-driverens ISR bliver kørt og skal sørge for at 1 gemme dataen i en buffer et sted og 2 fortælle serielport-hardwaren, at den skal slukke for interrupt-signalet Udføres i speciel interrupt-kontekst Interrupts uforudsigelige Afbrudte proces ikke nødvendigvis den I/O-initierende proces Ingen antagelser om adresserum Hastigheden er afgørende Interrupts med lavere prioritet er midlertidigt deaktiverede Risiko for tab af data Responstid 22
Intro Grænseflader Kategorier Interrupts Eksempler ISR Top Half og Bottom Half Top Half og Bottom Half Ikke helt fast terminologi vi ser på Linux-verdenen Top Half ISR Foretager kun essentielle ting Schedulerer Bottom Half Bottom Half To typer 1 Kræver proceskontekst 2 Kræver ikke procekontekst Type 1 kaldes Asynchronous Procedure Call (APC) på Windows og skal tilføjes en processpecifik scheduler kø Type 2 kaldes Deferred Procedure Call (DPC) på Windows Bottom Half udføres af scheduleren Må blokere 23
Intro Grænseflader Kategorier Interrupts Eksempler ISR Top Half og Bottom Half Bottom Half eksekvering (Figur 8.6 fra English) 24
Intro Grænseflader Kategorier Interrupts Eksempler Diskdriver Virtual File System i Linux Eksempler Diskdriver Virtual File System i Linux 25
Intro Grænseflader Kategorier Interrupts Eksempler Diskdriver Virtual File System i Linux Diskdriver Mål Så hurtig datagennemstrømning som muligt Fairness Midler til at nå målene Caching af tilgåede diskblokke Brug af fri hukommelse Forsinket skrivning (lazy writing) Valg af hurtig og fair I/O scheduleringsalgoritme Observation: En gammeldags, ikke-ssd harddisk skal bevæge hoveder (søgetid) og plader (latenstid) 26
Intro Grænseflader Kategorier Interrupts Eksempler Diskdriver Virtual File System i Linux I/O schedulering First Come, First Served (FCFS) Fair men dårlig ydelse Closest block first God ydelse men ikke fair Elevatoralgoritmen (SCAN) Skifter kun retning når alle requests i nuværende retning er håndteret Nogenlunde fair, nogenlunde ydelse Cylindre i midten serviceres dobbelt så ofte som inderste/yderste cylindre Den cirkulære elevatoralgoritme (C-SCAN) Skifter ikke retning (springer tilbage) Ens ydelse for alle cylindre 27
Intro Grænseflader Kategorier Interrupts Eksempler Diskdriver Virtual File System i Linux I/O schedulering (Figur 8.13 fra English) Request-følge: 5, 23, 16, 27, 63, 28 15 + 18 + 7 + 11 + 36 + 35 = 122 3 + 4 + 1 + 12 + 11 + 58 = 89 3 + 4 + 1 + 35 + 47 + 11 = 101 28
Intro Grænseflader Kategorier Interrupts Eksempler Diskdriver Virtual File System i Linux Virtual File System i Linux 29
Intro Grænseflader Kategorier Interrupts Eksempler Diskdriver Virtual File System i Linux Virtual File System i Linux open("/mnt/cdrom/dir/foo",...) 30
Intro Grænseflader Kategorier Interrupts Eksempler Opsummering Device drivere indkapsler device-specifik kode Device drivere kan være (og er typisk) moduler Registrering af callback funktioner Interruptbehandling er delt i to I/O schedulering er et trade-off mellem ydelse og fairness Virtual File System i Linux Kilden English : John English, Introduction to Operating Systems, Palgrave Macmillan, 2004. 31