I have a kernel programming seminar at my job. The idea is to enrich knowledge and to ‘fortify’ what I already know.
In my experience, in order to truly learn and remember what I learned is to write it down. I will write my notes here in a hope that I don’t forget what I’ve learned. In case I do forget, I always can come here, and remind myself what I’ve learned.
So the next few posts will be my personal notepad available for everyone.
Part 1 – Introduction
One of the method to program in kernel is to use modules. In most cases these are drivers.
To compile a module, it is required to compile the module with the source code of the kernel – so called headers.
When compiling a module, use Makefile:
obj-m += acme.o
KDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
EXTRA_CFLAGS = -g
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
The compilation result file ends with .ko. This file needs to be part of kernel. To insert or remove this file from the kernel the following commands can be used:
insmod <file name> – insert module file into the kernel
rmmod <module name> – remove module from kernel
lsmod – list modules loaded into kernel
Module has to have two functions: one activates when loading file to kernel, the other activate when removing module from kernel:module_init(acme_init);
module_exit(acme_exit);
The function init will be called with the __init preamble :static int __init acme_init(void)
{
}
The function exit will be called with the exit __preamble:static void __exit acme_exit(void)
{
}
The module should have these definitions:MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Example character driver");
MODULE_AUTHOR("Free Electrons");
If license differ then GPL, dmesg log will show that the kernel is tainted:module license 'Proprietary' taints kernel.
kernel module hello world program:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Proprietary");
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("Tim Goldshmit");
MODULE_DESCRIPTION("Tim's HELLO module");
MODULE_LICENSE("GPL");