目录
一、模块参数
二、符号共享
三、模块自动卸载
四、关于Makefile的说明
一、模块参数
根据不同应用场合给内核模块传递不同的参数,提高内核模块灵活性
- 定义一个常见变量
- 使用module_param宏把传参值赋给变量
module_param(name,type,perm)
- name: 参数名
- type: 参数类型,如int、byte、bool、charp..
- perm: 读写权限
- 不允许设置可执行权限
- 在“/sys/module/模块名/parameters”目录下,会生成该参数对应的文件
module_para.c
static int itype=0;
module_param(itype,int,0);
static bool btype=0;
module_param(btype,bool,0644);
static char ctype=0;
module_param(ctype,byte,0);
static char *stype=0;
module_param(stype,charp,0644);
static int __init param_init(void)
{
printk(KERN_ALERT "param init!\n");
printk(KERN_ALERT "itype=%d\n",itype);
printk(KERN_ALERT "btype=%d\n",btype);
printk(KERN_ALERT "ctype=%d\n",ctype);
printk(KERN_ALERT "stype=%s\n",stype);
return 0;
}
注意:
- 定义变量类型和声明变量类型的时候使用的宏不一定相同
- 权限如果是0,表示不会在“/sys/module/模块名/parameters”目录下生成相应的文件,比如用char来定义字符型变量,但是在声明的时候确实用的byte来声明的
Makefile
KERNEL_DIR=/home/geralt/linux_driver/kernel/ebf_linux_kernel_6ull_depth1/build_image/build
ARCH=arm
CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH CROSS_COMPILE
#calculation.o
obj-m := module_param.o
all:
$(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) modules
.PHONE:clean copy
clean:
$(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) clean
sudo rm /home/embedfire/workdir/*.ko
copy:
sudo cp *.ko /home/geralt/my_dir
编译过程:
(1)执行make命令
(2)执行make copy命令将生成的ko文件放到共享文件夹里面去
(3)将共享文件夹里的ko文件通过mobaxterm工具拖到板子里面
(4)执行模块加载命令
sudo insmod /home/ubuntu/MyWork/module_param.ko itype=123 btype=1 ctype=200 stype="abc"
(5)demesg命令查看打印信息
二、符号共享
内核模块可以共享导出的符号表
- 变量共享
- 函数共享
EXPORT_SYMBOL(sym)
- sym:变量名
module_param.c
EXPORT_SYMBOL(itype);
int my_add(int a, int b)
{
return a+b;
}
EXPORT_SYMBOL(my_add);
int my_sub(int a, int b)
{
return a-b;
}
EXPORT_SYMBOL(my_sub);
可以看出EXPORT_SYMBOL函数导出了一个变量,两个函数。
calculation.c
static int __init calculation_init(void)
{
printk(KERN_ALERT "calculation init!\n");
printk(KERN_ALERT "itype+1 = %d, itype-1 = %d\n", my_add(itype,1), my_sub(itype,1));
return 0;
}
编译过程:
(1)make
(2)make copy移动到共享文件夹
(3)从共享文件夹拉到板子里
(4)卸载之前加载过的module_para模块
sudo rmmod module_para.ko
(5)重新加载module_para模块
sudo insmod /home/ubuntu/
(6)查看符号表
cat /proc/kallsyms | grep xxx
这样就可以在calculation.c中使用这些符号了
(7)加载calculaion模块
(8)dmesg打印日志
可以看出模块的日志都被打印出来了
关于卸载模块的说明:
现在是加载了两个相关联的模块,卸载的时候只有先卸载上层模块,及calculation模块,再卸载module_para模块,顺序不对会报error!!
也有一种办法可以让linux模块自动卸载!
三、模块自动卸载
- 所有内核模块统一放到“/lib/modules/内核版本”目录下
cp *.ko /lib/modules/内核版本
- 查看内核版本
uname -r
- 建立模块依赖关系
demod -a
- 查看模块依赖关系
cat /lib/modules/内核版本/modules.dep
-
加载模块及其依赖模块(这里只有calculation模块)
modprobe xxx
-
卸载模块及其依赖模块
modprobe -r xxx
四、关于Makefile的说明
- 有依赖关系的模块,放在一起进行编译
- clean伪目标增加清除共享文件夹指令