KEMBAR78
Part 02 Linux Kernel Module Programming | PDF
Linux Kernel Module Programming
Tushar B. Kute,
http://tusharkute.com
Kernel Modules
• Kernel modules are piece of code, that can be loaded and
unloaded from kernel on demand.
• Kernel modules offers an easy way to extend the
functionality of the base kernel without having to rebuild
or recompile the kernel again. Most of the drivers are
implemented as a Linux kernel modules. When those
drivers are not needed, we can unload only that specific
driver, which will reduce the kernel image size.
• The kernel modules will have a .ko extension. On a
normal linux system, the kernel modules will reside inside
/lib/modules/<kernel_version>/kernel/ directory.
Examples:
• Typical modules:
– Device drivers
– File system drivers
– System calls
Advantages
• There is no necessity to rebuild the kernel,
when a new kernel option is added.
• Modules help find system problems (if
system problem caused a module just don't
load it).
• Modules are much faster to maintain and
debug.
• Modules once loaded are in as much fast as
kernel.
Utilities to manipulate kernel modules
• lsmod
• insmod
• modinfo
• rmmod
• modprobe
lsmod
• Lists modules that are loaded already.
• Check the command: cat /proc/modules
• Display module information.
modinfo
• Insert module into kernel.
• Syntax:
–insmod <module_name>.ko
insmod
• Removes module from kernel. You cannot
remove a module which is already used by
any program.
• Syntax:
–rmmod <module_name>.ko
rmmod
• The kernel considers only modules that have been
loaded into RAM by the insmod program and for
each of them allocates memory area containing:
– A module object.
– Null terminated string that represents module's
name.
– The code that implements the functions of the
module.
Kernel Module Implementation
• Write a hello_proc.c program
• Create a Makefile
• The program and Makefile should be kept in a single
folder.
• Change directory to this folder and execute following:
– make
– insmod hello_proc.ko
– dmesg  (see the kernel buffer contents, reads the kernel
log file /var/log/syslog)
– lsmod
– cat /proc/hello_proc
Linux Kernel Module Programming
• hello.o
– Module object file before linking.
• hello.mod.c
– Contains module’s information.
• hello.mod.o
– After compilation and linking of hello.mod.c.
• modules.order
– The order in which two or three modules get linked.
• Modules.symvers
– Symbol versions if any.
• hello.ko
– A module kernel object file after linking hello.o and hello.mod.o
Files created after building the module
#include <linux/module.h>    // included for all kernel modules
#include <linux/kernel.h>    // included for KERN_INFO
#include <linux/init.h>      // included for __init and __exit macros
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Tushar B Kute");
MODULE_DESCRIPTION("A Simple Hello World module");
static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world!n");
    return 0; // Non­zero return means that the module couldn't be 
loaded.
}
static void __exit hello_cleanup(void)
{
    printk(KERN_INFO "Good Bye.n");
}
module_init(hello_init);
module_exit(hello_cleanup);
Example: hello.c
obj­m += hello.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
Makefile
• make
Compile the program
File generated
• insmod hello.ko
Insert the module
• lsmod
Check the module in the list
hello module
• dmesg
Check kernel ring buffer
Output of hello module
• dmesg | tail ­1
Check kernel ring buffer
• rmmod hello.ko
• dmesg or
• dmesg | tail ­1
Removing the module
• The dmesg command is used to write the kernel
messages in Linux and other Unix-like operating
systems to standard output (which by default is the
display screen).
• dmesg obtains its data by reading the kernel ring buffer.
A buffer is a portion of a computer's memory that is set
aside as a temporary holding place for data that is being
sent to or received from an external device, such as a
hard disk drive (HDD), printer or keyboard.
• A ring buffer is a buffer of fixed size for which any new
data added to it overwrites the oldest data in it.
What is dmesg?
• The kernel print function, printk(), behaves almost
identically to the C library printf() function.
• printk( ) is simply the name of the kernel's formatted
print function. It is callable from just about anywhere in
the kernel at any time.
• The major difference between printk() and printf() is
the capability of the former to specify a loglevel.
• The kernel uses the loglevel to decide whether to print
the message to the console. The kernel displays all
messages with a loglevel below a specified value on the
console.
What is printk?
printk(KERN_WARNING "This is a warning!n");
printk(KERN_DEBUG "This is a debug notice!n");
printk("I did not specify a loglevel!n");
printk : example
tushar@tusharkute.com
Thank you
This presentation is created using LibreOffice Impress 4.2.7.2, can be used freely as per GNU General Public License
Blogs
http://digitallocha.blogspot.in
http://kyamputar.blogspot.in
Web Resources
http://tusharkute.com

Part 02 Linux Kernel Module Programming