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

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、linux设备驱动模型简介

1、设备驱动模型的含义

设备驱动模型主要体现为以下四个方面:

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

这四个概念分别对应着四个结构体。

见博客:Linux设备驱动模型2——总线式设备驱动组织方式_天糊土的博客-CSDN博客

(2)kobject结构体和对象生命周期

kobject结构体是高度抽象的结构体,表示内核的一个总的父类。

(3)sys文件系统

相关描述见博客:sys文件系统_天糊土的博客-CSDN博客_sys文件系统

(4)udev的介绍

相关描述见百科:udev_百度百科

相关描述见博客:linux下udev详解_wang@xing的博客-CSDN博客_linux udev

2、设备驱动模型的意义

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

早期内核(2.4之前)没有统一的设备驱动模型,但因为那时候设备较少,照样可以用。

在设备越来越多、功耗要求等新特性的情况下,2.6版本中引入了设备驱动模型。设备驱动模型的目的,是为了简化驱动程序编写,但是客观上设备驱动模型本身设计和实现很复杂。

3、驱动开发的2个点

驱动开发涉及两个方面:

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

(2)驱动什么时候被安装,驱动中的函数什么时候被调用,怎样被调用(比如probe()函数还是直接调用)?之前通过写应用程序来安装,现在希望自动安装、卸载(热插拔),这些跟硬件无关,完全和设备驱动模型有关

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

设备驱动模型的底层架构,主要体现在以下三个结构体。

它们是/sys/下所有内容的实现机制,包括目录的组织,操作方法,数据结构等。

1、struct kobject 

struct kobject {const char		*name;struct list_head	entry;struct kobject		*parent;struct kset		*kset;struct kobj_type	*ktype;//每个kobject都绑定一个ktypestruct sysfs_dirent	*sd;struct kref		kref;unsigned int state_initialized:1;unsigned int state_in_sysfs:1;unsigned int state_add_uevent_sent:1;unsigned int state_remove_uevent_sent:1;unsigned int uevent_suppress:1;
};

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

(2)该结构体提供一些公用型服务:

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

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

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

2、struct kobj_type

(1)每一个kobject都需要绑定一个ktype来提供相应的功能。

struct kobj_type {void (*release)(struct kobject *kobj);const struct sysfs_ops *sysfs_ops;struct attribute **default_attrs;const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);const void *(*namespace)(struct kobject *kobj);
};

(2)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);
};

(3)attribute,提供在sysfs中以文件形式存在的属性,其实就是应用接口。

struct attribute {const char		*name;struct module		*owner;mode_t			mode;
#ifdef CONFIG_DEBUG_LOCK_ALLOCstruct lock_class_key	*key;struct lock_class_key	skey;
#endif
};

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

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

3、struct kset

struct kset {struct list_head list;spinlock_t list_lock;struct kobject kobj;const struct kset_uevent_ops *uevent_ops;
};

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

例子简单说说C# ref和out

首写从这字段看 ref 就是引用的意思 out当然就是输出了public void getRefStr(ref string str) {str"hello 你好,你变成了Ref了" }public void getOutStr(out string outStr){outStr "hello 你好,你是out输出的值";} protected…

VARIANT变体类型数据

2019独角兽企业重金招聘Python工程师标准>>> 特殊 Variant 是一种特殊的数据类型,除了定长String数据及用户定义类型外,可以包含任何种类的数据。Variant 也可以包含Empty、Error、Nothing及Null等特殊值。可以用VarType函数或TypeName函数来…

mysql修改校对集_MySQL 图文详细教程之校对集问题

软件安装:装机软件必备包SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功…

Linux设备驱动模型2——总线式设备驱动组织方式(总线、设备、驱动、类等结构体)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考 Linux总线设备驱动模型的理解 struct class 和 struct class_device 前言 这里说的“总线式”,包括I2C总线等具体物理总线,以及平台总线这个虚拟总线。 rootubuntu:/sy…

C# winform 魔兽MH全图制作教程(1): 开发准备工作

C# winform 魔兽MH全图制作教程(1): 开发准备工作 一、开发条件: Visual Studio 2008win xp,win 7,win 2003.C# 语言基础会调试能够运行游戏:《魔兽争霸3冰封王座》拥有版本魔兽客户端版本切换器1.20E,1.24E,1.24D二、设计思路&am…

从常识看中国经济社会-再续之续:套利

2019独角兽企业重金招聘Python工程师标准>>> 《全球化掠夺》提及财富流转的路径,世界仍旧是个丛林,每个人、每个族群都在争夺自己的利益。在一个经济体的内部,财富是垂直流动的;在全球化的经济体中,财富是纵…

python 面向对象编程简称_Python基础-面向对象编程

简介三中编程范式面向过程编程函数式编程面向对象编程面向对象和面向过程对比面向过程优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发&#x…

