交叉编译
其实交叉编译是最反映构建流程的,因为它并不能利用宿主机原始的构建环境。
首先我们需要编写 my_module.c 文件,这个文件可以引用的头文件和内核源码可以引用的头文件相同。
然后在 Makefile 中设置 obj-m ,增加与 my_module.c 同名的 my_module.o ,如下所示:
obj-m += my_module.o然后就可以进行构建了,在构建的时候需要指定两个路径,一个是内核目录 KDIR ,另一个是模块所在源码路径 M 。
至于这个内核目录到底应该是什么,其实很好理解, 内核模块是依赖于特定的内核的 ,所以内核目录就应该我们需要加入模块的那个内核的源码目录,如:
KDIR := <linux_path>而如果只是在本机构建模块,则可以这样写,因为这个目录下存放着本机的源码:
KDIR ?= "/lib/modules/$(shell uname -r)/build"最终构建命令和清除命令如下:
all:
make -C$(KDIR) M=$(PWD) modules
clean:
make -C$(KDIR) M=$(PWD) cleanCommand
插入模块
我们可以使用如下命令插入模块:
insmode <module_path>但是这种方式并不会注意到模块的依赖项,并确保正确顺序地加载所需的所有模块。而 modprobe 则具有这个特性,它还会处理一些模块加载的细节,如符号解析、模块参数处理等。但是对象就变成 module-name 了:
modprobe <module_name>删除模块
使用如下命令进行模块的删除:
rmmod <module_path>当然也可以用 modprobe ,如下所示:
modprobe -r <module_name>列出模块
使用如下命令:
lsmod