步骤
向内核添加模块
- 编写驱动程序
- 将驱动程序加入linux源码目录,一般是在/drivers里面
- 在目录所在的Kconfig文件中添加驱动程序对应的项目编译选项
- 在目录的Makefile文件中添加新的驱动程序的编译语句
测试动态添加模块
- 需要写的文件有test.c add_sub.h add_sub.c以及test.c下的Makefile和add_sub.c下的Makefile
//test.c
/*************************************************************************
> File Name: test.c
> Author: houwenzhi
> Mail: houwenzhi@163.com
> Created Time: 2020年03月13日 星期五 10时41分16秒
************************************************************************/
#include <linux/init.h>
#include <linux/module.h>
#include "add_sub.h"
#include <linux/kernel.h>
static long a = 1;
static long b = 1;
static int AddOrSub = 1;
static int test_init(void)
{
long result = 0;
printk("test initi\r\n");
if(1 == AddOrSub)
{
result = add_integer(a,b);
}
else
{
result = sub_integer(a,b);
}
printk("The %s result is %ld",AddOrSub==1?"Add":"Sub",result);
return 0;
}
static void test_exit(void)
{
printk("test exit\r\n");
}
module_param(a,long,S_IRUGO);
module_param(b,long,S_IRUGO);
module_param(AddOrSub,int,S_IRUGO);
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("HouWenzhi");
#Makefile
obj-m :=test.o
KERNELDIR ?= /home/user/source/linux-2.6.30
PWD := $(shell pwd)
SYMBOL_INC = $(obj)/../$(SYMBOL_INC)
KBUILD_EXTRA_SYMBOLS=$(obj)/../print/Module.symvers
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions
.PHONY:modules modules_install clean
//add_sub.c
/*************************************************************************
> File Name: add_sub.c
> Author: houwenzhi
> Mail: houwenzhi@163.com
> Created Time: 2020年03月13日 星期五 11时24分59秒
************************************************************************/
#include <linux/module.h>
#include <linux/init.h>
#include "../add_sub.h"
long add_integer(int a,int b)
{
return a + b;
}
long sub_integer(int a,int b)
{
return a - b;
}
EXPORT_SYMBOL(add_integer);
EXPORT_SYMBOL(sub_integer);
MODULE_LICENSE("GPL");
#Makefile
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /home/user/source/linux-2.6.30
PWD := $(shell pwd)
PRINT_INC = $(PWD)/../include
EXTRA_CFLAGS += -I $(PRINT_INC)
modules:
$(MAKE) -I $(PRINT_INC) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions
.PHONY:modules modules_install clean
else
obj-m :=add_sub.o
endif
/*************************************************************************
> File Name: add_sub.h
> Author: houwenzhi
> Mail: houwenzhi@163.com
> Created Time: 2020年03月13日 星期五 11时19分15秒
************************************************************************/
#ifndef _ADD_SUB_H_
#define _ADD_SUB_H_
long add_integer(int a,int b);
long sub_integer(int a,int b);
#endif
- 上述实例通过两个模块介绍模块之间的通信,模块add_subt提供了两个导出函数add_integer()和sub_integer()分别完成了两个数字的加法和减法。模块test用来调用模块的add_sub的两个方法,完成加法或者减法操作。
- 测试模块
在加载test模块之前,需要先加载add_sub模块,test模块才能访问add_sub模块体统的导出函数
insmod add_sub.ko
insmod test.ko a=3 b=2 AddOrSub=2
- 这种方式属于动态加载的方式
将模块加入内核
- 首先内核模块的目录为/dervers目录中,在目录下新建目录add_sub_Config
目录中包括
$:cd add_sub_Config
$:tree
.
├── add_sub.c
├── add_sub.h
├── Kconfig
├── Makefile
└── test.c
- 修改Kconfig
menu "ADD_SUB"
comment "ADD_SUB"
config CONFIG_ADD_SUB
boolean "ADD_SUB support"
default y
config CONFIG_TEST
tristate "ADD_SUB test support"
depends on CONFIG_ADD_SUB
default y
endmenu
- 修改Makefile
obj-$(CONFIG_ADD_SUB) +=add_sub.o
obj-$(CONFIG_TEST) +=test.o
3.修改上层目录的Kconfig,添加
source "drivers/add_sub_Kconfig/Kconfig"
- 修改上层目录的Makefile,添加
obj-$(ADD_SUB) += add_sub_Kconfig/
对add_sub模块进行配置
$:make menuconfig
理论上在Device Drivers目录下找到Add_Sub模块,但是实际上并没有此模块,反复试验后,任然找不到结果,就此进行记录