【一】、驱动
作用:
配置硬件设备处于某种模式,或提供配置硬件的方法。
提供操作硬件设备的接口
地位:
内核与设备的桥梁
【二】、内核模块
[1]. 内核模块
.ko结尾的二进制文件
[2]. 内核模块的编写
三要素:
1. 入口(加载)函数注册 --->>> module_init();
<linux/init.h>
typedef int (*initcall_t)(void);
module_init(initfn)
int __init xxx(void)
{
...
}
2. 出口(卸载)函数注册 --->>> module_exit();
#define __exitcall(fn) \
static exitcall_t p = fn
typedef void (*exitcall_t)(void);
void __exit xxx(void)
{
}
3. GPL协议声明 --->>> MODULE_LICENSE("GPL");
===============================================================================
4. MODULE_AUTHOR(_author) //作者申明
5. MODULE_DESCRIPTION(_description) //模块功能简单的描述
[附].sudo ctags -R linux 内核创建索引
[3]. 内核模块的编译
1. 静态编译
编译到内核镜像中 --->>> uIamge
2. 动态编译
编译生成ko模块
3. 内部编译
将源码(驱动)放到内核源码目录中进行编译
1. 将写好的驱动源码放到相应的目录下(drivers/)
2. 修改该目录下的Kconfig文件
config DEMO
tristate "farsight demo dmeo demo"
default y
3. 修改该目录下的Makefile文件
obj-$(CONFIG_DEMO) += demo.o
4. 回到内核源码顶层目录执行make menuconfig
<M>:生成模块
<*>:编译到uImage镜像中
< >:不编译
4. 外部编译
将源码(驱动)放到内核源码目录外进行编译
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
[4]. 内核模块的使用
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
[5]. 模块传参
/******************************************************
*功能:模块传参
*参数:
* @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)
$ sudo insmod demo.ko arr=4,4,4,4
/* 求数组元素个数的宏函数 */
#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
[6]. 模块的符号表导出
EXPORT_SYMBOL(sym) //需要导出的函数名
EXPORT_SYMBOL_GPL(sym)
将导出符号表文件(Module.symvers)拷贝到使用的模块目录下,再进行编译
【三】、printk打印级别
/proc/sys/kernel
4 4 1 7
第一个字段:控制台日志级别
第二个字段:默认日志级别
第三个字段:最高日志级别
第四个字段:最低日志级别