理解了它就简单了,所以关键是理解.
编译内核模块,可以用两种方法.
1. 常规方法,通过make menuconfig 去设置对应的项,将功能编进内核或编成module.
2. 利用内核环境直接从模块源代码编出module
第一种方法菜单操作,不易出错.
第二种方法更简单,实质.可以理解模块的生成过程
下面以usb转串行口驱动的生成为例来说明.
将pl2303.c pl2303.h 源码copy到一个目录下,编写如下Makefile.
如果是本地编译更简单,如果是交叉编译则需要进交叉内核路径和传人交叉参数即可.
具体看注释就不解释了.
$(warning KERNELRELEASE = $(KERNELRELEASE))
ifneq ($(KERNELRELEASE),)
obj-m := pl2303.o
else
PWD=$(shell pwd)
KVER=$(shell uname -r)
#编译x86_64模块时, 指定内核代码所在路径
#KDIR=/lib/modules/$(KVER)/build
#编译Arm 时,指定内核代码所在路径, 这个路径下,有编译内核的Makefile存在
KDIR=/home/hjj/M6G2C/04.源码示例/3.软件源码/linux-src
all:
#编译x86_64, 简单的进入内核代码路径即可
#make -C $(KDIR) M=$(PWD)
#交叉编译arm, 我的环境需要指明ARCH, CROSS_COMPILE 变量
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
clean:
rm *.o *.ko modules.* Module.symvers *.mod.c
endif
其它的模块生成也可以如此操作.
可见模块的编译是两次读取Makefile, 是用内核环境而不是普通环境编译的.