0% found this document useful (0 votes)
921 views

Linux Kernel Programming

This document provides an overview of Linux kernel programming and writing kernel modules. It discusses the key components of a Linux system including the kernel, kernel modules, and root file system. It then describes how to write simple kernel modules in C, build them, load and unload modules, and pass command line arguments. The document also discusses character device drivers and provides an example of writing a simple character driver.

Uploaded by

Neependra Khare
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
921 views

Linux Kernel Programming

This document provides an overview of Linux kernel programming and writing kernel modules. It discusses the key components of a Linux system including the kernel, kernel modules, and root file system. It then describes how to write simple kernel modules in C, build them, load and unload modules, and pass command line arguments. The document also discusses character device drivers and provides an example of writing a simple character driver.

Uploaded by

Neependra Khare
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 20

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
 Insert a module
 Rmmod
 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 <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
 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
 Tells you which driver is used to access the hardware
 All device files with same major number are controlled by same driver
 Minor number
 Is used by driver to distinguish between the various hardware it controls
 Mknod command
 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

You might also like