Tuesday, April 8, 2008

The symbol of liberation: a Hi-Tech madrassa

An extract from an article worth reading.

Set amidst the sylvan surroundings of Rajasthan's Ramgarh town, 10 km from the Jaipur railway station, is a sprawling stretch of 173 green acres encircled by a tranquil valley and cool lake - this is where you will find a completely new experiment with the traditional madrassa education system, the Madrassa Jameatul Hidaya.

Usually, madrassas, or Islamic seminaries, are seen by the media as ghettoes of antiquity, orthodoxy and obscurantism. Madrassas have become the butt of suspicion following a series of investigations after the Sep 11 terrorist strikes in the US. They end up proving their credentials of faith and by providing the authorities with certificates of loyalty.
But can you imagine a madrassa with computers, electronic labs, cricket, basketball and volleyball teams and debating societies in English and Hindi? Jameatul Hidaya is one such institution where maulanas work on computers.
The institution is an apt example of how a madrassa must be in these days of hi-tech life. These maulanas are working with the motto: The holy Quran in one hand and a computer in the other.
Maulana Mohammad Fazl-ur-Rahim Mujaddedi, an Islamic scholar and the Ameer-e-Jameatul Hidaya (proctor) of the seminary states: "For Indian Muslims, it's a dream come true.

linux kernel module

there are many tutorials on how to write a basic kernel module..
but only a part of ppl succeed in writing and running a proper module..
cos there are various reasons which may lead to failure ..like ur distribution,the path where you have placed your kernel source directories,kernel versions,etc,etc..
k..in this post am gonna present a basic kernel module which will print "hello " when inserted into the kernel and "bye " when you remove it from the kernel..
here we go!!
requisites:
kernel 2.6.*
i have checked this on redhat,fedora and debian..it never ran on a suse box :(
//file name :hello.c

#include
#include
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
printk(KERN_ALERT "hello\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "bye\n");
}

module_init(hello_init);
module_exit(hello_exit);

does this needs an explanation?nyways..the header files asusual..the license which the source supports..here it is dual..supporting both gpl and bsd..
two user-defined functions......hello_init and hello_exit..the names can be nything cos they r user-defined..
u can define the body as ur wish..here i have attempted to print "hello" when the function hello_init is run
and "bye" when hello_exit is run..
as we have printf library function,printk is used to print in the kernel ,i mean used in lkmp..
for kernel versions 2.4.* the syntax of printk was
printk(<1> "hello\n");
i guess..
here <1> denotes the priority..the lower the number the higher the priority.(as we all know :) )
fine..
then we provide two entry points.
1.module_init
2.module_exit
in the first one we ask the hello_init to be executed i.e., module_init(hello_init)
and the same applies for the second one too .................

and now its time to compile and run..
but how?
first write a Makefile
$ vi Makefile
obj-m := hello.o
and save the file

now you gotta compile it..
by using the make command with -C switch
here u hav to mention the path where u have compiled the kernel source(oops i forgot to tell how to compile the kernel source..k..in the next post for sure :) )
in my comp and most of the comps the path will be /usr/src/kernels/linux-*
in my comp the command is to be


$ make -C /usr/src/kernels/2.6.23.1-42.fc8-i686 M=$PWD modules

on the terminal u wil get the following:

make: Entering directory `/usr/src/kernels/2.6.23.1-42.fc8-i686'
CC [M] /home/sakthi/lkmp/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/sakthi/lkmp/hello.mod.o
LD [M] /home/sakthi/lkmp/hello.ko
make: Leaving directory `/usr/src/kernels/2.6.23.1-42.fc8-i686'


if u get this then its done :)
if u dont :( pls check the path name and Makefile once..
now if u see the folder where u have ur hello.c u can find the following files:
hello.o
hello.mod.c
hello.ko
hello.mod.o

and now its time to run (execute the .ko file) the module..
hey b4 that u need to change the run level yaar..sometimes if u in gui it wont run..
press ctrl+alt+f1

and now
$insmod ./hello.ko
u will get:
hello

if u check ur /proc/kallsysms file and /proc/modules file u can find ur module name man!!
$cat /proc/kallsymsgrep hello
$cat /proc/modulesgrep hello

and now its time to remove
$rmmod ./hello.ko
bye will be displayed..
to come back to gui.......ctrl+alt+f7
its done..so u have written,compiled,inserted and removed back a proper kernel module successfully :)
try this out..its good..
all the best
Ameer Irshad