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 Display module information /sbin/modinfo Filename,description,author,license etc

Modinfo
  

Insmod

Insert a module Remove a module Loads modules plus any module dependencies Uses info provided in /lib/modules/Version/modules.dep Updated by depmod command

Rmmod

Modprobe
 

Writing a simple kernel module
/* hello-1.c - The simplest kernel module. */ #include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* 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

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

Block device

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

Tells you which driver is used to access the hardware All device files with same major number are controlled by same driver Is used by driver to distinguish between the various hardware it controls Used to create the device file

Minor number

Mknod command

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, Device drivers programming

http://lwn.net/Kernel/LDD3/

Sign up to vote on this title
UsefulNot useful