Edocti Training
Linux Device Drivers – Esențiale
Fundamentele Linux device drivers: Dobândești competențe practice în scrierea de Linux device drivers.
Laboratoare hands‑on în care lucrezi cu module, character device‑uri, kernel logs și Kernel API.
Explorezi managementul memoriei, întreruperile și sincronizarea, prin implementarea unor exerciții practice.
Mod de lucru hands-on (70% laboratoare).
Cum te ajută: înțelegi granițele kernel‑user și bunele practici de dezvoltare a driverelor.
Cui i se adresează: conceput pentru persoane cu baze decente de programare C si operare Linux, care vor să avanseze cu programarea in kernelspace.
La final vei construi drivere funcționale și le vei debug-ui cu încredere.
Curriculum
Introducere
- Kernel versions
- Kernel sources și utilizarea git
- Rolling your own kernel
- Platforme
- Tipuri de device drivers
- Elementele unui proiect embedded Linux (prezentare de ansamblu)
Device drivers
- Tipuri de dispozitive; mechanism vs. policy; evitarea binary blobs
- Cum folosesc aplicațiile device drivers
- Mecanismul system call
- Error numbers
- printk()
- devres: managed device resources
- Module și device drivers: macro-urile module_driver(), modules și hot plug
Managementul și alocarea memoriei
- Memorie virtuală și fizică
- Memory zones
- Page tables
- kmalloc(), __get_free_pages(), vmalloc()
- Slabs și alocări în cache
Character devices
- Device nodes
- Major și minor numbers; rezervarea numerelor
- Accesarea device node-ului
- Înregistrarea dispozitivului (registering the device)
- udev
- dev_printk() și funcții asociate
- Structura file_operations
- Entry points ale driverului
- Structurile file și inode
Transfer între user și kernel space
- User-space vs. kernel-space; system calls; process context
- Lista înlănțuită (linked list) și alte structuri de date
- put(get)_user() și copy_to(from)_user()
- Transfer direct: Kernel I/O și memory mapping
- Funcții user-space pentru mmap()
- Entry point al driverului pentru mmap()
Întreruperi și excepții
- Interrupts și exceptions
- Asynchronous interrupts
- MSI
- Activarea/dezactivarea întreruperilor
- Ce NU trebuie făcut în timpul întreruperii
- Structuri de date IRQ
- Instalarea unui interrupt handler
Măsurători de timp
- Tipuri de măsurători
- Jiffies
- Obținerea timpului curent
- Surse de ceas (clock sources)
- Programmable interval timer
- Time stamp counter
- HPET
- Tickless kernels
Kernel timers
- Introducerea de întârzieri (delays)
- Low resolution timers
- High resolution timers
ioctls
- Entry points ale driverului pentru ioctls
- Locked și lockless ioctls
- Definirea ioctls
Unified device model și sysfs
- Structuri de date de bază
- Dispozitive reale
- sysfs
- Exemple kset și kobject
Sleeping și wait queues
- Trecerea în sleep și trezirea
- Exclusive sleeping
- Polling
Interrupt handling
- Top și bottom halves
- Deferrable functions și softirqs
- Tasklets
- Work queues
- Threaded interrupt handlers
- Interrupt handling în user-space
Hardware I/O
- Buses și ports
- Memory barriers
- Înregistrarea porturilor I/O
- Acces la registre I/O și memorie I/O
- Acces din user: ioperm(), iopl(), /dev/port
Aplicație (dacă timpul permite)
- Implementarea unui driver pentru LED
- Implementarea unui driver pentru senzor de temperatură
Structura zilei de curs
- Part 1: 09:00–10:30
- Break: 10:30–10:45
- Part 2: 10:45–12:15
- Lunch break: 12:15–13:15
- Part 3: 13:15–15:15
- Break: 15:15–15:30
- Part 4: 15:30–17:30