Device driver
1
Gebruiker afschermen van de hardware
Prog1
Prog2 System calls/ API
Operating Systeem Device drivers Hardware 2
Introductie Een device driver is een computer programma dat direct communiceert met een resource. Voorbeelden zijn: printerdriver, filedriver, displaydriver,…. Is de vertaalslag tussen het operating systeem en de applicaties die gebruik maken van de devices. Een device driver werkt in de kernelmode.
3
Waarom werken met device drivers. Het maken van een apparaat zoals verwacht is een lastige taak. => Fouten in hardware wordt door de software (driver) gecorrigeerd. In plaats van elke keer het programma te veranderen biedt het o.s. de mogelijkheid om op eenvoudige wijze een andere device te benaderen. Het toevoegen van drivers onder het operatingsysteem biedt de bescherming en veiligheid die nodig is voor het aansturen door malafide gebruikers. Device drivers zijn in principe gelinkte libraries 4
Interfacing device drivers
A: zonder een standaard interface B: met een standaard interface
5
File abstractie Wat doe je met een device ? • Lezen en schrijven • Alleen lezen of alleen schrijven Voorbeelden: USB device, CD ROM, LED display Wat doe je met een file? • Open, close, read, write,..
File is een uitstekende abstracte device. 6
Voorbeeld
int fd; char cbuf; fd=open(“/dev/tty”, O_RDONLY,0); read(fd, &cbuf, 1); close(fd);
7
Device crw-rw-rwbrw-rw ---brw-rw ---brw-rw ----
1 root root 1 root disk 1 root disk 1 root disk
1, 8, 8, 8,
3 0 1 2
2009-12-06 13:28 null 2009-12-06 13:28 sda 2009-12-06 13:28 sda1 2009-12-06 13:28 sda2
l Nummers voor “last modification” zijn de major en minor devicenummers van een bepaald device. l Major nummers identificeren de drivers die overeenkomen met de device. b.v. sda, sda1 en sda2 hebben dezelfde device l Minor nummers worden gebruikt door de kernel om precies te bepalen naar welke apparaat verwezen wordt. u b.v. een onderscheid maken tussen verschillende partities op een harddisk /dev/sda, / dev/sda1, / dev/sda2 hebben allemaal dezelfde major, maar verschillende minor nummers. u Wordt intern gebruikt voor indexering
8
Device type l Een Character Devices Toegankelijk via een stroom van bytes( zoals in een file) Vb: usb, modem, ..
l Een Block Devices Via een systeem buffer die functioneert als een data-cache. Voorbeeld Harddisk controllers l Een network Devices 9
User programma & Kernel Interface System Call Interface VFS
Socket
File Systems Network Protocol
Buffer Cache Block Character Device Driver Device Driver
Network Device Driver
Hardware 10
Device driver interface
11
Device driver interface
12
Kernel Modules Versus Applicaties Kernel modules zijn event-driven User-level applicaties kunnen functies aanroepen die niet gedefinieerd zijn. Gebruik maken van externe library's
Kernel module kan alleen gelinkt worden met kernel functies b.v: printk is de versie van printf wordt binnen de kernel gedefinieerd.
Gebruik in de kernel module dus geen user-level library's zoals stdio.h Vergeet na disabelen van de interrupts deze niet te enabelen 13
User Space Versus Kernel-Space Een kernel module run in kernel-space, waar applicatie run in user- space Een applicatie kan zich verplaatsen van user-space naar kernel-space b.v. het aanroepen van een system-call
Driver code moet re-entrant zijn. Een functie heet re-entrant als hij op ieder willekeurig punt onderbroken kan worden en een nieuwe “kopie” opgestart zonder elkaar in de weg te zitten.
14
Voorbeeld van niet re-entrant code int global_variable = 1; int f() { global_variable = global_variable + 2; return g_var; } Het reultaat is bij “multiple threads” aanroep van f() onvoorspelbaar. int g() { return f() + 2; } g() roept een “non-reentrant” functie f() aan. 15
Voorbeeld van niet re-entrant code int f(int i) { return i + 2; } int g(int i) { return f(i) + 2; }
16
Driver User mode <==> Kernel mode
17
Read en Write Methoden in linux l Read en write kopieeren van en naar applicatie code. l prototypes ssize_t read(struct file *filp, char __user *buff, size_t count, loff_t *offp); ssize_t write(struct file *filp, const char __user *buff, size_t count, loff_t *offp); filp: File pointer count:Grootte van de user buffer buff: Pointer naar de user buffer Offp: offset binnen de file
sss
18
Read en Write Methoden in linux l Wees voorzichtig bij het omgaan met user / kernel data transfers User buffer pointers kunnen illegaal zijn Er kan een page-fault veroorzaakt worden (data is alleen virtueel aanwezig, dus niet in RAM). Pointers kunnen malvious zijn.
l Er zijn speciale functies die veilige data transfare verzorgt tussen de user en de kernel ruimte. unsigned long copy_to_user(void __user *to, const void *from, unsigned long count); unsigned long copy_from_user(void *to, const void __user *from, unsigned long count);
sss
19
Read en Write Methoden in linux
20
Algemene systemen versus embedded systemen
Application process
Application process
Operating System: dev/xyz
Device driver
Device driver
Physical Device hardware
Physical Device hardware 21
Gebruiker afschermen van de hardware
Prog1
Prog2 System calls/ API
Operating Systeem Device drivers Hardware 22
Aanroep van de driver FILE *fp = fopen(LCD_NAME, "w“ );
open() close() read() write() dev
flags
Device tabel fprintf(fp, "test");
23
Hoe te werk gaan 1: Creëer de device-header file die de registers beschrijft (dit is de interface file) 2: Implementeer de driver functionaliteit 3: Test de driver (m.b.v. de main) 4: Integreer de driver.
device driver voor de HAL (NIOS II)
Devices Character-‐mode devices Timer devices File subsystems Ethernet devices DMA devices Flash memory devices
Driverfuncties tabel
Aanroep van de driver FILE *fp = fopen(LCD_NAME, "w“ );
alt_fd dev
flags Device tabel int alt_dev_reg( alt_dev* dev );
alt_dev open() close() read() write()
Driverfuncties tabel
int schrijf( alt_fd*,const chr*,int ) { }
NIOS II Software developer’s Handbook Hoofdstuk 7
The High Level Picture A lot of research effort in the OS community has gone into performance, rather than reliability. The result: operating system crashes are still a huge problem today 5% of Windows systems crash every day
• Device drivers are the biggest cause of crashes Drivers cause 85% of Windows XP crashes Drivers in Linux are 7 times buggier than the kernel
Dept. of Computer Science & Engineering University of Washington
30
Why Do Drivers Fail? Complex and hard to write Must handle asynchronous events • interrupts
Must obey kernel programming rules • Locking, synchronization
Difficult to test and debug • timing-related bugs
Non-reproducible failures
Often written by inexperienced programmers Code often not available to OS vendors Dept. of Computer Science & Engineering University of Washington
31
OS Today Application
Application
Driver Kernel
Dept. of Computer Science & Engineering University of Washington
32
Our Goal: OS With Reliability Application
Application
Driver Kernel
Dept. of Computer Science & Engineering University of Washington
33
Recovery Works Sound
Net
Number of failures
100
Storage Driver Failures Application Failures
80 60 40 20 0 Mp3 Player
Audio Remote Recorder Copy
Sniffer
Compiler Database
Dept. of Computer Science & Engineering University of Washington
34