您的位置:首页 > 运维架构 > Linux

如何编译一个linux下的驱动模块(1)

2015-08-08 12:08 399 查看
直接写Makefile 文件(假设要编译的文件为hello.c)

1 ifneq ($(KERNElRELEASE),)

2 obj-m := hello.o

3 else

4 obj-m := hello.o

5 KERNELDIR ?= /lib/modules/$(shell uname -r)/build

6 PWD := $(shell pwd)

7

8 default:

9 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

10 endif

第一个ifeq ($(KERNELRELEASE),)目前,并无用处,它的由来是指在Linux源码根目录下的Makefile编译内核时,KERNELRELEASE宏会被定义,那么如果是从源码根目录开始的make则会将myhello.o模块编译进内核。

KERNELDIR ?= /usr/src/$(shell uname -r) ,这句是对KERNELDIR进行赋值,这个变量是后面我们用到的指代内核源码目录用的。

PWD := $(shell pwd),这句是对PWD变量进行赋值,作用是将$(shell pwd)的返回结果既求得当前目录的路径赋值给PWD,这个变量我们在后面指代我们要编译的驱动程序所在的位置。

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

这句是Makefile的规则:这里的$(MAKE)就相当于make,-C 选项的作用是指将当前工作目录转移到你所指定的位置。“M=”选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,需要在make modules 命令中加入“M=dir”,程序会自动到你所指定的dir目录中查找模块源码,将其编译,生成ko文件。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: