Linux驱动Day01

【一】驱动介绍

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) //模块功能简单的描述。

【3】内核模块的编译

①静态编译:编译到内核镜像中。
②动态编译:编译生成.ko模块
③内部编译:
将源码(驱动)放到内核源码目录中进行编译。
a、将写好的驱动源码放到相应的目录下(drivers/)。
b、修改该目录下的Kconfig文件。

   config DEMO
  
   tristate "Lianxi demo dmeo demo"
   default y 
c、修改该目录下的Makefile文件
obj-$(CONFIG_DEMO)  += demo.o
d、回到内核源码顶层目录执行make menuconfig
 <M>:生成模块 
<*>:编译到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

【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)

【6】模块的符号表导出

EXPORT_SYMBOL(sym) //需要导出的函数名
EXPORT_SYMBOL_GPL(sym)

将导出符号表文件(Module.symvers)拷贝到使用的模块目录下,再进行编译。

猜你喜欢

转载自blog.csdn.net/weixin_43008143/article/details/107966297