Course Code: ldd
Duration: 35 hours
Prerequisites:
- Conoscenza di base dell'uso di un sistema GNU/Linux come utente finale
- Conoscenza di base della shell a riga di comando
- Conoscenza di base dello sviluppo in user space (spazio utente) / applicazioni
- Conoscenza intermedia del linguaggio di programmazione C
- Si raccomanda di aver frequentato in precedenza il corso Architettura dei sistemi GNU/Linux embedded e/o di avere una buona comprensione degli argomenti trattati in quel corso
Overview:
Descrizione
Questo corso di formazione della durata di 5 giorni combina esercitazioni pratiche con spiegazioni teoriche per illustrare i concetti relativi agli interni del kernel GNU/Linux e allo sviluppo di driver di dispositivo. Il programma è progettato per far acquisire rapidamente le competenze necessarie. Vengono descritti processi, concetti e comandi fondamentali per scrivere driver di dispositivo GNU/Linux, attraverso un mix di teoria e formazione pratica.
Non serve reinventare la ruota: impara da un formatore esperto e porta a casa una conoscenza operativa e la capacità di applicarla efficacemente nel tuo progetto di sviluppo embedded.
A chi si rivolge?
Personale interessato o incaricato dello sviluppo o della valutazione di driver di dispositivo GNU/Linux, come ingegneri software, tecnici field, responsabili di progetto (project managers) e ingegneri hardware.
Course Outline:
Introduzione
- Breve storia di GNU/Linux
- Licenze
- Versionamento del kernel
- Ciclo di rilascio
- Branch del kernel
- Mainline
- Kernel vs spazio utente (user space)
- Meccanismo vs politica
- Alternative per i driver del kernel
- RTOS vs Linux
Gestione della memoria
- Memoria virtuale vs memoria fisica
- Allocazione della memoria nel kernel
- Pagine
- Zone
- API
- Slab allocator
Patch del kernel
- Ciclo di vita
- Git
- Sorgenti del kernel
- Creare una patch
- Controllare una patch (checkpatch)
- Correggere una patch
- Inviare una patch
- Codice verificato (audited code)
Moduli del kernel
- Ottenere i sorgenti del kernel
- Configurare/compilare/installare
- Driver di dispositivo (collegati staticamente, caricati a runtime)
- Inizializzazione (init) e chiusura (exit)
- Licenze
- EXPORT_SYMBOL GPL
- Makefile out-of-tree
- Strumenti per i moduli (module-init-tools)
- Modulo all'interno del albero dei sorgenti del kernel
- Kconfig
- Passaggio dei parametri
- Sparse
Driver di tipo carattere (Char Drivers)
- Architettura
- Interfaccia utente/kernel
- Sottosistema I/O
- VFS (Virtual File System)
- sysfs (dispositivi, bus, driver, classi),
- kobject/ktype/kset
- Modello dei driver del kernel Linux
- File di dispositivo
-
Driver di tipo carattere
- Inizializzazione
- Registrazione
- Open, release
- cdev, cdev_add, cdev_del, ...
- Numeri major/minor
- udev, udevmonitor, udevadm
Operazioni avanzate per i driver di tipo carattere
- ioctl
- unlocked ioctl
- compat ioctl
- API nello spazio utente (user space)
- API nello spazio kernel (kernel space)
- Ciclo di vita del processo
- Sleep/blocking
- Sleep/wakeup
- Code di attesa (wait queue)
- Problema del branco (thundering herd)
- poll/select
Debugging del kernel
- Debugging
-
Debugging del kernel
- Ricerca binaria con git
- Supporto al debug fornito dal kernel
- printk, syslogd, klogd, livelli di log (loglevels), limiti di velocità (rate limit), livelli di debug, sottosistemi di debug selettivi
- Debug tramite query a debugfs
- Debug degli oops, generazione intenzionale di oops
- Tasto Magic SysRq
- kgdb/kdb
- JTAG
Tracing
- gcov
- lcov
- oprofile
-
ftrace
- nop tracer
- function tracer
- sched switch tracer
- function graph tracer
- dynamic tracer
- trace-cmd/kernelshark
- perf
- LTTng
Interruzioni (Interrupts)
- Interruzioni vs polling
- Interruzione (interrupt)
- Sezioni di programma
- Rientro (reentrancy)
- Eventi
- Handler di interruzione
- Handler di interruzione condiviso
- Flusso dell'interruzione
- Controllo dell'interruzione
Posticipazione delle attività (Deferring Work)
- Top/bottom halves
- Softirq
- Tasklet
- Code di lavoro (work queues)
- Interrupt threadati
Concorrenza
- Regione/sezione critica
- Atomicità (atomic)
- Race condition
- Sincronizzazione
- Locking
- Soluzioni di locking
- Deadlock
- Contention
- Cosa bloccare?
-
Cosa utilizzare?
- Operazioni atomiche
- Spinlock
- Spinlock read-write
- Semaphore
- Binary semaphore
- Mutex
- Semaphore read-write
- Variabili di completamento (completion variables)
- Seqlock
- Disabilitare la preempting
- Ordinamento e barriere (ordering and barriers)
Tempo
- HZ
- Jiffies
- Ritardi lunghi/corti
- Timer del kernel
I/O hardware
- Porte I/O
- Memoria I/O
- Come gestire gli effetti collaterali durante l'accesso ai registri?
Comunicazione User-Kernel
- put/get_user()
- copy_to/from_user()
- I/O del kernel
- Mappatura della memoria
- procfs
- sysfs
- debugfs
- relayfs
- netlink
- ioctl
Portabilità
- Dimensione della parola (word size)
- Tipi opachi
- Char signed/unsigned
- Allineamento dei dati
- Promozione integrale (integral promotion)
- Riutilizzo del codice
- Endianness
- Tick di sistema
- Dimensione della pagina
- Ordinamento delle istruzioni
- SMP/preemption/high memory
Tranne dove diversamente indicato, i contenuti e questo programma del corso sono concessi in licenza secondo Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0).
United Arab Emirates - Embedded GNU/Linux Kernel Internals and Device Drivers
Qatar - Embedded GNU/Linux Kernel Internals and Device Drivers
Egypt - Embedded GNU/Linux Kernel Internals and Device Drivers
Saudi Arabia - Embedded GNU/Linux Kernel Internals and Device Drivers
South Africa - Embedded GNU/Linux Kernel Internals and Device Drivers
Brasil - Integridade do Kernel GNU/Linux Embarcado e Drivers de Dispositivo
Canada - Embedded GNU/Linux Kernel Internals and Device Drivers
香港 - Embedded GNU/Linux Kernel Internals and Device Drivers
澳門 - Embedded GNU/Linux Kernel Internals and Device Drivers
台灣 - Embedded GNU/Linux Kernel Internals and Device Drivers
USA - Embedded GNU/Linux Kernel Internals and Device Drivers
Österreich - Interne Struktur des GNU/Linux-Kernels und Gerätetreiber
Schweiz - Interne Struktur des GNU/Linux-Kernels und Gerätetreiber
Deutschland - Interne Struktur des GNU/Linux-Kernels und Gerätetreiber
Czech Republic - Interní struktura jádra GNU/Linuxu a ovladače zařízení
Denmark - Embedded GNU/Linux Kernel Internals and Device Drivers
Estonia - Embedded GNU/Linux Kernel Internals and Device Drivers
Finland - Embedded GNU/Linux Kernel Internals and Device Drivers
Greece - Εσώτερο Λειτουργικό των Πυρήνων GNU/Linux και Οδηγοί Συσκευών
Magyarország - Beágyazott GNU/Linux Kernel Belső Működése és Eszközmeghajtók
Ireland - Embedded GNU/Linux Kernel Internals and Device Drivers
Luxembourg - Embedded GNU/Linux Kernel Internals and Device Drivers
Latvia - Embedded GNU/Linux Kernel Internals and Device Drivers
España - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Italia - Interni del kernel GNU/Linux e driver di dispositivo
Lithuania - Embedded GNU/Linux Kernel Internals and Device Drivers
Nederland - Inwendige werking van de GNU/Linux-kernel en apparaatstuurprogramma's
Norway - Inne i Linux-kjernen for innbygde systemer og enhetsdrivere
Portugal - Integridade do Kernel GNU/Linux Embarcado e Drivers de Dispositivo
România - Internele Nucleului GNU/Linux și Driverele de Dispozitive
Sverige - Inbyggd GNU/Linux-kärninterna funktioner och enhetsdrivrutiner
Türkiye - Gömülü GNU/Linux Çekirdek İç Yapıları ve Cihaz Sürücüleri
Malta - Embedded GNU/Linux Kernel Internals and Device Drivers
Belgique - Internalités du noyau GNU/Linux et pilotes de périphériques intégrés
France - Internalités du noyau GNU/Linux et pilotes de périphériques intégrés
日本 - 埋め込み GNU/Linux カーネルの内部構造とデバイスドライバ
Australia - Embedded GNU/Linux Kernel Internals and Device Drivers
Malaysia - Embedded GNU/Linux Kernel Internals and Device Drivers
New Zealand - Embedded GNU/Linux Kernel Internals and Device Drivers
Philippines - Embedded GNU/Linux Kernel Internals and Device Drivers
Singapore - Embedded GNU/Linux Kernel Internals and Device Drivers
Thailand - Embedded GNU/Linux Kernel Internals and Device Drivers
Vietnam - Kiến trúc Nhân GNU/Linux Nhúng và Trình điều khiển Thiết bị
India - Embedded GNU/Linux Kernel Internals and Device Drivers
Argentina - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Chile - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Costa Rica - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Ecuador - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Guatemala - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Colombia - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
México - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Panama - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Peru - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Uruguay - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Venezuela - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Polska - Wewnętrzne mechanizmy jądra GNU/Linux i sterowniki urządzeń
United Kingdom - Embedded GNU/Linux Kernel Internals and Device Drivers
South Korea - 임베디드 GNU/리눅스 커널 내부 구조 및 장치 드라이버
Pakistan - Embedded GNU/Linux Kernel Internals and Device Drivers
Sri Lanka - Embedded GNU/Linux Kernel Internals and Device Drivers
Bulgaria - Вградени вътрешни принципи на ядрото GNU/Linux и драйвери на устройства
Bolivia - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Indonesia - Embedded GNU/Linux Kernel Internals and Device Drivers
Kazakhstan - Embedded GNU/Linux Kernel Internals and Device Drivers
Moldova - Internele Nucleului GNU/Linux și Driverele de Dispozitive
Morocco - Embedded GNU/Linux Kernel Internals and Device Drivers
Tunisia - Embedded GNU/Linux Kernel Internals and Device Drivers
Kuwait - Embedded GNU/Linux Kernel Internals and Device Drivers
Oman - Embedded GNU/Linux Kernel Internals and Device Drivers
Slovakia - Embedded GNU/Linux Kernel Internals and Device Drivers
Kenya - Embedded GNU/Linux Kernel Internals and Device Drivers
Nigeria - Embedded GNU/Linux Kernel Internals and Device Drivers
Botswana - Embedded GNU/Linux Kernel Internals and Device Drivers
Slovenia - Embedded GNU/Linux Kernel Internals and Device Drivers
Croatia - Embedded GNU/Linux Kernel Internals and Device Drivers
Serbia - Embedded GNU/Linux Kernel Internals and Device Drivers
Bhutan - Embedded GNU/Linux Kernel Internals and Device Drivers
Nepal - Embedded GNU/Linux Kernel Internals and Device Drivers
Uzbekistan - Embedded GNU/Linux Kernel Internals and Device Drivers
US Government - Embedded GNU/Linux Kernel Internals and Device Drivers