CSDN内核模块编译讨论(总结)

我按照下面的程序和方法试了下,很不错,开始是放在driver/char目录下的,但由于内核文件不全,编译不成功,所以把该程序拷贝到其他目录,然后新建Makefile文件。不过先要在user/src的源码中执行make oldconfig,然后在存放该程序的目录下运行make,生成了内核模块hello.ko。^_^。

然后使用insmod ./hello.ko 加载模块,用tail /var/log/message 查看到加载信息:hello, world!

用rmmod ./hello.ko卸载模块,并查看到卸载信息:goodbye world

#include <linux/module.h> //needed by all modules
#include <linux/kernel.h> //needed for KERN_ALERT
#include <linux/init.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
printk(KERN_INFO "hello, world!\n");

return 0;
}

static void hello_exit(void)
{
printk(KERN_INFO "goodbye world\n");
}

module_init(hello_init);
module_exit(hello_exit);


Makefile:
obj-m := hello.o
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules //这里要用TAB缩进
clean:
$(RM) *.o *.ko *.mod.c Module.symvers //同上



现在make编译
结果是这样子:
make -c /lib/modules/2.6.27.5-117.fc10.i686/build M=/home/woods/linux_dd modules
make: *** /lib/modules/2.6.27.5-117.fc10.i686/build: No such file or directory.
stop
make: *** [default] error 2

还有大侠说:
不需要自己写makefile,把hello.c放到/drivers/char里,在里面的makefile中增加obj-m +=hello.o一行,在内核根目录下make modules即可生成hello.ko文件。

然后我就忙乎一通:
[hh@F12 work]$ cd /usr/src/kernels/
[hh@F12 kernels]$ ls
2.6.31.5-127.fc12.i686.PAE
[hh@F12 kernels]$ cd 2.6.31.5-127.fc12.i686.PAE/ //内核根目录显然是没有问题的。
[hh@F12 2.6.31.5-127.fc12.i686.PAE]$ ls
arch drivers include kernel mm net security tools
block firmware init lib Module.markers samples sound usr
crypto fs ipc Makefile Module.symvers scripts System.map


[hh@F12 2.6.31.5-127.fc12.i686.PAE]$ make //内核根目录下开始干活。
rm: 无法删除"include/config/kernel.release": 权限不够
make: *** [include/config/kernel.release] 错误 1
[hh@F12 2.6.31.5-127.fc12.i686.PAE]$ make modules
rm: 无法删除"include/config/kernel.release": 权限不够
make: *** [include/config/kernel.release] 错误 1
[hh@F12 2.6.31.5-127.fc12.i686.PAE]$


一个最简单的hello驱动程序的编译,大侠们竟然给出了如此多的方法以及解释,我们菜鸟一步步紧跟出现的问题却是层出不穷,难道这个Hello驱动就复杂到这个程度么? 是大侠们水平实在菜还是不屑菜鸟这种问题? 就不能稍微用点心思让菜鸟们迈出驱动的第一步么?

我火了,以后将采取如下结贴方法,没有解决问题的所谓的大侠1分, 其它的正确解均分。

 

原帖如下(楼主并没有解决问题,因为后来他想用QQ向我求救,可惜我也是菜鸟):
http://topic.csdn.net/u/20100305/14/4e469bd7-e0cf-4ebb-8abe-05f284635fc1.html

第一个回答:

首先我不是大侠,我也是菜鸟,提点意见

Makefile:
obj-m := hello.o
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(RM) *.o *.ko *.mod.c Module.symvers


makefile那么写是没有问题的。
make: *** /lib/modules/2.6.27.5-117.fc10.i686/build: No such file or directory.
这个错误就是说/lib/modules/2.6.27.5-117.fc10.i686/目录下没有build这个文件,这个文件其实是个链接文件,它链接的就是内核目录,像我用如下命令
file /lib/modules/2.6.30.10-105.fc11.i686.PAE/build
结果是
/lib/modules/2.6.30.10-105.fc11.i686.PAE/build: symbolic link to `../../../usr/src/kernels/2.6.30.10-105.fc11.i686.PAE'
所以如果你的目录下没有那个文件,那你可以用ln自己建一个
应该就没问题了

还有,通过你内核目录下的是fc12的内核,但是你运行的是fc10的内核
[hh@F12 kernels]$ cd 2.6.31.5-127.fc12.i686.PAE/ //内核根目录显然是没有问题的。
但是make的时候报的却是/lib/modules/2.6.30.10-105.fc11.i686.PAE/build
可能主要问题还是楼主的环境不对吧

所以楼主可以改一下makefile

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

改成

KERNELDIR := /usr/src/kernels/2.6.31.5-127.fc12.i686.PAE/

然后再编译,改是没问题的

第二个回答:

make -C 你的内核源代码目录(例如:/opt/bcm97405/kernel/stblinux-2.6.18) M=`pwd`

`pwd`,是shell 脚本,`和~在同一个键,即Tab键上面的那个键。

命令方法和下面一样

还有一种方法是:
为你的helloworld程序建一个makefile文件,在里面加入一行: obj-m :=hello.o
然后执行命令: make -C /内核代码路径/ M=/helloworld程序路径/ modules

第三个回答:

引用:
还有大侠说:
不需要自己写makefile,把hello.c放到/drivers/char里,在里面的makefile中增加obj-m +=hello.o一行,在内核根目录下make modules即可生成hello.ko文件。

第一,把hello.c放到/drivers/char
第二,makefile中增加obj-m +=hello.o
第三,在Kconfig中添加
config HELLO
tristate "hello driver"
depends on 目标板 //如depends on ARCH_s3c2440
help
QQ:652780062
第四,根目录下,make menuconfig //配置内核
Device Drivers -->
Character drivers -->
<M> hello driver //一定要配置成M这才会生成模块.KO
第五, 回到根目录下,执行make modules
第六,进入到/drivers/char,即可看到hello.ko文件


其实,第五步make、make modules、make SUBDIR=drivers/char/ modules,
三个命令工具都一样,在/drivers/char生成同样的文件(.o .ko .mod.c .mod.o )
最后,insmod hello.ko 到你的板子子,就行了
用测试程序看看,我一直这样做,在不得,请贴出错误,可以的要嘉奖呵呵

 

 

Makefile 如下,(由于按照大家的操作了一把,改乱了,我就把原来的重新粘贴上。)
obj-m := hello.o
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(RM) *.o *.ko *.mod.c Module.symvers

竟然没有出现以前的错误,好像是make成功了吧?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值