Linux kernel module basics

Linux kernel module basics

A basic example of a loadable kernel module, loading, debugging and build.

Example source code

#include <linux/module.h>
int skeleton_init_module(void) {
	printk("loaded skeleton");
	return 0;
}

void skeleton_cleanup_module(void) {
	printk("unloaded skeleton");
}

module_init(init_module);
module_exit(cleanup_module);

MODULE_LICENSE("GPL");

Compile

sean@kilgore:~/src/linux/drivers/skeleton$ make -C /lib/modules/`uname -r`/build M=$PWD modules
make: Entering directory '/usr/src/linux-headers-5.11.0-27-generic'
  CC [M]  /home/sean/src/linux/drivers/skeleton/skeleton.o
  MODPOST /home/sean/src/linux/drivers/skeleton/Module.symvers
  LD [M]  /home/sean/src/linux/drivers/skeleton/skeleton.ko
make: Leaving directory '/usr/src/linux-headers-5.11.0-27-generic'

Install and remove

sean@kilgore:~/src/linux/drivers/skeleton$ sudo insmod skeleton.ko
sean@kilgore:~/src/linux/drivers/skeleton$ sudo rmmod skeleton
sean@kilgore:~/src/linux/drivers/skeleton$ dmesg |tail -2
[56316.812072] loaded skeleton
[56344.166820] unloaded skeleton

Tracing

root@kilgore:/sys/kernel/debug/tracing# echo 0 > tracing_on
root@kilgore:/sys/kernel/debug/tracing# echo function_graph > current_tracer
root@kilgore:/sys/kernel/debug/tracing# echo > trace
root@kilgore:/sys/kernel/debug/tracing# echo :mod:skeleton > set_ftrace_filter
root@kilgore:/sys/kernel/debug/tracing# echo 1 > tracing_on
root@kilgore:/sys/kernel/debug/tracing# insmod ~sean/src/linux/drivers/skeleton/skeleton.ko
root@kilgore:/sys/kernel/debug/tracing# cat trace
# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |
 0)   8.547 us    |  cleanup_module [skeleton]();
root@kilgore:/sys/kernel/debug/tracing# echo 0 > tracing_on

Editing source

With ubuntu source as example In addition to the below changes the module was added to the parent Makefile.

sean@kilgore:~/src/ubuntu-focal$ git checkout -b module-work
Switched to a new branch 'module-work'

sean@kilgore:~/src/ubuntu-focal$ git diff HEAD
diff --git a/drivers/Makefile b/drivers/Makefile
index 0d2354897ff6..c4a8ee84cd3b 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -5,7 +5,7 @@
 # 15 Sep 2000, Christoph Hellwig <hch@infradead.org>
 # Rewritten to use lists instead of if-statements.
 #
-
+obj-y                          += skeleton/
 obj-y                          += irqchip/
 obj-y                          += bus/

Recent posts

Alter system calls with LD_PRELOAD

Mount a block device image

DevOps notes

Linux kernel module basics

zpool reimport


Archives

2021 (5)
2019 (2)
2018 (7)