红联Linux门户
Linux帮助

linux模块的小白问题

发布时间:2010-11-23 13:02:49来源:红联作者:wucongdonglai
[i=s] 本帖最后由 wucongdonglai 于 2010-11-23 17:11 编辑 [/i]

终于开始学习linux驱动了,在准备阶段遇到了一系列问题:
一:需要内核树,就是内核头文件,我的内核和内核头文件不一致,是不是需要把这两者升级到一致呢?
二:我重新编译内核后,在编译模块时,怎么都不行啊!就拿hello来举例吧!
hello.c源码如下:
#include
  #include
  MOUDULE_LICENSE(" Dual BSD/GPL");
  static int hello_init(void)
  {
  printk( KERN_ALERT " hello world enter \n");
  return 0;
  }
  static void hello_exit(void)
  {
  printk(KERN_ALERT " hello world exit \n");
  }
  module_init(hello_init);
  module_exit(hello_exit);

Makefile如下:
obj-m := hello.o
#modules-objs:= hello.o 这行我无论注释掉或者不注释,都一样的结果
KDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)

default:
make -C $(KDIR) M=$(PWD) modules

然后我输入make
结果告诉我说对nothing to be done for default,这是怎么回事呢?
搞不明白啊!各位大哥帮忙看看啊


补充:
在linux设备驱动程序里Makefile如下:
ifneq ($(KERNELRELEASE) , )
obj-m : = hello. o
else
KERNELDIR ?= /lib/modules/$(shell uname -r) /build
PWD : = $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules

在linux设备驱动程序书里说:
这个 makefile 在一次典型的建立中要被读取2 次. 当从命令行中调用这个 makefile , 它注意
到 KERNELRELEASE 变量没有设置. 它利用这样一个事实来定位内核源码目录, 即已安装模
块目录中的符号连接指回内核建立树. 如果你实际上没有运行你在为其而建立的内核, 你可以在
命令行提供一个KERNELDIR= 选项, 设置 KERNELDIR 环境变量, 或者重写 makefile 中设置
KERNELDIR 的那一行. 一旦发现内核源码树, makefile 调用 default: 目标, 来运行第 2 个
make 命令( 在 makefile 里参数化成 $(MAKE))象前面描述过的一样来调用内核建立系统. 在
第 2次读, makefile 设置 obj-m, 并且内核的 makefile 文件完成实际的建立模块工作.
……
这段话我看不懂啊,怎么就被读取2次了!不就是先看[color=#00bfff]KERNELRELEASE是否不为空,由于开始时,KERNELRELEASE为空,所以设定环境变量,然后按着default建立规则![/color]
[color=#00bfff]$(MAKE) -C $(KDIR) M=$(PWD) modules[/color]
只要把宏代替进去,直接就能编译啊?并不需要在读取Makefile啊?怎么就就读取2次了呢?而且即使读取了,[color=#00bfff]KERNELRELEASE依然为空啊,怎么就能设置obj-m了呢[/color]
文章评论

共有 10 条评论

  1. wucongdonglai 于 2010-11-25 10:16:20发表:

    10# deepwhite
    等我忙完这阶段,我也去学学,很多人都向我推荐emacs了

  2. deepwhite 于 2010-11-25 08:44:56发表:

    Emacs is more than a editor.

  3. wucongdonglai 于 2010-11-24 09:17:50发表:

    8# wucongdonglai
    另外white兄用的应该是Emacs吧,界面蛮好看的,比我这强多了!

  4. wucongdonglai 于 2010-11-24 09:17:01发表:

    [i=s] 本帖最后由 wucongdonglai 于 2010-11-24 09:20 编辑 [/i]

    7# deepwhite
    原来是这样的,是我的vim的配置文件问题,应该是make规则对格式要求比较严格的原因吧
    我按white兄的vim设了之后,tab的确是空4格了,但是还是不行,default下面的这条规则是显示红色的,如图
    [attach]32863[/attach]
    我想可能是我的机子问题,于是在另外一台机子上试了一下,本来也是不行,但是从default:后直接敲回车开始输入,倒是可以了,很是不解啊,可是那空了8格呢!
    而我看到make对规格的要求只要是tab就可以啊!

  5. deepwhite 于 2010-11-23 20:21:38发表:

    后面的那个问题,内核模块的编译实际上是分成了两步:
    第一步把 .c 文件编译成 .o 文件,
    第二步, 根据内核代码树中的 Build 规则将这个 .o 文件和内核中相关的文件一起链接成为 .ko 文件。
    上述两个步骤从我前面的截图中也可以看出来。
    这个中间的过程比较复杂,一般写驱动的不用关心。

  6. deepwhite 于 2010-11-23 19:58:08发表:

    有图为证:
    [attach]32859[/attach]

  7. deepwhite 于 2010-11-23 19:51:01发表:

    引用:
    2# deepwhite
    还是不行啊,删除所有Makefile中命令结尾后的空格,并且在default下行打tab,但是还是不行啊
    但是输入命令
    make -C /lib/modules/`uname -r`/build M= `pwd` modules
    这就可以!结果完全正确! ...
    wucongdonglai 发表于 2010-11-23 14:07

    TAB 占空格的宽度是编辑器设置的,

    VI 的话在 ~/.vimrc 中添加下面的代码:
    [code]
    set shiftwidth=4
    set tabstop=4
    set softtabstop=4
    set noexpandtab
    [/code]
    Emacs 的话添加:
    [code]
    (setq-default tab-width 4)
    (setq-default c-basic-offset 4)
    (setq-default indent-tabs-mode t)
    [/code]
    仔细修改一下Makefile,我这里用你的Makefile执行 make 以后有输出。

  8. jieyuhumark 于 2010-11-23 18:01:04发表:

    学习

  9. wucongdonglai 于 2010-11-23 14:07:39发表:

    2# deepwhite
    还是不行啊,删除所有Makefile中命令结尾后的空格,并且在default下行打tab,但是还是不行啊
    但是输入命令
    make -C /lib/modules/`uname -r`/build M= `pwd` modules
    这就可以!结果完全正确!
    我觉得也可能是这个格式的问题!
    我的tab键好像打出来要比较短。
    default:
    make -C $(KDIR) M=$(PWD) modules
    才占2个字符,不是该占4个的吗?
    不知道是什么原因

  10. deepwhite 于 2010-11-23 13:29:33发表:

    1, 是。
    2. default 下面一行的开始应该是一个 TAB :[code]
    obj-m := hello.o
    #modules-objs:= hello.o 这行我无论注释掉或者不注释,都一样的结果
    KDIR := /lib/modules/`uname -r`/build
    PWD := $(shell pwd)

    default:
    make -C $(KDIR) M=$(PWD) modules
    [/code]