Blist Multilingual Theme
July 15, 2021

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)
Follow me

I love working on projects and writing about everything I have done.