Kernel module programming

19
Introduction to kernel modules Objectives Understanding Kernel modules Writing a simple kernel module Compiling the kernel module Loading and unloading of modules Kernel log Module dependencies Modules vs Programs

description

This presentation gives introduction to kernel module programming with sample kernel module. It helps to start with kernel programming and how it can be used to develop various types of device drivers.

Transcript of Kernel module programming

Page 1: Kernel module programming

Introduction to kernel modules

• Objectives• Understanding Kernel modules• Writing a simple kernel module• Compiling the kernel module• Loading and unloading of modules• Kernel log• Module dependencies• Modules vs Programs

Page 2: Kernel module programming

Kernel modules

• Linux kernel has the ability to extend at runtime the set of features offered by the kernel.

• This means that you can add functionality to the kernel while the system is up and running.

• Modules are pieces of code that can be loaded and unloaded into the kernel upon demand.

• For example, one type of module is the device driver, which allows the kernel to access hardware connected to the system.

• Without modules, we would have to build monolithic kernels and add new functionality directly into the kernel image.

• Besides having larger kernels, this has the disadvantage of requiring us to rebuild and reboot the kernel every time we want new functionality.

Page 3: Kernel module programming

Module utilities

• modinfo <module_name>• Gets information about the module: parameters, license, descriptions

and dependencies• insmod <module_name>.ko

• Load the given module. Full path of module is needed• rmmod <module_name>

• Unloads the given module• lsmod <module_name>

• Displays the list of modules loaded.• Check /proc/modules file

• modprobe• Loads the kernel modules plus any module dependencies

Page 4: Kernel module programming

Write simple module#include <linux/module.h>#include <linux/kernel.h>static int __init hello_init(void){

printk(“Hello :This is my first kernel module\n");return 0;

}static void __exit hello_exit(void){

printk(“Bye, unloading the module\n");}module_init(hello_init);module_exit(hello_exit);MODULE_DESCRIPTION(“Sample module"); MODULE_AUTHOR(Vandana Salve");MODULE_LICENSE("GPL");

Page 5: Kernel module programming

Module explanation

• Headers specific to the linux kernel <linux/xxx.h>• No access to the usual C library

• An initialization function• Called when the module is loaded using insmod/modprobe tool• Perform all the initialization functionality• Returns an error code

• 0- success• negative value on failure, errors defined in header file

• Declared by the module_init() macro

Page 6: Kernel module programming

Module explanation

• A cleanup function• Called when the module is unloaded using rmmod tool• Perform all the cleanup functionality• Declared by the module_exit() macro.

• Metadata information – MODULE_DESCRIPTION

• Add description about the kernel module– MODULE_AUTHOR

• Add the information about the author of the module– MODULE LICENSE

• Add license for example GPL

Page 7: Kernel module programming

Compiling a module• Kernel modules need to be compiled a bit differently from regular user

space apps. • To learn more on how to compile modules which are not part of the

official kernel, see file linux/Documentation/kbuild/modules.txt.

• Option1: Inside the kernel tree– Well integrated into the kernel configuration/compilation process. – Driver can be build statistically if needed

Page 8: Kernel module programming

Contd…• Option 2: Out of tree

– When the code is outside of the kernel source tree, in a different directory.

– Advantage• Easier to handle than modifications to the kernel itself.

– Disadvantage• Not integrated to the kernel configuration/compilation process,

needs to be build separately• driver cannot be built statistically if needed.

Page 9: Kernel module programming

Compiling an out-of-tree module

• When the kernel module code is outside of the kernel source tree, i.e. in a different directory.

Module source/path/to/

module/source

Hello.cHello.koMakefile

Kernel sources/path/to/

kernel/sources

DriversKernel

Header filesMakefiles

Page 10: Kernel module programming

Makefile for basic kernel module

• KDIR := /path/to/kernel/sources

obj-m := hello.oall:

make -C $(KDIR) M=$(PWD) modulesclean:

make –C $(KDIR) M=$(PWD) clean

• Refer Documentation/kbuild/modules.txt for details

Page 11: Kernel module programming

Overview of make & makefiles• The “make” program automates the building of software based on

specification of dependencies among the files.• “make” determines which pieces of a large program need to be

recompiled and issue commands to recompile them.• To use make, you must write a file called makefile.• A makefile is simple a way of associating short names, called ‘targets’, with

a series of commands to execute when the action is requested. • $make clean

– Target clean, performs actions that clean up after the compilation—removing object files and resulting executable.

• $make [all]– Target all, performs action that compile the filesv

Page 12: Kernel module programming

Kernel log

• When a new module is loaded, related information is available in the kernel log.– The kernel keeps its messages in a circular buffer.– Kernel log messages are available through the ‘dmesg’ command– Kernel log messages can be seen in /var/log/messages and/or

/var/log/syslog file

Page 13: Kernel module programming

Module dependencies

• Some kernel module can depend on other modules, which need to be loaded first.

• Dependencies are described in /lib/modules/<kernel-version>/modules.dep

• This file is generated when you run make modules_install• sudo modprobe <module_name>

– Loads all the modules the given module depends on. Modprobe looks into /lib/modules/<kernel-version> for the object file corresponding to the given module

• Sudo modprobe –r <module_name>– Remove the module and all dependent modules, which are no longer

needed.

Page 14: Kernel module programming

Applications Vs. Kernel modules

Application• Performs single task from

beginning to end• Application can call functions,

which it doesn’t define. The linking stage resolves the external references loading the appropriate libraries. E.g libc for ‘printf’ function.

Kernel module• Module registers itself to serve

the future request and its ‘main’ function terminates on loading.

• The module is linked only to the kernel and it can only the functions that are exported by the kernel.

• No C library is linked with the kernel.

Page 15: Kernel module programming

Functions available to modules

• In the hello world example, you might have noticed that we used a function, printk() but didn't include a standard I/O library.

• That's because modules are object files whose symbols get resolved upon insmod'ing.

• The definition for the symbols comes from the kernel itself; the only external functions you can use are the ones provided by the kernel.

• If you're curious about what symbols have been exported by your kernel, take a look at /proc/kallsyms.

Page 16: Kernel module programming

Passing command line arguments

• Modules can take command line arguments, but not with the argc/argv you might be used to.

• To allow arguments to be passed to your module, declare the variables that will take the values of the command line arguments as global and then use the module_param() macro, to set the mechanism up.

• At runtime, insmod will fill the variables with any command line arguments that are given

Page 17: Kernel module programming

Contd…

• $insmod hello_2.ko int_param=50• The variable declarations and macros should be placed at the beginning of

the module for clarity.• The module_param() macro takes 3 arguments:

– the name of the variable, – its type and permissions for the corresponding file in sysfs. – Integer types can be signed as usual or unsigned.

• If you'd like to use arrays of integers or strings see – module_param_array() and – module_param_string().

Page 18: Kernel module programming

Advantages of modules

• Modules make it easy to develop drivers without rebooting: load, test, unload, rebuild & again load and so on.

• Useful to keep the kernel size to the minimum (essential in embedded systems). Without modules , would need to build monolithic kernel and add new functionality directly into the kernel image.

• Also useful to reduce boot time, you don’t need to spend time initializing device that may not be needed at boot time.

• Once loaded, modules have full control and privileges in the system. That’s why only the root user can load and unload the modules.

Page 19: Kernel module programming

Usage of modules

• Character device drivers• Block device drivers• Network device drivers• File systems• Any type of device drivers handling the different types of devices such as

USB, I2C etc. etc.• Kernel modules can be used to implement any functionality needed

runtime on demand