站在设备驱动这个角度分析,设备驱动模型是如何构建出来,起到什么作用,认识它并在写驱动的时候去利用设备驱动模型

目录

一.linux 设备驱动模型简介

1.1、 什么是设备驱动模型

1.2、 为什么需要设备驱动模型

1.3、 驱动开发的2个点

二.设备驱动模型的底层架构

2.1、kobject结构体

2.2、kobj_type结构体

2.3、kset结构体

三.总线式设备驱动组织方式

3.1、总线

3.2、设备

3.3、驱动

3.4、类

3.5、总结


一.linux 设备驱动模型简介

1.1、 什么是设备驱动模型

  1. ( 1) 类 class、 总线 bus、 设备 device、 驱动 driver
四个词并非四个简单概念,还是linux驱动的四个结构体,也可以理解为linux设备驱动模型的四个框架。
分别对应我们源代码的四个结构体。class :例如class_createbus   :例如USB总线,SPI总线device:设备driver:驱动
为何需要这四个结构体-----生产这些结构体类型的变量,每一个结构体变量就代表一个实例
  1. ( 2) kobject 和对象生命周期

kobject 是一种数据结构, 定义在 kernel\include\linux\kobject.h 中, 详细分析见后面。

linux内核源代码里面的一个结构体,k是kernel object物体,kobject就是内核的一个东西。一个高度抽象的结构体,表示内核里面的一个对象,就是内核里面的所有对象抽象出来的一个总类。所以说linux内核是面向对象编程。这个kobject就类似于面向对象体系的一个总的基类,总的父类

对象生命周期,例如某一个驱动,insmod诞生,rmmod消亡。如何管理这个对象的生命周期?在kobject有一种机制,能够让每一个对象具有自我管理生命周期的特性,即自己管理自己,当自身不被需要的时候就自己释放。比如为A malloc 申请一段内存,当不需要的时候不用去free A,它自己会自己free掉。如何知道自己没用了呢?肯定需要一种方法

  1. ( 3)sysfs的文件结构

block:块设备
bus:系统中的总线
class: 设备类型,比如输入设备
dev:系统中已注册的设备节点的视图,有两个子目录char和block。
devices:系统中所有设备拓扑结构视图
fireware:固件
fs:文件系统
kernel:内核配置选项和状态信息
module:模块
power:系统的电源管理数据
在 sysfs 中出现的每个对象都对应一个 kobject。
  1. ( 4) udev。

Linux 用户空间设备管理(Linux userspace device management), 在kernel 2.6.13后被使用, 动态提供了在系统中实际存在的设备节点。udev 是一个为你的计算机提供设备事件的 Linux 子系统。 通俗来讲就是, 为了实现内核空间和用户空间的信息的一个同步

1.2、 为什么需要设备驱动模型

( 1) 早期内核( 2.4 之前) 没有统一的设备驱动模型, 但照样可以用。

( 2) 2.6 版本中正式引入设备驱动模型, 目的是在设备越来越多, 功耗要求等新特性要求的情况下让驱动体系更易用、 更优秀。

( 3) 设备驱动模型负责统一实现和维护一些特性, 诸如: 电源管理、 热插拔、 对象生命周期、 用户空间和驱动空间的交互等基础设施。

( 4) 设备驱动模型目的是简化驱动程序编写, 但是客观上设备驱动模型本身设计和实现很复杂。

1.3、 驱动开发的2个点

( 1) 驱动源码本身编写、 调试。 重点在于对硬件的了解。

( 2) 驱动什么时候被安装、 驱动中的函数什么时候被调用。 跟硬件无关, 完全和设备驱动模型有关。

二.设备驱动模型的底层架构

2.1、kobject结构体

kobject是一个对象的抽象,它用于管理对象。每个kobject对应着sysfs中的一个目录。

kobject用struct kobject来描述。

(1)定义在linux/kobject.h中D:\linux\winshare\x210kernel\kernel\include\linux\kobject.h

(2)各种对象最基本单元,提供一些公用型服务如:对象引用计数、维护对象链表、对象上锁、对用户空间的表示

(3)设备驱动模型中的各种对象其内部都会包含一个kobject

(4)地位相当于面向对象体系架构中的总基类

