内核模块
如果将驱动程序 融入到内核源码中, 当驱动修改的时候,内核需要重新编译,重新烧写!!!
内核模块机制: 允许 驱动程序和操作系统分离. 将驱动程序写入写入模块内部,
模块可以动态的加入内核,或者动态的离开内核.
动态: 操作系统运行的时候.
优点: 大部分功能都喜欢写入模块!!!
内核只需要保留最基本的功能,需要某个功能的时候,将他的模块动态的加进来.不需要的删除.
模块的编写
modules.c文件
/*****************************************************************
* Copyright (C) 2019 Sangfor Ltd. All rights reserved.
*
* 文件名称:saolei.c
* 创 建 者:yinfei-hu
* 创建日期:2019年03月07日 星期4 15时22分05秒
* 功能描述:
*
*****************************************************************/
#include <linux/kernel.h> //内核头文件
#include <linux/module.h> //MODULE_LICENSE头文件
/*
编写内核模块
1.编写入口函数 module_init(int (*initfn)(void))
initfn函数指针,指向谁,谁就是模块的入口函数
2.出口函数 module_exit(void (*exitfn)(void))
exitfn: 函数指针,指向谁谁就是模块出口函数
*/
int module_fun_init(void){
printk("%s->%d\n",__FUNCTION__,__LINE__);
return 0;
}
void module_fun_exit(void){
printk("%s->%d\n",__FUNCTION__,__LINE__);
}
/* 内核模块入口 module_init 里面的参数,指向谁,谁就是模块入口函数*/
module_init(module_fun_init);
/* 内核模块出口 module_exit 里面的参数,指向谁,谁就是模块出口函数*/
module_exit(module_fun_exit);
/*模块作者信息*/
MODULE_AUTHOR("YinFei.Hu <hu_yin_fei@163.com>");
/*模块信息*/
MODULE_DESCRIPTION("Kernel module driver");
/*告诉内核愿意遵守gpl协议*/
MODULE_LICENSE("GPL");
Makefile文件
obj-m += modules.o #指定编译模块
all:
make -C /tftpboot/linux-3.14 M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- # -C 指定编译后的内核文件路径 ;M=$(PWD) 指定当前路径 PWD当前路径宏;modules 编译文件名;ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-指定编译器,指定编译工具
clean:
rm *.ko *.o *.mod.c *.order *.symvers -rf
模块的操作
安装 insmod xxx.ko 安装的时候模块入口函数被执行 初始化动作
卸载 rmmod xxx [没有.ko] 卸载的 出口函数 被执行. 去初始化动作
前提是你要创建 /lib/modules/3.14.0