Linux kernel programming Vandana Salve, LSI, Pune
Contents
Introduction to Linux systems Kernel modules Writing kernel modules Devices in Linux Writing sample character driver
A Linux system is…
Hardware Boot Loader Linux Kernel Linux kernel modules Root file systems User-mode programs
Boot Loader
X86 Example
GRUB – Grand Unified boot loader Configuration file /boot/grub/grub.conf
Kernel Binary image
/boot/vmlinuz-VERSION
Kernel Modules
Are dynamically loaded as needed by the kernel Once loaded, becomes part of kernel and has full access to all kernel functions /lib/modules/VERSION
The search path for kernel modules
Root file system
The root “/” is a global hierarchical namespace that contains several types of files
Regular files Directories Symbolic links Character/Block special files Named Pipes (FIFOs)
Kernel modules
Linux has the ability to extend at runtime the set of features offered by the kernel Each piece of code that can be added at runtime is called a “module”. Each module is made up of object code that can be dynamically linked to the running kernel by “insmod” and can be unlinked by “rmmod” program. Once loaded, becomes part of kernel and has full access to all kernel functions.
Utilities
Lsmod
Display list of currently loaded modules /proc/modules
Modinfo
Display module information /sbin/modinfo Filename,description,author,license etc
Insmod
Rmmod
Insert a module Remove a module
Modprobe
Loads modules plus any module dependencies Uses info provided in /lib/modules/Version/modules.dep Updated by depmod command
Writing a simple kernel module /* hello-1.c - The simplest kernel module. */ #include /* Needed by all modules */ #include /* Needed for KERN_INFO */ int init_module(void) { printk(KERN_INFO "Hello world 1.\n"); return 0; } void cleanup_module(void) { printk(KERN_INFO "Goodbye world 1.\n"); } MODULE_LICENSE(“GPL”); MODULE_AUTHOR(DRIVER_AUTHOR);//author MODULE_DESCRIPTION(“HELLO WORLD Module”);//what this module does
Makefile for a basic kernel module (2.6kernel) obj-m += hello-1.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Refer Documentation/kbuild/modules.txt : how to build modules Use modinfo, #modinfo hello-1.ko Use lsmod to list the module inserted Check /var/log/messages
Passing command line arguments to the module
Example
Device drivers
Option 1
Build device drivers into the kernel
Adv : driver available at boot time Dis-adv: need to load drivers that are rarely used,increase kernel size
Option 2
Build device driver as a kernel module
Adv : Load and unloaded as needed/not needed Dis-adv: potential attempts to load “bad” module into kernel
….continued
At the highest level of abstraction, all Linux device drivers fit into 1 of 3 categories
Character device
Block device
Can be accessed as stream of bytes;transfer byte at a time to/from user/kernel space Block device is something that can host a file system such as a disk; transfer block at a time to/from kernel filesystem
Network device
….continued
On Unix/Linux each piece of HW is represented by a file located in /dev/, named device file which provides the means to communicate with the hardware Major and Minor numbers # ls –l /dev/hda*
brw-rw---- 1 root disk 3, 1 Jul 5 2000 /dev/hda1 brw-rw---- 1 root disk 3, 2 Jul 5 2000 /dev/hda2 brw-rw---- 1 root disk 3, 3 Jul 5 2000 /dev/hda3
Major number
Minor number
Is used by driver to distinguish between the various hardware it controls
Mknod command
Tells you which driver is used to access the hardware All device files with same major number are controlled by same driver
Used to create the device file
See Documentation/devices.txt to see assigned major numbers
Character device drivers
File_operations structure
Every character driver needs to define functions perform by the device ‘File_operations’ structure holds the address of the modules functions that perform those operations File_operations defined in Linux/fs.h
….continued
Registering a device
Adding a driver to your system means registering it with the kernel “Register_chrdev” defined in Linux/fs.h int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
Major – major number Name – name of device, as it appears in /proc/devices Fops – file operation table
….continued
Unregistering a device
Whenever the module is unloaded, the major number should be released int unregister_chrdev(unsigned int major, const char *name);
Major – major number Name – name of device
Usage counter functions, defined in linux/module.h
try_module_get(THIS_MODULE);// Increment the use count module_put(THIS_MODULE);// Decrement the use count
Writing a simple character driver
Examples
Useful References for kernel programming
http://tldp.org/LDP/lkmpg/2.6/html/index.html
Kernel module programming,
http://lwn.net/Kernel/LDD3/
Device drivers programming