1、作用:
配置硬件设备处于某种模式,或提供配置硬件的方法。
提供操作硬件设备的接口。
2、 地位:
内核与设备的桥梁。
1、什么是内核模块
.ko结尾的二进制文件。
2、内核模块的三要素
a、入口(加载)函数注册 —>>> module_init();
<linux/init.h>
typedef int (*initcall_t)(void);
module_init(initfn)
int __init xxx(void)
{
...
}
b、出口(卸载)函数注册 —>>> module_exit();
#define __exitcall(fn) \
static exitcall_t p = fn
typedef void (*exitcall_t)(void);
void __exit xxx(void)
{
}
c、GPL协议声明 —>>> MODULE_LICENSE(“GPL”);
此外,还可以有:MODULE_AUTHOR(_author) //作者申明
和MODULE_DESCRIPTION(_description) //模块功能简单的描述。
①静态编译:编译到内核镜像中。
②动态编译:编译生成.ko模块
③内部编译:
将源码(驱动)放到内核源码目录中进行编译。
a、将写好的驱动源码放到相应的目录下(drivers/)。
b、修改该目录下的Kconfig文件。
config DEMO
tristate "Lianxi demo dmeo demo"
default y
c、修改该目录下的Makefile文件
obj-$(CONFIG_DEMO) += demo.o
d、回到内核源码顶层目录执行make menuconfig
:生成模块
<*>:编译到uImage镜像中
< >:不编译
④外部编译
将源码(驱动)放到内核源码目录外进行编译。
1 KERNDIR := /lib/modules/`uname -r`/build
2 PWD := $(shell pwd)
3
4 obj-m += demo.o
5
6 all:
7 make -C $(KERNDIR) M=$(PWD) modules
8
9
10 clean:
11 make -C $(KERNDIR) M=$(PWD) clean
sudo insmod + 模块全名 / /加载到内核
sudo rmmod 无后缀的模块名 //从内核中卸载模块
dmesg //查看内核打印信息
sudo dmesg -c //清除内核的打印信息(并显示)
$modinfo demo.ko //查看模块信息
filename: demo.ko
license: GPL
description: demo for stu...
author: www.hqyj.com
srcversion: 2CF886F474DF23E0ED1E58C
depends:
vermagic: 3.2.0-29-generic-pae SMP mod_unload modversions 686
$lsmod //查看当前系统中加载的内核模块
Module Size Used by
demo 12454 0
/******************************************************
*功能:模块传参
*参数:
* @name 参数名
* @type 参数数据类型
* short, ushort, int, uint,
* long, ulong ,charp
* @perm 权限(八进制表示方式)
*****************************************************/
module_param(name, type, perm)
/********************************************************************
*功能:模块传参 --> 字符串
*参数:
* @name 外部传参名(通过insmod加载模块时传参使用的名字)
* @string 内部变量名
* @len 长度
* @perm 权限(八进制表示方式)
******************************************************************/
module_param_string(name, string, len, perm)
/******************************************************************
*功能:模块传参 --> 数组
*参数:
* @name 参数名
* @type 数组元素数据类型
* @nump 存放数组元素个数的地址
* @perm 权限(八进制表示方式)
*****************************************************************/
module_param_array(name, type, nump, perm)
EXPORT_SYMBOL(sym) //需要导出的函数名
EXPORT_SYMBOL_GPL(sym)
将导出符号表文件(Module.symvers)拷贝到使用的模块目录下,再进行编译。