Linux Kernel Development [A simple module]
Posted on July 15, 2021 • 2 minutes • 374 words
Linux Kernel Development is the process of writing code to run in the Kernel Space.
It's one of the most important parts of a complex operating systems.
I will not dive deep into explaining what Drivers are since that will occupy
entire book pages,what I will do is write a simple Kernel Module and show the process
of building and loading it into the Kernel.
Device Drivers controls a particular device connected to the computer.
I am going to dive into explaining 2 things,this will be the order:
1. Writing a Hello World Kernel Module,build and load it into the Kernel.
2. Writing a simple character device driver.
Information about the Kernel is alot to compress into single writing
and therefore I only try to explain my 1st 2 code pieces.
----> 1. Hello World, mymodule.c <----
//code begins here #include<linux/module.h> #include<linux/init.h> #include<linux/fs.h>
MODULE_LICENSE(“GPL”); MODULE_AUTHOR(“Andrew Mbugua”); MODULE_DESCRIPTION(“Registers a device and implement some call back function”);
/**@brief this function is called,when the device file is opened
*/ static int __init ModuleInit(void){
printk(“Hello Kernel”); return 0;
} /** @This function is called when the module is removed from the kernel */
static void __exit ModuleExit(void){ printk(“Goodbye, Kernel”);
}
module_init(ModuleInit); module_exit(ModuleExit);
// End of module
----> Create the a Makefile(a Makefile is responsible creating a build) <----
$ touch Makefile
$ vi Makefile
obj-m += mymodule.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
$ make
The following output is generated:
make -C /lib/modules/5.4.0-86-generic/build M=/home/kernel_dev_server modules
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-86-generic'
Building modules, stage 2.
MODPOST 1 modules
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-86-generic'
multiple files will be generated,the main focus here will be the mymodule.ko,
an extension used for Kernel Modules.
----> loading the module <----
$ insmod mymodule.ko
verify that it has been loaded
$ dmesg
This prints the information from the Kernel's ring buffer.
[123.069922] Hello Kernel
----> Problems & error messages encountered and the solutions if you
choose to dive into Kernel Development <----
### Problem 1:
ERROR: could not insert module /lib/modules/r1soft/hcpdriver-cki-XXX.ko
:Operation not permitted
### Solution
Restarting the system is done if the memory becomes fragmented to a point
where our memory request allocation is denied.
This article explains best the problem encountered at hand (https://bit.ly/3muMCUT)