此文章是vip文章,如何查看?  

1,点击链接获取密钥 http://nicethemes.cn/product/view29882.html

2,在下方输入文章查看密钥即可立即查看当前vip文章


Linux设备驱动

  • 时间:
  • 浏览:
  • 来源:互联网

在这里插入图片描述

Linux设备

  • 字符设备
  • 块设备
  • 网络设备

举个栗子

在这里插入图片描述

内核模块的基本结构

  • 头文件声明:头文件module.h和init.h是必须的。 #include<linux/module.h>包含了加载模块需要的函数和符号的定义;#include<linux/init.h>包含了模块初始化和清理函数的定义;如果模块在加载时允许用户传递参数,模块还应该包含moduleparam.h头文件。
  • 模块许可声明:MODULE_LICENSE宏声明此模块的许可证
  • 初始化、清理函数声明:在2.6内核模块必须调用宏module_init和module_exit去注册初始化与清理函数,需要注意的是初始化清理函数必须在宏module_init和module_exit使用前定义

模块编译

编译过程中首先会到内核源码目录下,读取顶层的makefile文件,然后返回模块源代码所在的目录编译。

模块加载

编译好模块后用户可以利用超级用户的身份可以将内核模块加载到内核中。常见的实用程序insmod、rmmod、lsmod、modprobe
在这里插入图片描述

直接在内核源码树下完成模块的构建

以字符设备为例:
1)首先在…/drivers/char目录下新建一个子目录examples,创建完这个目录后需要在其中创建两个文件,驱动程序模块的源代码文件和makefile
2)接下来在内核的配置文件中增加新的选项:在…/driver/char/kconfig文件中增加针对example的配置选项,当设置完kconfig文件并且保存在…/driver/char/子目录下后,上述的代码片段最终在当前的操作系统内核配置选项中增加了新的一项config_examples,相应的配置程序需要通过下面的命令进行调用,然后进行相关配置完成相关配置选项的配置工作
3)接下来修改字符设备总的makefile,添加example选项,按照(2)进行配置
4)把驱动程序模块安装在文件系统相应的目录中

驱动程序分析

在这里插入图片描述

  • 设备驱动程序是操作系统最基本的组成部分,是linux内核的一部分,一般情况下可以将驱动
    程序设计为一个模块,在需要时动态加载到内核中。
  • Linux将硬件设备看作一个特殊的文件来操作,该文件被称为设备文件;系统通过对设备文件的读写等操作,实现对外设的读写等操作
  • 驱动程序是设备文件与直接外设间的桥梁

设备号

Linux系统使用设备号来标识设备文件。设备号分为主设备号和从设备号。

  • 主设备号是同一类设备的标识,对应着一个驱动程序
  • 从设备号是在驱动程序中来指示某个物理设备的实例,从设备号使得不同的物理实例可以使用同一个驱动程序

设备文件

  • 这是存放在文件系统中的实际文件
  • 索引节点不对磁盘上的数据块编址,而是包含硬件设备的一个标识
    在这里插入图片描述
    mknod()系统调用用来创建老式的设备文件
    在这里插入图片描述
    在这里插入图片描述

注册设备驱动程序

1、注册一个设备驱动程序意味着把它与对应的设备文件连接起来

  • 使得对设备文件发出的系统调用可以由内核转化为相应的设备驱动程序对应的函数
  • 按照设备驱动程序模型,分配一个新的device_driver描述符,对应到设备文件上

2、访问一个没有注册设备驱动程序的设备文件将会返回错误码-ENODEV
3、注册时机

  • 如果设备驱动程序被静态编译进内核,则注册发生在内核初始化阶段
  • 如果作为一个内核模块来编译,则在装入模块的时候注册(并在卸载模块时注销)

字符设备有关的数据结构

大部分的基础性的驱动操作包括 3 个重要的内核数据结构, 称为 file_operations,file, 和 inode.

  • file_operations 文件操作,每个打开的设备文件均与一组函数相连,file_operations结构中的成员大部分是函数指针,如 读、写等操作
  • File 打开的文件:file结构代表一个打开的文件,每执行一次open就建立一个file结构,直到所有打开的文件都关闭
  • inode 由内核在内部用来表示文件,包含了文件的大量信息,多个文件指针可以同时指向一个单一的inode
    在这里插入图片描述
    在这里插入图片描述

字符驱动程序的结构

在linux系统中,设备的操作演变成对文件的操作,因此设备驱动程序最重要的工作就是编写fops指针对应的文件操作函数。每个打开的设备文件均与一组函数关联。

open函数——>sys_open()——>调用设备文件打开函数——>创建一个系统打开表——>让系统打开表中的内容以设备和为索引找到cdev里面的内容,这里面的file_operation就是我们自己建立的设备驱动程序中的file_operation()

本文链接http://element-ui.cn/news/show-724754.aspx