© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Introduction to Linux Drivers
2© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
What to Expect?
After this session, you would know
W's of Linux Drivers
Ecosystem of Linux Drivers
Types of Linux Drivers
Vertical & Horizontal Driver Layering
Various Terminologies in vogue
Linux Driver related Commands & Configs
Using a Linux Driver
Our First Linux Driver
3© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
W's of Linux Drivers
What is a Driver?
What is a Linux Driver?
Is Linux Device Driver = Linux Driver?
Why we need a Driver?
What are the roles of Linux Driver?
4© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Functions of an OS
Process / Time / Processor Management
Memory Management
Device I/O Management
Storage Management
Network Management
5© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Linux as an OS
So, Linux also has the same structure
Visually, can be shown as
6© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Linux Driver Ecosystem
bash gvim X Server gcc firefox
`
Process
Management
ssh
Memory
Management
File Systems
Device
Control
Networking
Architecture
Dependent
Code
Character
Drivers
&
Friends
Memory
Manager
Filesystem
Layer
Block Layer
& Drivers
Network
Subsystem
Interface
Drivers
Concurrency
MultiTasking
Virtual
Memory
Files & Dirs:
The VFS
Ttys &
Device Access
Connectivity
CPU Memory
Disks &
CDs
Consoles,
etc
Network
Interfaces
Hardware Protocol Layers like PCI, USB, I2C, RS232, ...
7© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Kernel Source Organization
/usr/src/linux/
net
drivers
block
fs
mm
init
arch/<arch>
char mtd/ide net pci ...usbserial
include
asm-<arch>linux
kernel ipc lib scripts toolsscripts
crypto firmware security sound ...
8© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
W's of a Module?
Hot plug-n-play Driver
Dynamically Loadable & Unloadable
Linux – the first OS to have such a feature
Later many followed suit
Enables fast development cycle
File: <module>.ko (Kernel Object)
<module>.o wrapped with kernel signature
Std Modules Path
/lib/modules/<kernel version>/kernel/...
Module Configuration: /etc/modprobe.conf
9© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Module Commands
Typically needs root permission
Resides in /sbin
Operates over the kernel-module i/f
Foundation of Driver Development
Need to understand thoroughly
10© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Listing Modules
Command: lsmod
Fields: Module, Size, Used By
Kernel Window: /proc/modules
Are these listed modules static or dynamic?
11© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Loading Modules
Command: insmod <module_file>
Go to modules directory and into fs/vfat
Try: insmod vfat.ko
12© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Unloading Modules
Command: rmmod <module_name>
Try: rmmod fat
13© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Auto Loading Modules
Command: modprobe <module_name>
Try: modprobe vfat
14© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Kernel Windows
Through virtual filesystems
/proc
/sys
Command: cat <window_file>
System Logs: /var/log/messages
Command:
tail /var/log/messages
dmesg | tail
15© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Other Useful Commands
Disassemble: objdump -d <object_file>
List symbols: nm <object_file>
16© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Command Summary
lsmod
insmod
modprobe
rmmod
dmesg
objdump
nm
17© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
The First Linux Driver
18© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
The Kernel's C
Normal C but without access to
Standard Headers (/usr/include)
Standard Libraries (/usr/lib)
Then, what?
Kernel Headers @ <kernel src>/include
Kernel Function Collection @
<kernel src>/kernel
<kernel src>/ipc
<kernel src>/lib
gcc need to be tuned to compile “Kernel C”
Kernel C is a beautiful example of implementing object
oriented code using pure C
19© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
The Module Constructor
static int __init mfd_init(void)
{
...
return 0;
}
module_init(mfd_init);
20© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
The Module Destructor
static void __exit mfd_exit(void)
{
...
}
module_exit(mfd_exit);
21© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
printk – Kernel's printf
Header: <linux/kernel.h>
Arguments: Same as printf
Format Specifiers: All as in printf, except float & double related
Additionally, a initial 3 character sequence for Log Level
KERN_EMERG "<0>" /* system is unusable */
KERN_ALERT "<1>" /* action must be taken immediately */
KERN_CRIT "<2>" /* critical conditions */
KERN_ERR "<3>" /* error conditions */
KERN_WARNING "<4>" /* warning conditions */
KERN_NOTICE "<5>" /* normal but significant condition */
KERN_INFO "<6>" /* informational */
KERN_DEBUG "<7>" /* debug-level messages */
22© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
The Module Constructor (revisited)
static int __init mfd_init(void)
{
printk(KERN_INFO "mfd registered");
...
return 0;
}
module_init(mfd_init);
23© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
The Module Destructor (revisited)
static void __exit mfd_exit(void)
{
printk(KERN_INFO "mfd deregistered");
...
}
module_exit(mfd_exit);
24© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
The Other Basics & Ornaments
Basic Headers
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia");
MODULE_DESCRIPTION("First Device Driver");
25© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Building the Module
For building our driver, it needs
The Kernel Headers for Prototypes
The Kernel Functions for Functionality
The Kernel Build System & the Makefile for Building
Two options to Achieve
1. Building under Kernel Source Tree
Put our driver appropriately under drivers folder
Edit corresponding Kconfig(s) & Makefile to include our
driver
2. Create our own Makefile to do the right invocation
26© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Our Makefile
ifeq (${KERNELRELEASE},)
KERNEL_SOURCE := <kernel source directory path>
PWD := $(shell pwd)
default:
$(MAKE) -C ${KERNEL_SOURCE} SUBDIRS=$(PWD) modules
clean:
$(MAKE) -C ${KERNEL_SOURCE} SUBDIRS=$(PWD) clean
else
obj-m += <module>.o
endif
27© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Try out your First Linux Driver
28© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
What all have we learnt?
W's of Linux Drivers
Ecosystem of Linux Drivers
Types of Linux Drivers
Vertical & Horizontal Driver Layering
Various Terminologies in vogue
Linux Driver related Commands & Configs
Using a Linux Driver
Our First Linux Driver
29© 2010-17 SysPlay Workshops <workshop@sysplay.in>
All Rights Reserved.
Any Queries?

Introduction to Linux Drivers

  • 1.
    © 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Introduction to Linux Drivers
  • 2.
    2© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. What to Expect? After this session, you would know W's of Linux Drivers Ecosystem of Linux Drivers Types of Linux Drivers Vertical & Horizontal Driver Layering Various Terminologies in vogue Linux Driver related Commands & Configs Using a Linux Driver Our First Linux Driver
  • 3.
    3© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. W's of Linux Drivers What is a Driver? What is a Linux Driver? Is Linux Device Driver = Linux Driver? Why we need a Driver? What are the roles of Linux Driver?
  • 4.
    4© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Functions of an OS Process / Time / Processor Management Memory Management Device I/O Management Storage Management Network Management
  • 5.
    5© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Linux as an OS So, Linux also has the same structure Visually, can be shown as
  • 6.
    6© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Linux Driver Ecosystem bash gvim X Server gcc firefox ` Process Management ssh Memory Management File Systems Device Control Networking Architecture Dependent Code Character Drivers & Friends Memory Manager Filesystem Layer Block Layer & Drivers Network Subsystem Interface Drivers Concurrency MultiTasking Virtual Memory Files & Dirs: The VFS Ttys & Device Access Connectivity CPU Memory Disks & CDs Consoles, etc Network Interfaces Hardware Protocol Layers like PCI, USB, I2C, RS232, ...
  • 7.
    7© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Kernel Source Organization /usr/src/linux/ net drivers block fs mm init arch/<arch> char mtd/ide net pci ...usbserial include asm-<arch>linux kernel ipc lib scripts toolsscripts crypto firmware security sound ...
  • 8.
    8© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. W's of a Module? Hot plug-n-play Driver Dynamically Loadable & Unloadable Linux – the first OS to have such a feature Later many followed suit Enables fast development cycle File: <module>.ko (Kernel Object) <module>.o wrapped with kernel signature Std Modules Path /lib/modules/<kernel version>/kernel/... Module Configuration: /etc/modprobe.conf
  • 9.
    9© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Module Commands Typically needs root permission Resides in /sbin Operates over the kernel-module i/f Foundation of Driver Development Need to understand thoroughly
  • 10.
    10© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Listing Modules Command: lsmod Fields: Module, Size, Used By Kernel Window: /proc/modules Are these listed modules static or dynamic?
  • 11.
    11© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Loading Modules Command: insmod <module_file> Go to modules directory and into fs/vfat Try: insmod vfat.ko
  • 12.
    12© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Unloading Modules Command: rmmod <module_name> Try: rmmod fat
  • 13.
    13© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Auto Loading Modules Command: modprobe <module_name> Try: modprobe vfat
  • 14.
    14© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Kernel Windows Through virtual filesystems /proc /sys Command: cat <window_file> System Logs: /var/log/messages Command: tail /var/log/messages dmesg | tail
  • 15.
    15© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Other Useful Commands Disassemble: objdump -d <object_file> List symbols: nm <object_file>
  • 16.
    16© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Command Summary lsmod insmod modprobe rmmod dmesg objdump nm
  • 17.
    17© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. The First Linux Driver
  • 18.
    18© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. The Kernel's C Normal C but without access to Standard Headers (/usr/include) Standard Libraries (/usr/lib) Then, what? Kernel Headers @ <kernel src>/include Kernel Function Collection @ <kernel src>/kernel <kernel src>/ipc <kernel src>/lib gcc need to be tuned to compile “Kernel C” Kernel C is a beautiful example of implementing object oriented code using pure C
  • 19.
    19© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. The Module Constructor static int __init mfd_init(void) { ... return 0; } module_init(mfd_init);
  • 20.
    20© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. The Module Destructor static void __exit mfd_exit(void) { ... } module_exit(mfd_exit);
  • 21.
    21© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. printk – Kernel's printf Header: <linux/kernel.h> Arguments: Same as printf Format Specifiers: All as in printf, except float & double related Additionally, a initial 3 character sequence for Log Level KERN_EMERG "<0>" /* system is unusable */ KERN_ALERT "<1>" /* action must be taken immediately */ KERN_CRIT "<2>" /* critical conditions */ KERN_ERR "<3>" /* error conditions */ KERN_WARNING "<4>" /* warning conditions */ KERN_NOTICE "<5>" /* normal but significant condition */ KERN_INFO "<6>" /* informational */ KERN_DEBUG "<7>" /* debug-level messages */
  • 22.
    22© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. The Module Constructor (revisited) static int __init mfd_init(void) { printk(KERN_INFO "mfd registered"); ... return 0; } module_init(mfd_init);
  • 23.
    23© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. The Module Destructor (revisited) static void __exit mfd_exit(void) { printk(KERN_INFO "mfd deregistered"); ... } module_exit(mfd_exit);
  • 24.
    24© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. The Other Basics & Ornaments Basic Headers #include <linux/module.h> #include <linux/version.h> #include <linux/kernel.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Anil Kumar Pugalia"); MODULE_DESCRIPTION("First Device Driver");
  • 25.
    25© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Building the Module For building our driver, it needs The Kernel Headers for Prototypes The Kernel Functions for Functionality The Kernel Build System & the Makefile for Building Two options to Achieve 1. Building under Kernel Source Tree Put our driver appropriately under drivers folder Edit corresponding Kconfig(s) & Makefile to include our driver 2. Create our own Makefile to do the right invocation
  • 26.
    26© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Our Makefile ifeq (${KERNELRELEASE},) KERNEL_SOURCE := <kernel source directory path> PWD := $(shell pwd) default: $(MAKE) -C ${KERNEL_SOURCE} SUBDIRS=$(PWD) modules clean: $(MAKE) -C ${KERNEL_SOURCE} SUBDIRS=$(PWD) clean else obj-m += <module>.o endif
  • 27.
    27© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Try out your First Linux Driver
  • 28.
    28© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. What all have we learnt? W's of Linux Drivers Ecosystem of Linux Drivers Types of Linux Drivers Vertical & Horizontal Driver Layering Various Terminologies in vogue Linux Driver related Commands & Configs Using a Linux Driver Our First Linux Driver
  • 29.
    29© 2010-17 SysPlayWorkshops <workshop@sysplay.in> All Rights Reserved. Any Queries?