一、编译
Makefile
#如果已定义KERNELRELEASE,则说明是从内核构造系统调用的,因此可利用其内建语句。
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
#否则是直接从命令行调用的,这时要调用内核构造系统。
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.symvers *.cmd *.mod.c *.order
endif
如果要构造的模块名称为module.ko,由两个源文件生成(如file1.c file2.c),则:
obj-m := module.o
module-objs := file1.o file2.o
该Makefile将被读取两次
第一次:当Makefile从命令行调用时,KERNELRELEASE变量尚未设置,读取else部分。获取内核源代码树;调用all:目标,第二次运行make,以便运行内核构造系统。
第二次:读取ifneq部分,设置obj-m。内核Makefile负责真正构造模块。
二、装载
#TBD