Linux模块编译命令 linux编译内核模块两种方式

如何编译linux驱动模块第一步:准备源代码
首先我们还是要来编写一个符合linux格式的模块文件,这样我们才能开始我们的模块编译 。假设我们有一个源文件mymod.c 。它的源码如下:
mymodules.c
1. #include linux/module.h/* 引入与模块相关的宏 */
2. #include linux/init.h/* 引入module_init() module_exit()函数 */
3. #include linux/moduleparam.h /* 引入module_param() */
4
5. MODULE_AUTHOR("Yu Qiang");
6. MODULE_LICENSE("GPL");
7
8. static int nbr = 10;
9. module_param(nbr, int, S_IRUGO);
10.
11. static int __init yuer_init(void)
12.{
13.int i;
14.for(i=0; inbr; i++)
15.{
16.printk(KERN_ALERT "Hello, How are you. %d/n", i);
17.}
18.return 0;
19.}
20.
21.static void __exit yuer_exit(void)
22.{
23.printk(KERN_ALERT"I come from yuer's module, I have been unlad./n");
24.}
25.
26. module_init(yuer_init);
27. module_exit(yuer_exit);
我们的源文件就准备的差不多了,这就是一个linux下的模块的基本结构 。第9行是导出我们的符号变量nbr 。这样在你加载这个模块的时候可以动态修改这个变量的值 。稍后将演示 。yuer_init()函数将在模块加载的时候运行 , 通过输出的结果可以看到我们的模块是否加载成功 。
第二步:编写Makefile文件
首先还是来看看我们Makefile的源文件,然后我们再来解释;
Makefile
obj-m := modules.o#要生成的模块名
modules-objs:= mymod.o#生成这个模块名所需要的目标文件
KDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions
ARM平台
Makefile
obj-m += mymod.o
KDIR := /home/workspace2/kernel/linux-2.6.25#如果是用于arm平台,则内核路径为arm内核的路径
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o
在arm板上插入是
insmod mymod
如果出现以下错误
insmod: chdir(/lib/modules): No such file or directory
则运行
mkdir /lib/modules/2.6.25 (与arm内核版本相同)
并将mymod.ko文件复制到该目录下
cp mymod.ko /lib/modules/2.6.25
然后再执行 (insmod 只在/lib/modules/2.6.25目录下查找相关驱动模块)
insmod mymod
现在我来说明一下这个Makefile 。请记住是大写的Makefile而不是小写的makefile;
obj-m :这个变量是指定你要声称哪些模块模块的格式为 obj-m := 模块名.o
modules-objs :这个变量是说明声称模块modules需要的目标文件 格式要求模块名-objs := 目标文件
切记:模块的名字不能取与目标文件相同的名字 。如在这里模块名不能取成 mymod;
KDIR:这是我们正在运行的操作系统内核编译目录 。也就是编译模块需要的环境
M=:指定我们源文件的位置
PWD:这是当前工作路径$(shell)是make的一个内置函数 。用来执行shell命令 。
第三步:编译模块
现在我们已经准备好了我们所需要的源文件和相应的Makefile 。我们现在就可以编译了 。在终端进入源文件目录输入make
运行结果:
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-24-generic'
CC [M] /home/yuqiang/桌面/mymodule/mymodules.o
LD [M] /home/yuqiang/桌面/mymodule/modules.o
Building modules, stage 2.
MODPOST 1 modules
CC/home/yuqiang/桌面/mymodule/modules.mod.o
LD [M] /home/yuqiang/桌面/mymodule/modules.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-24-generic'
第四步:加载/卸载我们的模块
从上面的编译中我可以看到 。已经有一个modules.ko生成了 。这就是我们的模块了 。现在我们就可以来加载了 。

推荐阅读