Course Code: ldd
Duration: 35 hours
Prerequisites:

  • Une familiarité de base avec l'utilisation d'un système GNU/Linux en tant qu'utilisateur final
  • Une familiarité de base avec un shell en ligne de commande
  • Des connaissances de base en développement d'applications en espace utilisateur
  • Des connaissances intermédiaires en programmation C
  • Avoir suivi l'architecture des systèmes GNU/Linux embarqués auparavant (fortement recommandé !) et/ou avoir une bonne compréhension des sujets y étant abordés

Overview:

Description

Ce cours de formation de 5 jours utilise des exercices pratiques combinés à un enseignement pour illustrer les concepts liés aux internalités du noyau GNU/Linux et au développement de pilotes de périphériques. Il est conçu pour vous mettre à niveau rapidement. Nous décrivons les processus, les concepts et les commandes nécessaires à l'écriture de pilotes GNU/Linux à travers une combinaison de théorie et de formation en situation de travail.

Inventez la roue à votre façon, mais apprenez auprès d'un formateur expérimenté et repartez avec une connaissance opérationnelle et la capacité de l'utiliser efficacement dans votre propre projet de développement intégré.

À qui s'adresse cette formation ?

Personnes intéressées par ou chargées du développement ou de l'évaluation de pilotes GNU/Linux pour systèmes embarqués, tels que les ingénieurs logiciels, les ingénieurs terrain, les chefs de projet, les ingénieurs matériels.

Course Outline:

Introduction

  • Historique rapide de GNU/Linux
  • Licensing
  • Versionnement du noyau
  • Cycle de release
  • Arborescences du noyau
  • Branche principale (mainline)
  • Noyau vs espace utilisateur
  • Mécanisme vs politique
  • Alternatives aux pilotes de noyau
  • RTOS vs Linux

Gestion de la mémoire

  • Mémoire virtuelle vs mémoire physique
  • Allocation de mémoire dans le noyau
  • Pages
  • Zones
  • API
  • Slab

Patchs du noyau

  • Cycle de vie
  • Git
  • Source du noyau
  • Création de patch
  • Vérification de patch
  • Correction de patch
  • Livraison de patch
  • Code audité

Modules du noyau

  • Obtention des sources du noyau
  • Configuration/génération/installation
  • Pilotes de périphériques (liés statiquement, chargés au moment de l'exécution)
  • Init/exit
  • Licensing
  • EXPORT_SYMBOL GPL
  • Makefile hors arborescence du noyau
  • Module-init-tools
  • Module dans l'arborescence du noyau
  • Kconfig
  • Transmission de paramètres
  • Sparse

Pilotes caractère (Char Drivers)

  • Architecture
  • Interface utilisateur/noyau
  • Sous-système E/S
  • VFS (Filesystem Virtuel du Noyau)
  • sysfs (périphériques, bus, pilotes, classes),
  • kobject/ktype/kset
  • Modèle de pilote du noyau Linux
  • Fichiers de périphérique
  • Pilote caractère
    • Initialisation
    • Enregistrement
    • Ouverture, fermeture
    • cdev, ajout cdev, suppression cdev, ...
    • Numéros majeurs/mineurs
    • udev, udevmonitor, udevadm

Opérations avancées des pilotes caractère

  • ioctl
  • ioctl déverrouillé
  • ioctl de compatibilité
  • API espace utilisateur
  • API espace noyau
  • Cycle de vie du processus
  • Mise en veille/blocage
  • Mise en veille/réveil
  • File d'attente d'attente
  • Phénomène du troupeau tonitruant (thundering herd)
  • poll/select

Débogage du noyau

  • Débogage
  • Débogage du noyau
    • Recherche binaire avec git
    • Support de débogage depuis le noyau
    • printk syslogd, klogd, niveaux log, limitation de débit, niveaux de débogage, sous-systèmes ciblés
    • Débogage par interrogation de debugfs
    • Débogage d'oops, génération d'oops
    • Touche magique SysRq
    • kgdb/kdb
    • JTAG

Traçage

  • gcov
  • lcov
  • oprofile
  • ftrace
    • traceur nop
    • traceur de fonctions
    • traceur de changement de planification
    • traceur de graphe de fonctions
    • traceur dynamique
  • trace-cmd/kernelshark
  • perf
  • LTTng

Interruptions

  • Interruptions vs sondage
  • Interruption
  • Sections de programme
  • Réentrance
  • Événements
  • Gestionnaire d'interruption
  • Gestionnaire d'interruption partagé
  • Flux d'interruption
  • Contrôle d'interruption

Report de travail

  • Demi-haut/demi-bas
  • Softirqs
  • Tasklets
  • Files de travail
  • Interruptions threadées

Concurrence

  • Région/section critique
  • Opérations atomiques
  • Condition de concurrence
  • Synchronisation
  • Verrouillage
  • Solutions de verrouillage
  • Interblocage (deadlock)
  • Contention
  • Que verrouiller ?
  • Que peut-on utiliser ?
    • Opérations atomiques
    • Spinlocks
    • Spinlocks lecteur-écrivain
    • Sémaphore
    • Sémaphore binaire
    • Mutex
    • Sémaphore lecteur-écrivain
    • Variables de complétion
    • Verrous de séquentialité
    • Désactivation de la préemption
    • Ordre et barrières

Temps

  • HZ
  • Jiffies
  • Délais longs/courts
  • Minuteur du noyau

E/S matériel

  • Ports E/S
  • Mémoire E/S
  • Comment gérer les effets secondaires lors de l'accès aux registres ?

Communication utilisateur-noyau

  • put(get)_user()
  • copie vers(depuis)_user()
  • E/S du noyau
  • Mappage mémoire
  • procfs
  • sysfs
  • debugfs
  • relayfs
  • Netlink
  • ioctl

Portabilité

  • Taille des mots
  • Types opaques
  • Char signé/non signé
  • Alignement des données
  • Promotion entière
  • Réutilisation du code
  • Ordre des octets (endianness)
  • Ticks système
  • Taille des pages
  • Ordonnancement des instructions
  • SMP/préemption/mémoire haute

Sauf indication contraire, le contenu de ce programme est sous licence Attribution-Pas d'Utilisation Commerciale-Partage dans les Mêmes Conditions 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