Makefile
If you have a file, say, traverse.o, then your Makefile should be like the following
obj-m += traverse.o KDIR = /lib/modules/$(shell uname -r)/build all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: $(MAKE) -C $(KDIR) M=$(PWD) clean
What $(shell uname -r) basically does is that it is replaced by the output of the terminal command uname -r, which lists the directory of your Linux heders.
Insert the Kernel Module
$ sudo insmod traverse.ko
To see the output
$ dmesg
Remove the Kernel Module
$ sudo rmmod traverse.ko
Cautions
for_each_process
If your code is like the following
#include <linux/kernel.h> #include <linux/sched.h> #include <linux/module.h> int init_module(void) { struct task_struct *task; for_each_process(task) { printk("%s [%d]\n",task->comm , task->pid); } return 0; } void cleanup_module(void) { printk(KERN_INFO "Cleaning Up.\n"); }
You may get the error
error: implict declaration of function 'for_each_process': did you mean 'for each node'? [-Werror=implicit-funciton-declaration] for_each_process(task) for_each_node
Solution
You should add the following library explicitly
#include <linux/sched/signal.h>
include
instead of
#include < linux/kernel.h >
one should write
#include <linux/kernel.h>
This is subtle, but in GCC it just won’t work. As in Reference 1, the style is buggy. And will cause the fatal error: linux/kernel.h : No such file or directory. These extra spaces that caused the error are really hard to find out.
References
- Bad style in #include: https://linuxgazette.net/133/saha.html
- for_each_process: https://github.com/Douane/douane-dkms/issues/24