Schița de curs

Introducere

  • o istorie rapidă a GNU/Linux
  • licențierea
  • versionarea nucleului
  • ciclul de eliberare
  • arbori de kernel
  • linia principală (mainline)
  • nucleul vs. spațiul utilizator
  • mecanism vs. politică
  • alternative la driver-ul de kernel
  • RTOS vs. Linux

Management Memorie

  • memorie virtuală vs. memorie fizică
  • alocarea memoriei în kernel
  • pagini (pages)
  • zone (zones)
  • API
  • slab allocation

Pachet Kernel

  • ciclul de viață
  • git
  • sursa nucleului (kernel source)
  • crearea unui pachet (create patch)
  • verificarea unui pachet (check patch)
  • corectarea unui pachet (fix patch)
  • trimiterea unui pachet (ship patch)
  • cod auditat

Module Kernel

  • obținerea surselor nucleului (get kernel sources)
  • configurare/compilare/instalare (configure/build/install)
  • driver-uri de dispozitive (linkează statice, încărcate la rulare)
  • inițializare/terminare (init/exit)
  • licențierea
  • EXPORT SYMBOL GPL
  • makefile în afara arborii (out of tree makefile)
  • module-init-tools
  • modul în arbore de kernel (module in kernel tree)
  • Kconfig
  • trecerea parametrilor (parameter passing)
  • sparse

Driver-uri Caracter

  • arhitectură
  • interfața utilizator/kernel
  • sub sistemul I/O
  • VFS (Virtual File System)
  • sysfs (dispozitive, bus, driver-uri, clase),
  • kobject/ktype/kset
  • modelul de driver al nucleului Linux
  • fișiere dispozitiv (device files)
  • driver de caracter (char driver)
    • inițializare
    • înregistrare
    • deschidere, eliberare (open, release)
    • cdev, cdev add, cdev del,...
    • numere principale/secundare (major/minor numbers)
    • udev, udevmonitor, udevadm

Operațiuni Avansate pentru Driver-uri Caracter

  • ioctl
  • unlocked ioctl
  • compat ioctl
  • API spațiu utilizator (user space API)
  • API spațiu kernel (kernel space API)
  • ciclul de viață al procesului
  • somn/blocare (sleeping/blocking)
  • somn/revelarea (sleeping/waking up)
  • coadă de așteptare (wait queue)
  • grea împiedicătoare (thundering herd)
  • sondare/selectare (poll/select)

Depanare Nucleu

  • depanare (debugging)
  • depanarea nucleului
    • căutare binară cu git (binary search with git)
    • susținerea depanării din nucleu (debug support from kernel)
    • printk, syslogd, klogd, niveluri de log, limitare rată, niveluri de debug, sub sisteme de debug selectiv
    • depanare prin interogarea debugfs (debugging by querying debugfs)
    • depanare oops, aserțiunea oops-ului (oops debugging, asserting oops)
    • Magic SysRq Key
    • kgdb/kdb
    • JTAG

Traierea (Tracing)

  • gcov
  • lcov
  • oprofile
  • ftrace
    • tracer nul (nop tracer)
    • tracer funcție (function tracer)
    • tracer schimbare de programare (sched switch tracer)
    • tracer grafic funcție (function graph tracer)
    • tracer dinamic (dynamic tracer)
  • trace-cmd/kernelshark
  • perf
  • LTTng

Intrerupțiuni (Interrupts)

  • intrerupții vs. sondare (polling)
  • intrerupție
  • secțiuni de program
  • reentrabilitate (reentrancy)
  • evenimente
  • gestionarul de intrerupții (interrupt handler)
  • gestionar de intrerupții împărțit (shared interrupt handler)
  • fluxul de intrerupere (interrupt flow)
  • controlul intreruperilor (interrupt control)

Posticiparea Lucrărilor

  • jumătăți de sus/jos (top/bottom halves)
  • softirqs
  • tasklets
  • cozi de lucrări (work queues)
  • intrerupții cu fir (threaded interrrupts)

Concomitanța (Concurrency)

  • regiune critică/secțiune critică (critical region/section)
  • atomic
  • condiție de cursă (race condition)
  • sincronizare (synchronization)
  • blocarea (locking)
  • soluții de blocare (locking solutions)
  • blocarea simultană (deadlock)
  • competiție (contention)
  • ce să se blocheze?
  • ce poate fi folosit?
    • operații atomice (atomic operations)
    • blocări de rotație (spin locks)
    • blocări de rotație cititor-scriitor (reader-writer spin locks)
    • semafor
    • semafor binar (binary semaphore)
    • mutex
    • semafor cititor-scriitor (reader-writer semaphore)
    • variabile de finalizare (completion variables)
    • blocări secvențiale (sequential locks)
    • dezactivarea preempției (disable preemption)
    • ordonare și bariere (ordering and barriers)

Timp

  • HZ
  • Jiffies
  • întârzieri mari/mici (big/small delays)
  • timere nucleu (kernel timers)

I/O Hardware

  • Porturi I/O
  • Memorie I/O
  • Cum se tratează efectele laterale la accesarea registrelor?

Comunicare Utilizator-Nucleu (User-Kernel Communication)

  • put(get)_user()
  • copy to(from)_user()
  • I/O Nucleu (Kernel I/O)
  • mapare memorie (memory mapping)
  • procfs
  • sysfs
  • debugfs
  • relayfs
  • netlink
  • ioctl

Portabilitate

  • dimensiunea cuvântului (word size)
  • tipuri opace (opaque types)
  • char semnat/nesemnat (signed/unsigned char)
  • alinierea datelor (data alignment)
  • promovarea integrală (integral promotion)
  • refolosirea codului (code reuse)
  • endianness
  • tick de sistem (system tick)
  • dimensiunea paginii (page size)
  • ordonarea instrucțiunilor (instruction ordering)
  • SMP/preempție/memorie la nivel înalt (SMP/preemption/high memory)

Cu excepția cazului în care este specificat altfel, conținutul și structura acestui curs sunt licențiate sub Atribuire-Necomerțial-Compartire conform 4.0 Internațional (CC BY-NC-SA 4.0).

Cerințe

  • Familiaritate de bază cu folosirea unui sistem GNU/Linux ca utilizator final
  • Familiaritate de bază cu o coșelie de comandă
  • Cunoștințe de bază în dezvoltarea spațiului utilizator/aplicații
  • Cunoștințe intermediare de programare C
  • Ar trebui să fi participat la Embedded GNU/Linux Systems Architecture înainte (rezultă puternic recomandat!) și/sau să aibă o bună înțelegere a temelor prezentate acolo
 35 ore

Numărul de participanți


Pret per participant

Mărturii (5)

Cursuri viitoare

Categorii înrudite