Embedded GNU/Linux Kernel Internals and Device Drivers ( ldd | 35 hours )
- Basic familiarity with using a GNU/Linux system as an end user
- Basic familiarity with a command line shell
- Basic knowledge of user space / application development
- Intermediate C programming knowledge
- Should have attended Embedded GNU/Linux Systems Architecture before (strongly recommended!) and/or have a good understanding of the topics outlined there
Description
This 5-day training class uses hands-on exercises combined with instruction to illustrate the concepts of GNU/Linux kernel internals and device driver development. It is desinged to bring you quickly up to speed. We describe processes, concepts and commands necessary to write GNU/Linux device drivers through a combination of theory and on-the-job training.
Don't reinvent the wheel, but learn from an experienced trainer and take home a working knowledge and the ability to use it effectively in your own embedded development project.
Who should attend?
People with interest in or tasked with the development or evaluation of developing GNU/Linux device drivers like software engineers, field engineers, (project) managers, hardware engineers.
Introduction
- quick history of GNU/Linux
- licensing
- kernel versioning
- release cycle
- kernel trees
- mainline
- kernel vs. user space
- mechanism vs. policy
- kernel driver alternatives
- RTOS vs. Linux
Memory Management
- Virtual memory vs. physical memory
- memory allocation in kernel
- pages
- zones
- API
- slab
Kernel Patch
- life cycle
- git
- kernel source
- create patch
- check patch
- fix patch
- ship patch
- audited code
Kernel Modules
- get kernel sources
- configure/build/install
- device drivers (statically linked, loaded at runtime)
- init/exit
- licensing
- EXPORT SYMBOL GPL
- out of tree makefile
- module-init-tools
- module in kernel tree
- Kconfig
- parameter passing
- sparse
Char Drivers
- architecture
- user/kernel interface
- I/O subsystem
- VFS
- sysfs (devices, bus, drivers, classes),
- kobject/ktype/kset
- linux kernel driver model
- device files
- char driver
- initialization
- registration
- open, release
- cdev, cdev add, cdev del,...
- major/minor numbers
- udev, udevmonitor, udevadm
Advanced Charachter Driver Operations
- ioctl
- unlocked ioctl
- compat ioctl
- user space API
- kernel space API
- process lifecycle
- sleeping/blocking
- sleeping/waking up
- wait queue
- thundering herd
- poll/select
Kernel Debugging
- bug
- debugging
- debugging the kernel
- binary search with git
- debug support from kernel
- printk syslogd, klogd, loglevels, rate limit, debug levels, debug selective subsystems
- debugging by querying debugfs
- oops debugging, asserting oops
- Magic SysRq Key
- kgdb/kdb
- JTAG
Tracing
- gcov
- lcov
- oprofile
- ftrace
- nop tracer
- function tracer
- sched switch tracer
- function graph tracer
- dynamic tracer
- trace-cmd/kernelshark
- perf
- LTTng
Interrupts
- interrupts vs. polling
- interrupt
- program sections
- reentrancy
- events
- interrupt handler
- shared interrupt handler
- interrupt flow
- interrupt control
Deferring Work
- top/bottom halves
- softirqs
- tasklets
- work queues
- threaded interrrupts
Concurrency
- critical region/section
- atomic
- race condition
- synchronization
- locking
- locking solutions
- deadlock
- contention
- what to lock?
- what can be used?
- atomic operations
- spin locks
- reader-writer spin locks
- semaphore
- binary semaphore
- mutex
- reader-writer semaphore
- completion variables
- sequential locks
- disable preemption
- orderig and barriers
Time
- HZ
- Jiffies
- big/small delays
- kernel timers
Hardware I/O
- I/O Ports
- I/O Memory
- How to deal with side effects accessing registers?
User-Kernel Communication
- put(get)_user()
- copy to(from)_user()
- Kernel I/O
- memory mapping
- procfs
- sysfs
- debugfs
- relayfs
- netlink
- ioctl
Portability
- word size
- opaque types
- signed/unsigned char
- data alignment
- integral promotion
- code reuse
- endianess
- system tick
- page size
- instruction ordering
- SMP/preemption/high memory
Except where otherwise noted content and this course outline are licensed under 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 - Embedded GNU/Linux Kernel Internals and Device Drivers
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
台灣 - Embedded GNU/Linux Kernel Internals and Device Drivers
USA - Embedded GNU/Linux Kernel Internals and Device Drivers
Österreich - Embedded GNU/Linux Kernel Internals and Device Drivers
Schweiz - Embedded GNU/Linux Kernel Internals and Device Drivers
Deutschland - Embedded GNU/Linux Kernel Internals and Device Drivers
Czech Republic - Embedded GNU/Linux Kernel Internals and Device Drivers
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 - Embedded GNU/Linux Kernel Internals and Device Drivers
Magyarország - Embedded GNU/Linux Kernel Internals and Device Drivers
Ireland - Embedded GNU/Linux Kernel Internals and Device Drivers
Israel - 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 - Embedded GNU/Linux Kernel Internals and Device Drivers
Italia - Embedded GNU/Linux Kernel Internals and Device Drivers
Lithuania - Embedded GNU/Linux Kernel Internals and Device Drivers
Nederland - Embedded GNU/Linux Kernel Internals and Device Drivers
Norway - Embedded GNU/Linux Kernel Internals and Device Drivers
Portugal - Embedded GNU/Linux Kernel Internals and Device Drivers
România - Embedded GNU/Linux Kernel Internals and Device Drivers
Sverige - Embedded GNU/Linux Kernel Internals and Device Drivers
Turkey - Embedded GNU/Linux Kernel Internals and Device Drivers
Malta - Embedded GNU/Linux Kernel Internals and Device Drivers
Belgique - Embedded GNU/Linux Kernel Internals and Device Drivers
France - Embedded GNU/Linux Kernel Internals and Device Drivers
日本 - Embedded GNU/Linux Kernel Internals and Device Drivers
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 - Embedded GNU/Linux Kernel Internals and Device Drivers
India - Embedded GNU/Linux Kernel Internals and Device Drivers
Argentina - Embedded GNU/Linux Kernel Internals and Device Drivers
Chile - Embedded GNU/Linux Kernel Internals and Device Drivers
Costa Rica - Embedded GNU/Linux Kernel Internals and Device Drivers
Ecuador - Embedded GNU/Linux Kernel Internals and Device Drivers
Guatemala - Embedded GNU/Linux Kernel Internals and Device Drivers
Colombia - Embedded GNU/Linux Kernel Internals and Device Drivers
México - Embedded GNU/Linux Kernel Internals and Device Drivers
Panama - Embedded GNU/Linux Kernel Internals and Device Drivers
Peru - Embedded GNU/Linux Kernel Internals and Device Drivers
Uruguay - Embedded GNU/Linux Kernel Internals and Device Drivers
Venezuela - Embedded GNU/Linux Kernel Internals and Device Drivers
Polska - Embedded GNU/Linux Kernel Internals and Device Drivers
United Kingdom - Embedded GNU/Linux Kernel Internals and Device Drivers
South Korea - Embedded GNU/Linux Kernel Internals and Device Drivers
Pakistan - Embedded GNU/Linux Kernel Internals and Device Drivers
Sri Lanka - Embedded GNU/Linux Kernel Internals and Device Drivers
Bulgaria - Embedded GNU/Linux Kernel Internals and Device Drivers
Bolivia - Embedded GNU/Linux Kernel Internals and Device Drivers
Indonesia - Embedded GNU/Linux Kernel Internals and Device Drivers
Kazakhstan - Embedded GNU/Linux Kernel Internals and Device Drivers
Moldova - Embedded GNU/Linux Kernel Internals and Device Drivers
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