您的位置:首页 > 运维架构 > 网站架构

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

2017-07-21 09:33 232 查看
以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。

一、linux设备驱动模型简介

1、什么是设备驱动模型?

(1)类class、总线bus、设备device、驱动driver;

分别对应四个结构体,用来表述这四个概念。
(2)kobject(结构体)和对象生命周期

高度抽象的结构体,表示内核的一个总的父类。
(3)sysfs

(4)udev

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

早期内核(2.4之前)没有统一的设备驱动模型,但照样可以用(那时候设备比较少);
2.6版本中正式引入设备驱动模型,目的是在设备越来越多,功耗要求等新特性要求的情况下让驱动体系更易用、更优秀。
设备驱动模型负责统一实现和维护一些特性,诸如:电源管理、热插拔、对象生命周期、用户空间和驱动空间的交互等基础设施
设备驱动模型目的:简化驱动程序编写,但是客观上设备驱动模型本身设计和实现很复杂。

3、驱动开发的2个点

驱动源码本身编写、调试,重点在于对硬件的了解。
驱动什么时候被安装、驱动中的函数什么时候被调用,怎样被调用(比如probe()函数还是直接调用?)。之前是写应用程序来安装,现在希望自动安装、卸载(热插拔),这些跟硬件无关,完全和设备驱动模型有关。

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

三个结构体

1、kobject



(1)定义在linux/kobject.h中,是最基本的结构体,被其他结构体作为元素。

(2)各种对象最基本单元,提供一些公用型服务如

对象引用计数(引用计数为0时,可以释放,生命周期结束);
维护对象链表(因此可以遍历);
对象上锁(占用对象资源,不被其他占用);
对用户空间的表示;

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

因此各对象可以使用kobject所提供的功能。
地位相当于面向对象体系架构中的总基类。

2、kobj_type







(1)很多书中简称为ktype,每一个kobject都需要绑定(即用一个指针指向,而不是作为子元素)一个ktype来提供相应的功能;

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

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

(4)release函数,查看引用计数,去释放对象所占用的内存。

(5)总结:提供属性文件,提供/sys/……操作方法

3、kset



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

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

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

总而言之,以上三个内容是/sys/下所有的内容的实现机制。包括目录的组织,操作方法,数据结构等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: