1 Device driver
2 Hardware Operating Systeem Prog1Prog2 System calls/ API Device drivers Gebruiker afschermen van de hardware
3 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 devicedriver werkt in de kernelmode.
4 Het maken van een apparaat zoals verwacht is een lastige taak. Waarom werken met device drivers. Het toevoegen van drivers onder het operatingsysteem biedt de bescherming en veiligheid die nodig is voor het aansturen door malafide gebruikers. => Fouten in hardware wordt door de software (driver) gecorrigeerd. Device drivers zijn in principe gelinkte libraries In plaats van elke keer het programma te veranderen biedt het o.s. de mogelijkheid om op eenvoudige wijze een andere device te benaderen.
55 Interfacing device drivers B: met een standaard interface A: zonder een standaard interface
6 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.
7 Voorbeeld int fd; char cbuf; fd=open(“/dev/tty”, O_RDONLY,0); read(fd, &cbuf, 1); close(fd);
8 crw-rw-rw- 1 root root 1, :28 null brw-rw root disk 8, :28 sda brw-rw root disk 8, :28 sda1 brw-rw root disk 8, :28 sda2 Device Nummers voor “last modification” zijn de major en minor device- nummers van een bepaald device. Major nummers identificeren de drivers die overeenkomen met de device. b.v. sda, sda1 en sda2 hebben dezelfde device Minor nummers worden gebruikt door de kernel om precies te bepalen naar welke apparaat verwezen wordt. 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. Wordt intern gebruikt voor indexering
9 Device type Toegankelijk via een stroom van bytes( zoals in een file) Vb: usb, modem,.. Een network Devices Een Block Devices Via een systeem buffer die functioneert als een data-cache. Voorbeeld Harddisk controllers Een Character Devices
10 User programma & Kernel Interface
11 Device driver interface
12 Device driver interface
13 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
14 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.
15 int global_variable = 1; int f() { global_variable = global_variable + 2; return g_var; } If multiple threads call f() concurrently the result is unpredictable int g() { return f() + 2; } g() calls a non-reentrant function f(). Voorbeeld van niet re-entrant code
16 int f(int i) { return i + 2; } int g(int i) { return f(i) + 2; } Voorbeeld van niet re-entrant code
17 Driver User mode Kernel mode
18 Read en Write Methoden in linux Read en write kopieeren van en naar applicatie code. 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
19 Read en Write Methoden in linux 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. 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
20 Read en Write Methoden in linux
21 Application process Operating System: dev/xyz Device driver Physical Device hardware Application process Device driver Physical Device hardware Algemene systemen versus embedded systemen
22 FILE *fp = fopen(LCD_NAME, ); fprintf(fp, "test"); Device tabel flags dev "w“ Aanroep van de driver open() close() read() write()
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) Character-mode devices Timer devices File subsystems Ethernet devices DMA devices Flash memory devices Devices
Driverfuncties tabel
FILE *fp = fopen(LCD_NAME, ); Device tabel open() close() read() flags dev "w“ Aanroep van de driver write() alt_fd alt_dev int alt_dev_reg( alt_dev* dev );
Driverfuncties tabel schrijf( ) { } alt_fd*,const chr*,int int
_fd.h register adressen_reg.h declaraties voor de driver.hdeclaraties Diverse.h files.
alt_sys_int.c Opstarten van drivers:
NIOS II Software developer’s Handbook Hoofdstuk 7