Embedded GNU/Linux Kernel Internals and Device Drivers ( ldd | 35 hours )

Prerequisites:
  • 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
Overview:

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.

Course Outline:

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).

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 - 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