Course Code: ldd
Duration: 35 hours
Prerequisites:

  • Grunnleggende kjennskap til bruk av et Linux-system som sluttbruker
  • Grunnleggende kjennskap til et kommandolinjeskall
  • Grunnleggende kunnskap om utvikling i brukerspace / applikasjonsutvikling
  • Mellomnivå kunnskap om C-programmering
  • Bør ha deltatt på Arkitektur for innbygde Linux-systemer før (sterkt anbefalt!) og/eller ha god forståelse for de emnene som behandles der

Overview:

Beskrivelse

I denne femdagers treningsklassen kombineres praktiske øvelser med undervisning for å illustrere konseptene rundt Linux-kjernens indre struktur og utvikling av enhetsdrivere. Kurset er designet for å gi deg rask innsikt. Vi gjennomgår prosesser, konsepter og kommandoer som er nødvendige for å skrive Linux-enhetsdrivere, ved hjelp av en blanding av teori og hands-on trening.

Ikki oppfinne hjulet på nytt, men lær av en erfaringsfylt instruktør og gå hjem med kunnskapen og evnen til å bruke den effektivt i dine egne innbygde utviklingsprosjekter.

For hvem?

Personer med interesse for eller oppgaver knyttet til utvikling eller evaluering av Linux-enhetsdrivere, for eksempel programvareingeniører, feltteknikere, (prosjekt-)ledere og maskinvareingeniører.

Course Outline:

Introduksjon

  • Rask historie om Linux
  • Lisensiering
  • Versjonering av kjernen
  • Utgivelsessyklus
  • Kjernetrær
  • Hovedgren (mainline)
  • Kjernemodus kontra brukerspace
  • Mekanisme kontra politikk
  • Alternativer for kjerekjøreprogrammer
  • RTOS vs. Linux

Minnehåndtering

  • Virtuell minne kontra fysisk minne
  • Minneallokering i kjernen
  • Sider (pages)
  • Soner (zones)
  • API
  • Slab-allocator

Kjernelapper (Kernel Patches)

  • Livssyklus
  • git
  • Kjerekildekode
  • Lage lapp (patch)
  • Sjekk lapp
  • Fiks lapp
  • Lever lapp
  • Kodesjekk og godkjenning

Kjernelmoduler

  • Hente kjerekildekode
  • Konfigurere / bygge / installere
  • Enhetsdrivere (statisk sammenkoblet, lastes ved kjøretid)
  • init / exit
  • Lisensiering
  • EXPORT_SYMBOL GPL
  • Makefile for moduler utenfor trestrukturen (out of tree)
  • module-init-tools
  • Modul i kjernens trestruktur
  • Kconfig
  • Parameteroverføring
  • sparse (statiske analyseverktøy)

Karakterdrivere (Char Drivers)

  • Arkitektur
  • Bruker/kjerne-grensesnitt
  • I/O-underystemet
  • VFS (Virtual File System)
  • sysfs (enheter, busses, drivere, klasser),
  • kobject/ktype/kset
  • Linux-kjernens drivermodell
  • Enhetsfiler
  • Karakterdriver
    • Initialisering
    • Registrering
    • open, release
    • cdev, cdev add, cdev del,…
    • Hoved-– og undertall
    • udev, udevmonitor, udevadm

Avanserte operasjoner for karakterdrivere

  • ioctl
  • unlocked ioctl
  • compat ioctl
  • Brukerspace-API
  • Kjernespace-API
  • Prosesslivssyklus
  • Sperre/blokkere
  • Sove/våkne
  • Ventekø (wait queue)
  • Thundering herd-problemet
  • poll/select

Kjernedegging (Kernel Debugging)

  • Feilsøking
  • Feilsøke kjernen
    • Binærsøking med git
    • Feilsøkestøtte fra kjernen
    • printk syslogd, klogd, loggnivåer, hastighetsbegrensning, feilsøkningsnivåer, selektiv feilsøking av underystemer
    • Feilsøking ved å hente data fra debugfs
    • Oops-feilsøking, simulere Oops
    • Magic SysRq-tasten
    • kgdb/kdb
    • JTAG

Sporingsverktøy (Tracing)

  • gcov
  • lcov
  • oprofile
  • ftrace
    • nop-tracer
    • funksjonstracer
    • sched switch-tracer
    • function graph-tracer
    • dynamisk tracer
  • trace-cmd/kernelshark
  • perf
  • LTTng

Interrupper

  • Interrupper kontra polling
  • Interruppsprosessen
  • Programseksjoner
  • Reentrancy
  • Hendelser
  • Interruppsbehandler
  • Delt interruppsbehandler
  • Interruppsflyt
  • Interruppskontroll

Utsatt arbeid (Deferring Work)

  • top/bottom halves
  • softirqs
  • tasklets
  • arbeidskøer (work queues)
  • trådede interrupper

Konkurransesituasjoner (Concurrency)

  • Kritisk område
  • Atomiske operasjoner
  • Konkurranseforhold (race condition)
  • Synkronisering
  • Låsing
  • Låseløsninger
  • Deadlock
  • Contention
  • Hva skal låses?
  • Hva kan brukes?
    • atomiske operasjoner
    • spin locks
    • leser-skriver spin locks
    • semafork
    • binær semafork
    • mutex
    • leser-skriver semafork
    • fullføringsvariabler (completion variables)
    • sekvensielle låser
    • deaktivere preempting
    • rekkefølge og barriärer

Tid

  • HZ
  • Jiffies
  • store/små forsinkelser
  • kjernetimere

Maskinvare-I/O

  • I/O-poter
  • I/O-minne
  • Hvordan håndtere bivirkninger ved tilgang til registre?

Kommunikasjon mellom bruker og kjerne

  • put(get)_user()
  • copy to(from)_user()
  • Kjerne-I/O
  • minnekartlegging
  • procfs
  • sysfs
  • debugfs
  • relayfs
  • netlink
  • ioctl

Bærekraft (Portability)

  • Ordstørrelse (word size)
  • Opaque typer
  • signerte/usignerte char
  • Datajustering (data alignment)
  • Integral opprykking (integral promotion)
  • Gjenbruk av kode
  • Endianess
  • Systemticking
  • Sidestørrelse
  • Instruksjonsrekkefølge
  • SMP/preempting/høyt minne

Med mindre annet er oppgitt, er innholdet og dette kursoppsettet lisensiert under Creative Commons Erkjennelse-IkkeKommerSiell-DelPåLignendeVilkår 4.0 internasjonale (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