2.2、kobj_type结构体

(1)很多书中简称为ktype,每一个kobject都需要绑定一个ktype来提供相应功能

(绑定和包含意思不一样,包含是实体,绑定是实体的一个指针)

(2)关键点1:sysfs_ops,提供该对象在sysfs中的操作方法(show和store)

struct sysfs_ops {ssize_t (*show )(struct kobject *, struct attribute *,char *);ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);
};
show方法用于将传入的指定属性编码后放到char *类型的buffer中
store则执行相反功能:将buffer中的编码信息解码后传递给struct attribute类型变量。两者都是返回实际的属性长度

(2)关键点2:attribute,提供在sysfs中以文件形式存在的属性,其实就是应用接口

struct attribute {const char *name;/* 属性名称 */mode_t mode;     /* 属性保护:只读设为S_IRUGO,可写设为S_IWUSR */
}

2.3、kset结构体

(1)kset的主要作用是做顶层kobject的容器类

(2)kset的主要目的是将各个kobject(代表着各个对象)组织出目录层次架构

(3)可以认为 kset 就是为了在 sys 中弄出目录, 从而让设备驱动模型中的多个对象能够有层次有逻辑性的组织在一起。 kset 的作用可以把各个 kobject 组织成一个目录结构。

总的来说,这三个底层结构都是为了实现/sys 目录下的内容,kobject 实现最基本的内容,kobj_type 在于对目录里面的文件和对文件的操作, kset 就是构建目录层次结构。 三者共同实现了/sys 里面的基础架构。

三.总线式设备驱动组织方式

总线是在 [设备驱动模型的以kobject为代表的底层]之上的层次,可以把它看作是中间层,实际上字符设备驱动模型的层次不止三个层,可能有五个六个层次。层次越往上,越靠近实际的编程,越下的话越靠近写内核的那些人

3.1、总线

(1)物理上的真实总线及其作用(英文bus)

(2)驱动框架中的总线式设计(例如将总线式设备分为设备和驱动两部分分块管理)

(3)bus_type结构体,关键是match函数和uevent函数

总线的bus_type结构体就是一种抽象,抽象出了总线里面所有需要管理的事情所有需要具备的功能。将来去内核构造一个一个总线的时候就是产生bus_type这个结构体的一个结构体变量,然后把它适当的填充

D:\linux\winshare\x210kernel\kernel\include\linux\device.h

从/sys目录下可以看出各种总线

3.2、设备

(1)struct device是硬件设备在内核驱动框架中的抽象

(2)device_register用于向内核驱动框架注册一个设备

(3)通常device不会单独使用,而是被包含在一个具体设备结构体中,

如struct usb_device

3.3、驱动

(1)struct device_driver是驱动程序在内核驱动框架中的抽象

(2)关键元素1:name,驱动程序的名字,很重要,经常被用来作为驱动和设备的匹配依据

(3)关键元素2:probe,驱动程序的探测函数,用来检测一个设备是否可以被该驱动所管理,probe是驱动程序的入口

probe函数对于一个驱动函数非常重要,有些简单的驱动没有探测函数,因为没有使用到linux内核的驱动框架,没有用到总线式驱动框架来写。即非总线式的写法是不需要probe函数的,probe函数是总线式的框架才需要的。在总线方式下probe函数就是驱动最重要的函数。

3.4、类

(1)相关结构体:struct class 和 struct class_device

前者是xx类,后者是xx类下面的某一个设备

(2)udev的使用离不开class,类就是用来管理设备的。 类和总线是通过不用的方法来管理设备的。 /sys/class 里面存放的就是好多种类, 每一个类里面又存放了好多个设备。

(3)class的真正意义在于作为同属于一个class的多个设备的容器。也就是说,class是一种人造概念,目的就是为了对各种设备进行分类管理。当然,class在分类的同时还对每个类贴上了一些“标签”,这也是设备驱动模型为我们写驱动提供的基础设施。

注:从目录关系也能体现总线和类的管理方式,/sys/devices 放的是真正的设备相关的东西,你从class目录进去或者从bus目录进去最后都会由函数指针指向devices这个目录里面来

3.5、总结

(1)模型思想很重要,其实就是面向对象的思想

