3个内核配置跟modules有关: CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y MODULE_FORCE_UNLOAD=y
--------------模块骨架代码 helloworld.c :
#include <linux/module.h>
#include <linux/init.h>
static int __init helloworld_init(void) {
pr_info("Hello world initialization!\n");
return 0;
}
static void __exit helloworld_exit(void) {
pr_info("Hello world exit\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("John Madieu <john.madieu@gmail.com>");
MODULE_DESCRIPTION("Linux kernel module skeleton");
写Makefile: ------------------
# kbuild part of makefile
obj-m := helloworld.o
#the following is just an example
#ldflags-y := -T foo_sections.lds
# normal makefile
KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
all default: modules
install: modules_install
modules modules_install help clean:
$(MAKE) -C $(KERNEL_SRC) M=$(shell pwd) $@
------------------
obj-<X> := <module_name>.o #这个命令去找 .c文件 生成 .o ,如果需要多个 .c 文件,如下例子:
obj-$(CONFIG_MYMODULE) += mymodule.o #根据配置来
apt install linux-headers-$(uname -r) #安装在 /usr/src/linux-headers-$(uname -r) ;符合链接 /lib/modules/$(uname -r)/build 指向它;
树外模块本地 make 产生了一堆文件
树内模块:把 .c 文件搞到相应树节点文件夹里,在Kconfig and Makefile 都加入一些内容。
内核模块一般放置在/lib/modules/$(uname -r)/kernel目录下。
文件/lib/modules/$(uname -r)/modules.dep,记录了内核所支持的各个模块的依赖性。
depmod [-Ane]命令用来生成modules.dep文件。
不加任何参数:depmod分析所有的内核模块,然后重新写入modules.dep文件。
-A: 查找比modules.dep新的模块,如果找到新模块,才会更新modules.dep。
-n: 不写入modules.dep文件,将结果直接显示在屏幕上。
-e: 显示出目前已加载的,不可执行的模块名称。
内核模块的查看:
lsmod: 查看目前内核加载了哪些模块。
modinfo [-adln] [module_name]: 查看指定模块的信息。
-a (author): 查看该模块的作者
-d (description): 查看该模块的说明
-l (license): 查看该模块的授权信息
-n: 查看该模块的路径信息。
内核模块的加载与删除
insmod /full_path/module_name: 加载指定模块。
需输入模块的完整路径名。
当待加载的模块存在依赖模块时,加载可能失败。
rmmod [-fw] module_name: 删除指定模块。
-f: 强制删除模块,不论模块是否正在被使用。
-w: 如果模块正在被使用,则等待该模块使用完毕后再删除。
modprobe [-lcfr] module_name
-c: 列出目前系统所有的模块。
-l: 列出目前在/lib/modules/$(uname -r)/kernel/中的所有模块的完整文件名。
-f: 强制加载指定模块。
-r: 删除指定模块。
示例:
modprobe ipv6.ko // 加载ipv6模块。不需要指定模块的完整路径名。
modprobe -r ipv6.ko // 删除ipv6模块。
dmsg
模块的参数: