当前位置: 首页 > news >正文

设备驱动基础1:设备模型之总线,驱动,设备

原文:http://www.cnblogs.com/image-eye/archive/2012/01/29/2331254.html

 

Kobject,kset是设备模型的基本结构体,设备模型使用这两个结构体来完成设备的层次关系,但在实际的设备驱动编写中,我们基本上用不到kobject,kset这些结构体,是因为这些结构体又被嵌入到更大的结构体中,原因在于kobject,kset结构体只能表征设备的层次关系,但是一个设备的驱动,并不是简单的一个层次关系而已,因此,必需要把kobject,kset结构体嵌入到更大的结构体中,使用kobject,kset来表征层次关系,用其他的成员表示设备驱动的具体功能

在设备模型中,我们将看到,设备驱动主要是由总线,驱动程序,设备三个部分构成,通过这三个标准部件,把各种纷繁杂乱的设备归结过来,达到简化设备驱动编写的目的,也即我们编写的设备驱动,其实也只是这三部分中的一个很小的部分的。

 

我们编写的设备驱动程序,一定是先属于一个总线的驱动,比如属于USB总线,或者属于PCI总线,或者属于I2C总线,等等,因为我们编写的设备驱动,在注册,安装到系统时,系统会先检查驱动是属于哪个总线的(设备驱动编写时已经定义好),会把驱动加入到对应的总线的kset中,即把当前设备驱动的kobject加入到对应总线的kset中,形成层次关联。而当系统检测到有设备存在(硬件),也会先判断设备是属于哪个总线的(硬件连接),然后遍历当前总线下的所有设备驱动程序,通过所属总线的探测函数,查找是否有设备驱动程序匹配可以驱动当前的设备(一般是通过获得设备的PID,VID,跟驱动程序的PID,VID比较,看是否匹配而定),如果有驱动程序可以驱动设备,则把当前设备也加入到所属总线的kset中,如果没有可驱动设备的驱动程序,则只能在总线的设备链表中存在,而如果设备都无法通过总线的匹配,则也没有办法存在于总线的设备链表中。由于一条总线要管理总线上的所有驱动,同时要管理总线上的有所设备,则需要再把所有设备和所有驱动都分开,分别设立一个设备kset和一个设备驱动kset,用于管理所有的设备和设备驱动,如此,则总线kset实际上包含了两个kset(设备kset,设备驱动kset),设备kset又包含了所有的当前总线的设备的kobject,设备驱动kset包含了所有的当前总线的设备驱动的kobject;而所有的总线,又形成了bus的kset,归结起来就形成下图的层次关系:

每个设备,都被挂接到不同的总线上,当设备挂接到对应的总线上后,其所对应的总线类型就确定了,而设备在挂接到总线上时,总线先要扫描设备,看看设备是否适合总线的要求,如果适合了,那接着就要扫描整个总线上的设备驱动链表,查找是否有驱动程序可以管理设备,如果找到,则把设备结构体中的相应指针成员指向对应的驱动程序,如果暂时没有找到对应的设备驱动程序,则设备结构体中的指向驱动程序的指针暂时为空,表示还没有设备驱动,还在总线的设备队列中等待;而如果设备不能通过总线的检查,即不会出现在总线的设备列表上,自然不会去扫描设备驱动链表,查找匹配的驱动了。

而每个设备驱动程序,都是被安装到对应的总线上的,不论是手动安装,还是自动安装,所谓安装,就是把驱动程序挂载到对应总线的驱动链表中,而挂载到对应的总线驱动链表,首先要满足总线的匹配要求,只有适合了要求,才能挂载到总线的驱动链表,也只有到达这个步骤,系统才会扫描整个总线的设备链表,来查找是否有设备需要此驱动来管理,如果找到这个设备,则驱动程序中的设备管理链表,会记录这个设备的地址,从而达到管理设备的目的。

经过上述的设备插入,或者驱动安装,系统就会出现只有设备,而没有设备驱动程序的情况,也会出现,只有设备驱动程序,没有对应的设备的情况,此时,设备或者设备驱动程序,就会暂时在各自的队列里等待,一旦有驱动程序安装,或新的设备插入,就都会自动的去扫描对应的链表,来检测是否有配对的可能。

综合上述三者的关系,如图:

 

转载于:https://www.cnblogs.com/Ph-one/p/5070093.html

相关文章:

  • 位域“ :”
  • Kobject结构体分析
  • 2016年01月12号
  • 逻辑分析仪作用
  • make clean、make mrproer、make distclean
  • vim编辑器配置
  • 安装该设备时去现一个错误,系统找不到指定的文件
  • git提交代码步骤
  • 五线谱基础知识
  • make clean-kernel make kernel
  • git add 之后因为没提交正确文件需要撤销
  • synergy在Windows和ubuntu 多台PC共享一套键盘鼠标
  • adb命令
  • 串口log
  • G-sensor 与M-sensor区别
  • hexo+github搭建个人博客
  • 345-反转字符串中的元音字母
  • CEF与代理
  • css系列之关于字体的事
  • docker-consul
  • ES6 学习笔记(一)let,const和解构赋值
  • golang 发送GET和POST示例
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java,console输出实时的转向GUI textbox
  • JAVA之继承和多态
  • Joomla 2.x, 3.x useful code cheatsheet
  • Nodejs和JavaWeb协助开发
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Shell编程
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 检测对象或数组
  • 蓝海存储开关机注意事项总结
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 实战|智能家居行业移动应用性能分析
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 移动端 h5开发相关内容总结(三)
  • 译自由幺半群
  • 用jquery写贪吃蛇
  • 通过调用文摘列表API获取文摘
  • ​比特币大跌的 2 个原因
  • ​低代码平台的核心价值与优势
  • #{} 和 ${}区别
  • #QT(一种朴素的计算器实现方法)
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $.ajax()参数及用法
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • %@ page import=%的用法
  • (9)STL算法之逆转旋转
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (k8s中)docker netty OOM问题记录
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (汇总)os模块以及shutil模块对文件的操作
  • (七)c52学习之旅-中断
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程