(2)全是结构体套结构体,对基本功(语言功底和大脑复杂度)要求很高

五.linux设备驱动模型相关推荐

  1. 整理--linux设备驱动模型

    知识整理–linux设备驱动模型 以kobject为底层,组织类class.总线bus.设备device.驱动driver等高级数据结构,同时实现对象引用计数.维护对象链表.对象上锁.对用户空间的表示 ...

  2. linux 内核驱动模型,linux设备驱动模型架构分析 一

    linux设备驱动模型架构分析 一 发布时间:2018-07-04 15:14, 浏览次数:584 , 标签: linux 概述 LDD3中说:"Linux内核需要一个对系统结构的一般性描述 ...

  3. linux 统一设备模型 pci,Linux设备驱动模型摘抄

    Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄 Linux设备驱动模型摘抄(1) Linux统一设备模型 简介 Li ...

  4. Linux设备驱动模型1——简介和底层架构

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.linux设备驱动模型简介 1.什么是设备驱动模型? (1)类class.总线bus.设备device.驱动d ...

  5. linux设备驱动模型及其他,Linux设备驱动模型

    Linux设备驱动模型,主要函数分析 整个驱动模型中,最核心的三个函数分别是 __bus_register.driver_register.device_register int __bus_regi ...

  6. linux平台设备驱动模型是什么意思,Linux设备驱动模型之我理解

    点击(此处)折叠或打开 /* my_bus.c   */ #include #include #include #include #include #include "my_bus.h&qu ...

  7. Linux设备驱动模型之platform(平台)总线详解

    /********************************************************/ 内核版本:2.6.35.7 运行平台:三星s5pv210 /*********** ...

  8. Linux中kobject的作用,Linux设备驱动模型-- 数据结构Kset/KObject

    前言 Kset和kobject是Linux设备驱动模型中的核心数据结构,其主要作用是将系统中的设备抽象出来,以树状结构组织,方便系统统一管理. 而这个统一管理的地方,就是sysfs,先放一张示例图,阐 ...

  9. Linux设备驱动模型三 kset

    Linux设备驱动模型三 kset 1 kset数据结构 kset的定义在前文已有描述,我们再回顾一下: [cpp] view plain copy struct kset { /*与子kobject ...

最新文章

  1. 结合丰富示例深入讲解Ajax架构和最佳实践——《深入Ajax:架构与最佳实践》
  2. html 手动添加thead,HTML表格 - 我可以在thead之前添加额外的tbody吗?
  3. flash代码_Flash如何对制作文件进行优化
  4. sso登陆劫持漏洞(单点登录劫持,低危)
  5. 基于vue的验证码组件
  6. Facebook开源新NLP框架:简化部署流程,大规模应用也OK
  7. 覆盖率测试工具gcov的前端工具_LCOV_简介
  8. python简单计算器异常处理_Python计算器(正确除零)
  9. 为什么论文查重建议用word?
  10. (1-2层) 物理层下面的传输媒体
  11. 苹果二型计算机语言,计算机语言排名排行榜! 苹果下滑严重!
  12. 音箱箱体的分类(四)
  13. pip国内镜像解决no matching distribution found for XXX
  14. Linux学习笔记 Day0
  15. chapter.初识1.1(正则表达式一)
  16. 如何发表一篇核心期刊论文
  17. CMS垃圾收集器和G1垃圾收集器
  18. 这个时代“寒门再难出贵子”
  19. 【抓包工具】配置:Fiddler 设置 APP 抓包成功,微信小程序却无网络问题解决
  20. WGS84以及各种坐标系

热门文章

  1. 【软件测试】—— 水杯测试用例
  2. 谷歌浏览器批量删除书签
  3. 小程序如何通过云开发获取手机号
  4. 使用Python画玫瑰花
  5. Android6.0通讯录权限问题
  6. 企业微信有权限查看通讯录吗?
  7. 掘金100道(2)['1', '2', '3'].map(parseInt) what why ?
  8. 华为telnet连接(无用户名登录和aaa模板登录)
  9. mysql 作为服务启动_mysql系列-安装及服务启动
  10. 使用eclipse或者myeclipse时,鼠标变成黑色十字架解决办法