Linux设备驱动模型3——平台总线的工作原理

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 一、平台总线的简介 1、平台总线的简介 (1)平台总线属于总线中的一种,相对于usb、pci、i2c等物理总线来说,平台总线是虚拟的、抽象出来的。 &#xff…

MYSQL中的BlackHole引擎

MYSQL中的BlackHole引擎 http://blog.csdn.net/ylspirit/article/details/7234021 http://blog.chinaunix.net/uid-22646981-id-3271711.html MySQL在5.x系列提供了Blackhole引擎–“黑洞”. 其作用正如其名字一样:任何写入到此引擎的数据均会被丢弃掉,…

mysql备份到带库_RMAN备份恢复——备份到带库的性能

简单测试了一下rac环境通过RMAN备份到带库的功能。数据库:Oracle 10203 RAC for Solaris8带库:Quantum PX502备份软件:Veritas netbackup 6.0由于带库是502,因此包含两个控制器。也就是说,应该可以通过两个控制性并行写…

《DIY四轴飞行器》读书笔记1

内容整理于黄和悦的《DIY四轴飞行器》。 一、四轴飞行器概述 1、四轴飞行器的现状 (1)研究内容 多级协作,自主飞行倾斜;最优控制理论,飞行器自主飞行和避障;主要是飞控部分。 (2&#xff09…

脚本输出当前 “yyyy-MM-dd WeakDay Festval”

ylbtech-JavaScript: 脚本输出当前 “yyyy-MM-dd WeakDay Festval”脚本输出当前 “yyyy-MM-dd WeakDay Festval” 1.A,源代码(Source Code)-脚本输出当前 “yyyy-MM-dd WeakDay Festval”返回顶部 <SCRIPT languagejavascript> <!--calendar new Date();day cal…

SecureCRT密钥远程登录Linux

一&#xff1a;环境SecureCRT版本&#xff1a;SecureCRT_5.1.3linux版本&#xff1a;[rootangelT ~]# cat /etc/redhat-release CentOS release 6.4 (Final)[rootangelT ~]# uname -r2.6.32-358.el6.x86_64linux系统的sshd_config配置文件是默认的&#xff0c;没有任何的修改。…

源码安装mysql数据库_Linux下源码安装mysql数据库

1、 创建mysql安装目录&#xff1a;[rootlocalhost ~]#mkdir –pv /usr/local/mysql/2、 创建数据存放目录&#xff1a;[rootlocalhost ~]#mkdir –pv /data/mysql/3、 创建用户和用户组&#xff0c;并赋予数据存放目录权限&#xff1a;[rootlocalhost ~]#groupadd mysql[ro…

win10禁止数字签名

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 1、点击通知&#xff0c;找到并进入“所有设置”。 2、在所有设置中找到并进入“更新和安全”。 3、找到恢复&#xff0c;点击“高级启动”下的“立即重启”&#xff0c;重启电脑。 4、重启后选择“疑难解…

信息采集-火车采集器

最近一位同事提出要采集alibaba上的公司信息&#xff0c;关键词是工业加湿器。 主管把任务分配给我后&#xff0c;推荐了一款软件&#xff0c;火车采集器&#xff08;真心不是做广告&#xff09;。 研究了两天&#xff0c;还算简单&#xff0c;除了正则表达式似懂非懂&#xff…

在Linux系统安装Nginx及配置https加密访问

2019独角兽企业重金招聘Python工程师标准>>> 1、安装nginx ①、为了确保能在 nginx 中使用正则表达式进行更灵活的配置&#xff0c;安装之前需要确定系统是否安装有 PCRE&#xff08;Perl Compatible Regular Expressions&#xff09;包。您可以到 ftp://ftp.csx.c…

mysql cstmt_MySQL

创建一个以JDBC连接数据库的程序&#xff0c;包含7个步骤&#xff1a;1、加载JDBC驱动程序&#xff1a;在连接数据库之前&#xff0c;首先要加载想要连接的数据库的驱动到JVM(Java虚拟机)&#xff0c;这通过java.lang.Class类的静态方法forName(String className)实现。例如&am…

mkv210_image.c文件详解(为BL1添加校验头)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、mkv210_image.c的使用演示 裸机程序中的Makefile是把程序的编译和链接过程分开的。实际上真正的项目的Makefile也是这样的&#xff0c;只是平时我们用gcc a.c -o exe这种方式编译时&#xff0c;把…

和菜鸟一起学linux之bluez学习记录2

这里主要摘取对于hci&#xff0c;l2cap&#xff0c;sdp和rfcomm的一些应用编程。 关于hci 一、HCI层协议概述 1、HCI Command Packets 详见bluez源码&#xff1a;lib/hci.h /* Link Control */ #define OGF_LINK_CTL 0x01 #define OCF_INQUIRY 0x0001 #define OCF_…