Monday, July 25, 2011

Example to build linux kernel driver?

I did following :

Env : RHEL 6
Kernel : 2.6.32-71.14.1.el6.x86_64
Arch : x86_64

1.
[root@kmaiti develop__kernel_module]# cat hello.c
#include
#include
int init_module(void)
{
printk(KERN_INFO "Hello, I'm Init\n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "I'm clean function\n");
return 0;
}

2.
[root@kmaiti develop__kernel_module]# cat Makefile
obj-m +=hello.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

then

3. Compile using " make command like :

[root@kmaiti develop__kernel_module]# make
make -C /lib/modules/2.6.32-71.14.1.el6.x86_64/build M=/home/kmaiti/My_C_Programm/develop__kernel_module modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-71.14.1.el6.x86_64'
CC [M] /home/kmaiti/My_C_Programm/develop__kernel_module/hello.o
/home/kmaiti/My_C_Programm/develop__kernel_module/hello.c: In function ‘cleanup_module’:
/home/kmaiti/My_C_Programm/develop__kernel_module/hello.c:11: warning: ‘return’ with a value, in function returning void
Building modules, stage 2.
MODPOST 1 modules
CC /home/kmaiti/My_C_Programm/develop__kernel_module/hello.mod.o
LD [M] /home/kmaiti/My_C_Programm/develop__kernel_module/hello.ko.unsigned
NO SIGN [M] /home/kmaiti/My_C_Programm/develop__kernel_module/hello.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-71.14.1.el6.x86_64'
[root@kmaiti develop__kernel_module]#

4. Created files are :
[root@kmaiti develop__kernel_module]# ll
total 340
-rw-rw-r--. 1 kmaiti kmaiti 215 Jul 25 17:50 hello.c
-rw-r--r--. 1 root root 106581 Jul 25 17:51 hello.ko
-rw-r--r--. 1 root root 106581 Jul 25 17:51 hello.ko.unsigned
-rw-r--r--. 1 root root 690 Jul 25 17:51 hello.mod.c
-rw-r--r--. 1 root root 60312 Jul 25 17:51 hello.mod.o
-rw-r--r--. 1 root root 47866 Jul 25 17:51 hello.o
-rw-rw-r--. 1 kmaiti kmaiti 152 Jul 25 17:48 Makefile
-rw-r--r--. 1 root root 66 Jul 25 17:51 modules.order
-rw-r--r--. 1 root root 0 Jul 25 17:51 Module.symvers
[root@kmaiti develop__kernel_module]#

Testing : load hello.ko in kernel :

[root@kmaiti develop__kernel_module]# insmod hello.ko
[root@kmaiti develop__kernel_module]# lsmod |grep hello
hello 858 0
[root@kmaiti develop__kernel_module]#
[root@kmaiti develop__kernel_module]# modinfo hello.ko
filename: hello.ko
srcversion: 8AFB0322187612DA29C2422
depends:
vermagic: 2.6.32-71.14.1.el6.x86_64 SMP mod_unload modversions
[root@kmaiti develop__kernel_module]#

See system log, after loading hello.ko :

Jul 25 17:52:17 kmaiti kernel: hello: module license 'unspecified' taints kernel.
Jul 25 17:52:17 kmaiti kernel: Disabling lock debugging due to kernel taint
Jul 25 17:52:17 kmaiti kernel: Hello, I'm Init

After unloading hello.ko :

Jul 25 17:53:21 kmaiti kernel: I'm clean function

try go in deep... :)