Thursday, September 16, 2010

Kernel Modules

My ECE 437 class was assigned the monumental task of writing a filesystem driver for the linux kernel. I did a LOT of reading and finally started writing a few things, but realized I needed to be able to simply compile a kernel module just to see how to do it so I started following along with the kernel module how to here Kernel Module Tutorial

When I ran into the problem where when I called make, I would see the following error:
make[2]: *** No rule to make target `kernel/bounds.c', needed by `kernel/bounds.

I chased around the interwebs for a bit. I found out that it looks like $(PWD) wasn't returning the present directory, so I updated it to shell pwd per this site: Labjack Forums

Here is my makefile (note that in front of commands are TABS, if you replace them with spaces your makefile won't work, you've been warned)

#!/usr/bin/make -f

obj-m += hello_world.o

KERNELDIR=/lib/modules/$(shell uname -r)/build

make -C $(KERNELDIR) M=$(shell pwd) modules

make -C $(KERNELDIR) M=$(shell pwd) clean

And finally here is my hello world (keep in mind it's pulled from the above tutorial)

 *  hello_world.c - The simplest kernel module.
#include /* Needed by all modules */
#include /* Needed for KERN_INFO */

int init_module(void)
printk("<1>Hello world 1.\n");

* A non 0 return means init_module failed; module can't be loaded. 
return 0;

void cleanup_module(void)
printk(KERN_ALERT "Goodbye world 1.\n");

Check it out. and give it a try. hopefully it works for you!

calling make all at the command line should compile it all,

and then a simple sudo insmod hello_world.ko

check out if your module was loaded via lsmod, look for it.

Now check your /var/log/messages file for your alert!

Finally do a sudo rmmod hello_world.ko to remove it from the kernel.

Thank you Caleb for the help various commands and the makefile!