Course Code: ldd
Duration: 35 hours
Prerequisites:
- Conhecimento básico sobre o uso de um sistema GNU/Linux como usuário final
- Conhecimento básico de um shell de linha de comando
- Conhecimento básico de desenvolvimento em espaço de usuário / aplicação
- Conhecimento intermediário de programação em C
- Deve ter participado anteriormente de Arquitetura de Sistemas GNU/Linux Embarcados (fortemente recomendado!) e/ou ter um bom entendimento dos tópicos descritos nesse curso.
Overview:
Descrição
Esta aula de treinamento de 5 dias utiliza exercícios práticos combinados com instrução para ilustrar os conceitos de integridade do kernel GNU/Linux e desenvolvimento de drivers de dispositivo. Foi projetada para colocá-lo atualizado rapidamente. Descrevemos processos, conceitos e comandos necessários para escrever drivers de dispositivo GNU/Linux através de uma combinação de teoria e treinamento prático.
Não reinvente a roda, mas aprenda com um instrutor experiente e leve para casa um conhecimento funcional e a capacidade de usá-lo efetivamente em seu próprio projeto de desenvolvimento embarcado.
Quem deve participar?
Indivíduos com interesse ou responsáveis pelo desenvolvimento ou avaliação do desenvolvimento de drivers de dispositivo GNU/Linux, como engenheiros de software, engenheiros de campo, gerentes (de projeto) e engenheiros de hardware.
Course Outline:
Introdução
- breve história do GNU/Linux
- licenciamento
- versionamento do kernel
- ciclo de lançamento
- árvores do kernel
- mainline
- kernel vs. espaço de usuário
- mecanismo vs. política
- alternativas para drivers de kernel
- RTOS vs. Linux
Gerenciamento de Memória
- memória virtual vs. memória física
- alocação de memória no kernel
- páginas
- zonas
- API
- slab
Patch do Kernel
- ciclo de vida
- git
- fonte do kernel
- criar patch
- verificar patch
- corrigir patch
- distribuir patch
- código auditado
Módulos do Kernel
- obter fontes do kernel
- configurar/compilar/instalar
- drivers de dispositivo (vinculados estaticamente, carregados em tempo de execução)
- init/exit
- licenciamento
- EXPORT SYMBOL GPL
- makefile fora da árvore do kernel
- module-init-tools
- módulo na árvore do kernel
- Kconfig
- passagem de parâmetros
- sparse
Drivers Char
- arquitetura
- interface usuário/kernel
- subsistema I/O
- VFS
- sysfs (dispositivos, barramento, drivers, classes),
- kobject/ktype/kset
- modelo de driver do kernel Linux
- arquivos de dispositivo
-
driver char
- inicialização
- registro
- open, release
- cdev, cdev_add, cdev_del,...
- números major/minor
- udev, udevmonitor, udevadm
Operações Avançadas de Driver Char
- ioctl
- ioctl unlocked
- compat ioctl
- API de espaço de usuário
- API de espaço de kernel
- ciclo de vida do processo
- sleep/bloqueio
- sleep/wake up
- wait queue
- thundering herd
- poll/select
Depuração de Kernel
- depuração
-
depurando o kernel
- busca binária com git
- suporte de depuração do kernel
- printk, syslogd, klogd, loglevels, rate limit, debug levels, debug selective subsystems
- depuração através da consulta ao debugfs
- depuração de oops, forçando oops
- Tecla Mágica SysRq
- kgdb/kdb
- JTAG
Rastreamento
- gcov
- lcov
- oprofile
-
ftrace
- nop tracer
- function tracer
- sched switch tracer
- function graph tracer
- dynamic tracer
- trace-cmd/kernelshark
- perf
- LTTng
Interrupções
- interrupções vs. polling
- interrupção
- seções de programa
- reentrancy
- eventos
- manipulador de interrupção
- manipulador de interrupção compartilhada
- fluxo de interrupção
- controle de interrupção
Adiar Trabalho
- top/bottom halves
- softirqs
- tasklets
- work queues
- interrupts encadeados
Concorrência
- região/seção crítica
- atomic
- condição de corrida
- sincronização
- locking
- soluções de locking
- deadlock
- contention
- o que bloquear?
-
o que pode ser usado?
- operações atômicas
- spin locks
- reader-writer spin locks
- semáforo
- semáforo binário
- mutex
- reader-writer semaphore
- variáveis de completamento
- sequential locks
- desativar preempção
- ordem e barreiras
Tempo
- HZ
- Jiffies
- atrasos grandes/pequenos
- timers do kernel
I/O de Hardware
- I/O Ports
- I/O Memory
- Como lidar com efeitos colaterais ao acessar registradores?
Comunicação Usuário-Kernel
- put(get)_user()
- copy to(from)_user()
- Kernel I/O
- mapeamento de memória
- procfs
- sysfs
- debugfs
- relayfs
- netlink
- ioctl
Portabilidade
- tamanho de palavra
- tipos opacos
- char assinado/não assinado
- alinhamento de dados
- promoção inteira
- reutilização de código
- endianess
- tick do sistema
- tamanho de página
- ordenação de instruções
- SMP/preempção/high memory
Exceto onde indicado de outra forma, o conteúdo e este esboço de curso estão licenciados sob Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0).
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
香港 - 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