交叉编译
其实交叉编译是最反映构建流程的,因为它并不能利用宿主机原始的构建环境。
首先我们需要编写 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) clean
Command
插入模块
我们可以使用如下命令插入模块:
insmode <module_path>
但是这种方式并不会注意到模块的依赖项,并确保正确顺序地加载所需的所有模块。而 modprobe
则具有这个特性,它还会处理一些模块加载的细节,如符号解析、模块参数处理等。但是对象就变成 module-name
了:
modprobe <module_name>
删除模块
使用如下命令进行模块的删除:
rmmod <module_path>
当然也可以用 modprobe
,如下所示:
modprobe -r <module_name>
列出模块
使用如下命令:
lsmod