终于开始学习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]
wucongdonglai 于 2010-11-25 10:16:20发表:
10# deepwhite
等我忙完这阶段,我也去学学,很多人都向我推荐emacs了
deepwhite 于 2010-11-25 08:44:56发表:
Emacs is more than a editor.
wucongdonglai 于 2010-11-24 09:17:50发表:
8# wucongdonglai
另外white兄用的应该是Emacs吧,界面蛮好看的,比我这强多了!
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就可以啊!
deepwhite 于 2010-11-23 20:21:38发表:
后面的那个问题,内核模块的编译实际上是分成了两步:
第一步把 .c 文件编译成 .o 文件,
第二步, 根据内核代码树中的 Build 规则将这个 .o 文件和内核中相关的文件一起链接成为 .ko 文件。
上述两个步骤从我前面的截图中也可以看出来。
这个中间的过程比较复杂,一般写驱动的不用关心。
deepwhite 于 2010-11-23 19:58:08发表:
有图为证:
[attach]32859[/attach]
deepwhite 于 2010-11-23 19:51:01发表:
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 以后有输出。
jieyuhumark 于 2010-11-23 18:01:04发表:
学习
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个的吗?
不知道是什么原因
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]