当前位置: 技术问答>linux和unix
代表菜鸟们严重质疑大侠们!
来源: 互联网 发布时间:2016-08-12
本文导语: #include //needed by all modules #include //needed for KERN_ALERT #include MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_INFO "hello, world!n"); return 0; } static void hello_exit(void) { ...
#include //needed by all modules
#include //needed for KERN_ALERT
#include
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 worldn");
}
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
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分, 其它的正确解均分。
#include //needed for KERN_ALERT
#include
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 worldn");
}
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
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分, 其它的正确解均分。
|
引用:
还有大侠说:
不需要自己写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 -->
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,把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 -->
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 到你的板子子,就行了
用测试程序看看,我一直这样做,在不得,请贴出错误,可以的要嘉奖呵呵
|
给你个例子参考下 我做过的没问题
hello.c
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, Techshine !n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, Techshine ! n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
MVTOOL_PREFIX = /usr/local/arm/3.4.1/bin/arm-linux-
KERNEL_DIR = /home/sys/linux-2.6.20
MAKE_ENV = ARCH=arm CROSS_COMPILE=$(MVTOOL_PREFIX)
#TARGET = hello.ko
obj-m += hello.o
all:
make -C $(KERNEL_DIR) M=`pwd` $(MAKE_ENV) modules
# cp hello.ko /home/pr/hello
clean:
-rm -rf *.o *mod* *.ko .cmem* .tmp*
hello.c
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, Techshine !n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, Techshine ! n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
MVTOOL_PREFIX = /usr/local/arm/3.4.1/bin/arm-linux-
KERNEL_DIR = /home/sys/linux-2.6.20
MAKE_ENV = ARCH=arm CROSS_COMPILE=$(MVTOOL_PREFIX)
#TARGET = hello.ko
obj-m += hello.o
all:
make -C $(KERNEL_DIR) M=`pwd` $(MAKE_ENV) modules
# cp hello.ko /home/pr/hello
clean:
-rm -rf *.o *mod* *.ko .cmem* .tmp*
|
首先我不是大侠,我也是菜鸟,提点意见
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:
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/
然后再编译,改是没问题的
KERNELDIR := /lib/modules/$(shell uname -r)/build
改成
KERNELDIR := /usr/src/kernels/2.6.31.5-127.fc12.i686.PAE/
然后再编译,改是没问题的
|
偶也是一个菜鸟,以下方法仅供参考
从错误描述看,你的uname -r的输出为
2.6.27.5-117.fc10.i686
但是,你的/usr/src/kernel目录下只有一个子目录:
2.6.31.5-127.fc12.i686.PAE
如果你想编译当前内核可用的模块,请安装以下包
kernel-devel-2.6.27.5-117.fc10.i686
如果你想编译fedora12(2.6.31.5-127.fc12.i686.PAE)下能够使用的模块,请将Makefile中的
KERNELDIR := /lib/modules/$(shell uname -r)/build
改成
KERNELDIR := /usr/src/kernel/2.6.31.5-127.fc12.i686.PAE/build
如果以上方法不能解决问题,请贴出新的错误消息。
从错误描述看,你的uname -r的输出为
2.6.27.5-117.fc10.i686
但是,你的/usr/src/kernel目录下只有一个子目录:
2.6.31.5-127.fc12.i686.PAE
如果你想编译当前内核可用的模块,请安装以下包
kernel-devel-2.6.27.5-117.fc10.i686
如果你想编译fedora12(2.6.31.5-127.fc12.i686.PAE)下能够使用的模块,请将Makefile中的
KERNELDIR := /lib/modules/$(shell uname -r)/build
改成
KERNELDIR := /usr/src/kernel/2.6.31.5-127.fc12.i686.PAE/build
如果以上方法不能解决问题,请贴出新的错误消息。
|
现在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
====================================================================================
很明显的错误 make: *** /lib/modules/2.6.27.5-117.fc10.i686/build: No such file or directory.
kernel 的路径不对。。
还有大侠说:
不需要自己写makefile,把hello.c放到/drivers/char里,在里面的makefile中增加obj-m +=hello.o一行,在内核根目录下make modules即可生成hello.ko文件。
====================================================================================
很明显, 这个方法也是可以的, 至于你的内核不能编译????
你就不能先下载一个内核代码, 然后自己先尝试编译一下内核?
Hello驱动 并不复杂,但你至少要自己编译过内核吧。
|
成功了,恭喜了
|
我觉得思考最重要
楼主不要一遇到问题就慌张,认为自己解决不了,其实答案已经告诉你了,只是没那么明显而已
楼主不要一遇到问题就慌张,认为自己解决不了,其实答案已经告诉你了,只是没那么明显而已
|
我也是菜鸟。。
“不需要自己写makefile,把hello.c放到/drivers/char里,在里面的makefile中增加obj-m +=hello.o一行,在内核根目录下make modules即可生成hello.ko文件。”
这句话是我说的,而我也是这样测试模块的。
“不需要自己写makefile,把hello.c放到/drivers/char里,在里面的makefile中增加obj-m +=hello.o一行,在内核根目录下make modules即可生成hello.ko文件。”
这句话是我说的,而我也是这样测试模块的。
|
哦,还要补充一句,放到板子上的.KO和测试程序,要记得是交叉编译器,chmod +x 修改文件权限,在加载
|
楼主不要介意,纯粹一句玩笑话。呵呵!
不过楼主也要明白做事情还是要靠自己,别人说的很清楚了,那自己不是很没成就感。
我喜欢自己摸索,自己摸索出来感觉很有成就,呵呵,纯粹个人意见。
|
本来就该把分给正确答案呀
菜鸟路过
菜鸟路过
|
……继续路过……
|
make -C 你的内核源代码目录(例如:/opt/bcm97405/kernel/stblinux-2.6.18) M=`pwd`
`pwd`,是shell 脚本,`和~在同一个键,即Tab键上面的那个键。
`pwd`,是shell 脚本,`和~在同一个键,即Tab键上面的那个键。
|
幸好我不是大侠 ............
|
问题请教是可以的,但至少不要人生攻击。
愿意不愿意回答你的问题,你都要请自去实践才知道,人都翻错误的时候
愿意不愿意回答你的问题,你都要请自去实践才知道,人都翻错误的时候
|
12楼有个错误,更正
如果你想编译fedora12(2.6.31.5-127.fc12.i686.PAE)下能够使用的模块,请将Makefile中的
KERNELDIR := /lib/modules/$(shell uname -r)/build
改成
KERNELDIR := /usr/src/kernel/2.6.31.5-127.fc12.i686.PAE/
如果你想编译fedora12(2.6.31.5-127.fc12.i686.PAE)下能够使用的模块,请将Makefile中的
KERNELDIR := /lib/modules/$(shell uname -r)/build
改成
KERNELDIR := /usr/src/kernel/2.6.31.5-127.fc12.i686.PAE/
|
还有一种方法是:
为你的helloworld程序建一个makefile文件,在里面加入一行: obj-m :=hello.o
然后执行命令: make -C /内核代码路径/ M=/helloworld程序路径/ modules
这种方法我也试过,可以用。。
为你的helloworld程序建一个makefile文件,在里面加入一行: obj-m :=hello.o
然后执行命令: make -C /内核代码路径/ M=/helloworld程序路径/ modules
这种方法我也试过,可以用。。
|
还是当菜鸟好,即长见识又不会挨批
|
可以理解楼主,有些问题大家说的太抽象,还有就是大家对你的环境也不太了解。
|
菜鸟路过,围观大虾
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。