网上已经看到过n遍的linux2.6驱动hello world程序,终于忍不住要自己实现一遍了。
在做之前就看了半天,据说是2.6的内核比用用make来编译,暂不知道为什么,先跟着做,然后动手改。
看到别人发的hello.c和Makefile
#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");
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) -C $(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~~~
换内核是个挺麻烦的事,会牵扯到很多东西。现在是学驱动,所以,其它的先放置,选困扰最好的方式来学习,目标才最明确。