Course Code: ldd
Duration: 35 hours
Prerequisites:

  • Βασική εξοικείωση με τη χρήση ενός συστήματος GNU/Linux ως τελικού χρήστη
  • Βασική εξοικείωση με το τερματικό εντολών
  • Βασική γνώση ανάπτυξης στο χώρο χρήστη (user space) / εφαρμογών
  • Μεσαίο επίπεδο γνώσεων προγραμματισμού σε C
  • Θα πρέπει να έχετε παρακολουθήσει προηγουμένως το Αρχιτεκτονική Ενσωματωμένων Συστημάτων GNU/Linux (ισχυρά συνιστάται!) και/ή να έχετε καλή κατανόηση των θεμάτων που καλύπτονται εκεί

Overview:

Περιγραφή

Αυτό το σεμινάριο πέντε ημερών συνδυάζει πρακτικές ασκήσεις με διδασκαλία για την αποσαφήνιση των εννοιών της εσωτερικής λειτουργίας του πυρήνα GNU/Linux και της ανάπτυξης οδηγών συσκευών. Σκοπός είναι να σας φέρει γρήγορα σε επαγγελματικό επίπεδο. Παρουσιάζουμε τις διαδικασίες, τις έννοιες και τις εντολές που απαιτούνται για τη συγγραφή οδηγών συσκευών GNU/Linux, μέσω ενός συνδυασμού θεωρητικής γνώσης και πρακτικής εκπαίδευσης.

Αντί να επανακατασκευάσετε τον τροχό, μάθετε από έναν έμπειρο εκπαιδευτή και αποχωρήστε possessing μια πρακτική κατανόηση και την ικανότητα να την εφαρμόσετε αποτελεσματικά στο δικό σας έργο ενσωματωμένης ανάπτυξης.

Σε ποιους απευθύνεται;

Σε άτομα με ενδιαφέρον ή υπεύθυνες για την ανάπτυξη ή αξιολόγηση της ανάπτυξης οδηγών συσκευών GNU/Linux, όπως μηχανικούς λογισμικού, μηχανικούς υποστήριξης πελάτη, διευθυντές έργου, και μηχανούς υλικού.

Course Outline:

Εισαγωγή

  • Σύντομη ιστορία του GNU/Linux
  • Άδειες χρήσης
  • Σχεδιασμός εκδόσεων του πυρήνα
  • Κύκλος κυκλοφορίας
  • Δέντρα πυρήνα
  • Mainline (Κύρια γραμμή)
  • Πυρήνας vs χώρος χρήστη
  • Μηχανισμός vs πολιτική
  • Εναλλακτικές λύσεις για οδηγούς πυρήνα
  • RTOS vs Linux

Διαχείριση Μνήμης

  • Εικονική μνήμη vs φυσική μνήμη
  • Κατανομή μνήμης στον πυρήνα
  • Σελίδες
  • Ζώνες (zones)
  • API
  • Slab allocator

Επιδιορθώσεις Πυρήνα (Kernel Patches)

  • Κύκλος ζωής
  • git
  • πηγαίος κώδικας πυρήνα
  • Δημιουργία επιδιορθώσεων (patch)
  • Έλεγχος επιδιορθώσεων
  • Διόρθωση επιδιορθώσεων
  • Παράδοση επιδιορθώσεων
  • Ελεγμένος κώδικας

Module Κώδικα Πυρήνα

  • Λήψη πηγών πυρήνα
  • Διαμόρφωση / Κατασκευή / Εγκατάσταση
  • Οδηγοί συσκευών (στατικά συνδεδεμένοι, φορτώνονται σε εκτέλεση)
  • init/exit
  • Άδειες χρήσης
  • EXPORT_SYMBOL GPL
  • makefile εκτός δέντρου (out of tree)
  • εργαλεία εκκίνησης module (module-init-tools)
  • module εντός του δέντρου του πυρήνα
  • Kconfig
  • Μετάδοση παραμέτρων
  • sparse

Οδηγοί Χαρακτήρων (Char Drivers)

  • Αρχιτεκτονική
  • Διασύνραση χρήστη/πυρήνα
  • Υπόσύστημα I/O
  • VFS
  • sysfs (συσκευές, δίαυλοι, οδηγοί, κλάσεις),
  • kobject/ktype/kset
  • μοντέλο οδηγών πυρήνα Linux
  • αρχεία συσκευών
  • οδηγοί χαρακτήρων

    • αρχικοποίηση
    • εγγραφή
    • άνοιγμα, κλείσιμο
    • cdev, cdev add, cdev del,...
    • αριθμοί major/minor
    • udev, udevmonitor, udevadm

