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 skeletonTracing
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_onEditing 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/