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).

Sites Published:

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

中国 - 嵌入式GNU/Linux内核与设备驱动

香港 - 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