将模块加入内核(失败log记录).md

步骤

向内核添加模块
  1. 编写驱动程序
  2. 将驱动程序加入linux源码目录,一般是在/drivers里面
  3. 在目录所在的Kconfig文件中添加驱动程序对应的项目编译选项
  4. 在目录的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
  1. 上述实例通过两个模块介绍模块之间的通信,模块add_subt提供了两个导出函数add_integer()和sub_integer()分别完成了两个数字的加法和减法。模块test用来调用模块的add_sub的两个方法,完成加法或者减法操作。
  2. 测试模块
    在加载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

  1. 修改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
  1. 修改Makefile
obj-$(CONFIG_ADD_SUB) +=add_sub.o
obj-$(CONFIG_TEST) +=test.o

3.修改上层目录的Kconfig,添加

source "drivers/add_sub_Kconfig/Kconfig"
  1. 修改上层目录的Makefile,添加
    obj-$(ADD_SUB) += add_sub_Kconfig/

对add_sub模块进行配置

$:make menuconfig
理论上在Device Drivers目录下找到Add_Sub模块,但是实际上并没有此模块,反复试验后,任然找不到结果,就此进行记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值