Monday, 12 December 2016

Linux Kernel Development 1.0

Some things before you start:-
  • check you kernel version => uname -r
    • you will get an version name and local version. e.g.... (3.2.0-4-amd64)

  • then search for your source tree ... it should be in /usr/src/ ... if not found there
    • download you Linux source tree with exact version . in my case it will be Linux 3.2.0. Google it and you will get a zip file. Extract it under the folder /usr/src/

  • now you need to run some commands
    • first go into the kernel source directory then follow these steps 
    • make menuconfig (if you want to customise your kernel)
    • make -j<number of cpus>
    • make install 
    • make modules_install
  • Now your kernel is ready
For more digging on above section go to "http://unix.stackexchange.com/questions/20864/what-happens-in-each-step-of-the-linux-kernel-building-process" . This will help you.

Here it starts:-
  • You need two things first is your driver code(c file) and next is Makefile.
  • This is a hello world program for kernel. Save it in hello.c
    #include <linux/module.h>
    #include <linux/kernel.h>

    int init_module(void)       //this function runs when your module is loaded
    {
       printk("Hello world");
       return 0;
    }
    void cleanup_module(void)   //this function runs when your module is unloaded
    {
      printk("Goodbye world \n");

    MODULE_LICENSE("GPL");  //compulsory part in every driver code

  • Now in Makefile .... be sure to name the file as Makefile (capital M don't forget):-
    obj-m := hello.o           //same as your module name with an .o extension

  • Something you must not do:-
    • compile the program to get (.o)  . Makefile will take care of that.
  • Now write this command on the terminal.
    make -C /usr/src/"your Linux version" M=`pwd` modules

  • If every thing goes write then you will see 6 files generated . You can inspect all of them and dig them vigorously . The file which is of your use is the one with .ko extension. it is a dynamic loadable module. go and read about it !! 
  • Since you have a dynamic module its time you load it !! Here is the command 
    • insmod <dynamic module>
      • you might require root privileges so use sudo 
  • open dmesg and check whether all you wrote in the printk is there or not. you can use grep to find it . dmesg is the kernel ring buffer which gives us the details provided by the kernel messages.
  • Since you have loaded it now its time to remove it.
    • rmmod <dynamic module>
  • This is it !! you have created a kernel module. 
  • Amount of efforts put in to write a hello world  for kernel is high but if you love hardware then this is how it is going to be !!