第一个driver~~~

网上已经看到过n遍的linux2.6驱动hello world程序,终于忍不住要自己实现一遍了。

在做之前就看了半天,据说是2.6的内核比用用make来编译,暂不知道为什么,先跟着做,然后动手改。

 

看到别人发的hello.c和Makefile

 

/* hello.c */
#include 
<linux/init.h>
#include 
<linux/module.h>
#include 
<linux/kernel.h>

static int hello_init(void)
{
                    printk(KERN_ALERT 
"Hello, world\n");
                                    
return 0;
}
static void hello_exit(void)
{
                    printk(KERN_ALERT 
"Goodbye, hello\n");
}
module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE(
"GPL");

 

 

# Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are listed here.
        mymodule-objs := hello.o
        obj
-m := hello.o
else
        PWD :
= $(shell pwd)
        KVER 
?= $(shell uname -r)
        KDIR :
= /lib/modules/$(KVER)/build
all:
        
$(MAKE) -$(KDIR) M=$(PWD)
clean:
        rm 
-rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif

 

执行make。。。出现了错误提示:

/lib/modules/2.6.18-1.2798.fc6xen/build 文件或文件夹不存在

然后执行:

ls -l /lib/modules/2.6.18-1.2798.fc6xen/build

看到:

lrwxrwxrwx 1 root root 40 06-22 10:34 build -> /usr/src/kernels/2.6.18-1.2798.fc6-i686/

不知道为什么,build到行尾一直都在闪,但是看到它只是一个软链接,看样子是什么原因链接失效了,所以,把原来的链接删了重新建了一个链接:

cd /lib/modules/2.6.18-1.2798.fc6xen/

rm build

ln -s /usr/src/kernels/2.6.18-1.2798.fc6xen ./build

然后再切换回去make。。。make ok!

但是执行insmod hello.ko时又出现了问题:

[root@global Character]# insmod hello.ko
insmod: error inserting 'hello.ko': -1 Invalid module format

通过uname -a,cat /proc/version, gcc -v...之后发现gcc,内核版本都没有问题,可奇怪死了。。。google中,呵呵~~~

找了半天,貌似是与内核版本不一致造成的。也下不到2.6.18-1.2798.fc6xen的dev-tools,所以,我又把它拿到了fdaro8下面进行编译,一切ok~~~

换内核是个挺麻烦的事,会牵扯到很多东西。现在是学驱动,所以,其它的先放置,选困扰最好的方式来学习,目标才最明确。

posted @ 2010-06-22 16:10  Biiigfish  阅读(333)  评论(0编辑  收藏  举报