Προηγμένες Λειτουργίες Οδηγών Χαρακτήρων

  • ioctl
  • unlocked ioctl
  • compat ioctl
  • API χώρου χρήστη
  • API χώρου πυρήνα
  • Κύκλος ζωής διεργασιών
  • ύπνος/εμπλοκή (sleeping/blocking)
  • ύπνος/ξύπνημα
  • ουρά αναμονής (wait queue)
  • φαινόμενο ομήλου (thundering herd)
  • poll/select

Αποσφαλμάτωση Πυρήνα

  • αποσφαλμάτωση
  • αποσφαλμάτωση του πυρήνα

    • δυαδική αναζήτηση με git
    • υποστήριξη αποσφαλμάτωσης από τον πυρήνα
    • printk syslogd, klogd, επίπεδα καταγραφής (loglevels), περιορισμός ρυθμού, επίπεδα debugging, εκλεπτυσμένη επιλογή υποσυστημάτων
    • αποσφαλμάτωση μέσω ανάθεσης debugfs
    • αποσφαλμάτωση oops, επαλήθευση oops
    • Μαγικό πλήκτρο SysRq
    • kgdb/kdb
    • JTAG

Ανίχνευση (Tracing)

  • gcov
  • lcov
  • oprofile
  • ftrace

    • ανιχνευτής nop
    • ανιχνευτής συναρτήσεων
    • ανιχνευτής εναλλαγής προγραμματισμού (sched switch)
    • ανιχνευτής γραφικής συνάρτησης
    • δυναμικός ανιχνευτής
  • trace-cmd/kernelshark
  • perf
  • LTTng

Διακοπές (Interrupts)

  • διακοπές vs polling
  • διακοπή
  • τμήματα προγράμματος
  • αναπληρωματικότητα (reentrancy)
  • γεγονότα
  • χειριστής διακοπής
  • κοινοποιημένος χειριστής διακοπής
  • ροή διακοπής
  • έλεγχος διακοπής

Αναβολή Εργασιών (Deferring Work)

  • top/bottom halves
  • softirqs
  • tasklets
  • ουρές εργασιών
  • νηματοποιημένες διακοπές

Ταυτόχρονη Εκτέλεση (Concurrency)

  • κρίσιμη περιοχή/τμήμα
  • ατομικές ενέργειες
  • συνθήκη αγώνα (race condition)
  • συγχρονισμός
  • κλειδώματα (locking)
  • λύσεις κλειδώματος
  • αδιέξοδο (deadlock)
  • ανταγωνισμός (contention)
  • τι πρέπει να κλειδώσουμε;
  • τι μπορεί να χρησιμοποιηθεί;

    • ατομικές ενέργειες
    • spin locks
    • κλειδώματα spin ανάγνωσης-εγγραφής
    • αριστεύματα (semaphore)
    • δυαδικό αριστεύμα
    • mutex
    • αριστεύμα ανάγνωσης-εγγραφής
    • μεταβλητές ολοκλήρωσης (completion variables)
    • κλειδώματα ακολουθιακά
    • απενεργοποίηση προεπιλογής (disable preemption)
    • σειρά και barriers

Χρόνος

  • HZ
  • Jiffies
  • μεγάλες/μικρές καθυστερήσεις
  • χρονόμετρα πυρήνα

Υλικό I/O

  • Θύρες I/O
  • Μνήμη I/O
  • Πώς να αντιμετωπίσουμε τις παρενέργειες πρόσβασης σε καταχωρητές;

Επικοινωνία Χρήστη-Πυρήνα

  • put(get)_user()
  • copy to(from)_user()
  • Kernel I/O
  • χαρτογράφηση μνήμης
  • procfs
  • sysfs
  • debugfs
  • relayfs
  • netlink
  • ioctl

Φορητότητα (Portability)

  • μέγεθος λέξης
  • τύποι αδιαφάνειας (opaque types)
  • signed/unsigned char
  • ευθυγράμμιση δεδομένων
  • προώθηση ακέραιων (integral promotion)
  • επαναχρησιμοποίηση κώδικα
  • endianess
  • κύκλος συστήματος
  • μέγεθος σελίδας
  • σειρά εντολών
  • SMP/preemption/high memory

Εκτός εάν αναφέρεται διαφορετικά, το περιεχόμενο και το παρόν πρόγραμμα μαθήματος είναι υπό την άδεια 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