当前位置:  技术问答>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分, 其它的正确解均分。

|
引用:
还有大侠说:
不需要自己写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*




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

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/

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

|
偶也是一个菜鸟,以下方法仅供参考
从错误描述看,你的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文件。”
这句话是我说的,而我也是这样测试模块的。

|
哦,还要补充一句,放到板子上的.KO和测试程序,要记得是交叉编译器,chmod +x 修改文件权限,在加载

|


楼主不要介意,纯粹一句玩笑话。呵呵!
不过楼主也要明白做事情还是要靠自己,别人说的很清楚了,那自己不是很没成就感。
我喜欢自己摸索,自己摸索出来感觉很有成就,呵呵,纯粹个人意见。

|
本来就该把分给正确答案呀
菜鸟路过代表菜鸟们严重质疑大侠们![图片]

|

……继续路过……

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

`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/

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


这种方法我也试过,可以用。。

|
还是当菜鸟好,即长见识又不会挨批

|
可以理解楼主,有些问题大家说的太抽象,还有就是大家对你的环境也不太了解。

|
菜鸟路过,围观大虾

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux和unix iis7站长之家
  • 文件描述符集fd_set * readfds;书上这样描述数组元素的每一位对应一个文件描述符,第一个元素代表文件描述符0到31,数组第二个元素代表文
  • redhat9下./命令代表什么意思?.命令又代表什么意思?
  • 还有全零的子网号为什么也不能用?它又代表什么?
  • 请问脚本中的$?代表什么呢?
  • 在jsp文件中, this代表的意思???
  • args代表什么??
  • IT认证能代表多少能力
  • 以下shell脚本中 "?" 代表什么呢?
  • 请问 linux 中的有个符号 # 代表什么意思?
  • 请问 chmod 777 /opt/SWE 这句话代表什么意思?
  • . ./ 和 . / 与 ./ 分别代表什么呢
  • 请问下 echo $? 是什么意思? “?”代表什么意思?
  • IBM服务器 共享内存 D 代表什么!!
  • /usr/include/asm/目录,其中asm代表什么意思???
  • linux下的命令“exec <&- 2>&-”代表什么意思?
  • linux下的文件上面的标志代表什么意思?
  • 请教参考代码0c9代表什么意思?
  • REDHAT 9命令的各种颜色是代表什么意思?
  • 在makefile文件中,@$符号代表什么意思?急,再线等待啊!
  • 进程退出码大于129代表什么意思?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3