`
tomhibolu
  • 浏览: 1383721 次
文章分类
社区版块
存档分类
最新评论

Linux设备模型(中)之上层容器

 
阅读更多

努力成为linux kernel hacker的人李万鹏原创作品,转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/05/05/6396620.aspx

Linux设备模型是由总线(bus_type),设备(device),驱动(device_driver)这三个数据结构来描述的。在设备模型中,所有的设备都通过总线来连接。即使有些设备没有连接到一根物理上的总线,Linux为其设置了一个内部的,虚拟的platform总线,来维持总线,驱动,设备的关系。总线是处理器与一个或者多个设备之间的通道。比如一个USB控制器通常是一个PCI设备,设备模型展示了总线和他们所控制的设备之间的连接。
一般来说可以这么理解,整个的设备模型是一个OO的体系结构,总线,设备,驱动都是其中鲜活存在的对象,kobject是他们的基类,所实现的只是一些公共的接口,kset是同种类型的kobject对象的集合,也可以说是对象的容器。只是因为C语言里不可能会有C++语言里类的class继承等概念,只有通过kobject嵌入到对象结构中来实现。这样,内核使用kobject将各个对象连接起来组成一个分层的体系结构。kobject结构中包含了parent成员,指向了另一个kobject结构,也就是这个分层结构的上一层结点。而kset是通过链表来实现的。

kobject是Linux在2.6中新引进的统一的设备管理模型,目的是对Linux的2.6系统所有的设备进行统一的管理。kobject是组成设备模型的基本结构。kobject是驱动程序模型中的一个核心数据结构,与sysfs文件系统自然的绑定在一起:——每个kobject对应sysfs文件系统中的一个目录。kobject往往被嵌入到设备驱动程序模型中的组件中,如总线,设备和驱动程序的描述符。kobject的作用是,为所属“容器”提供
.引用计数器
.维持容器的层次列表或组
.为容器的属性提供一种用户态查看的视图
kset是同类型kobject结构的一个集合体,通过kset数据结构可将kobjects组成一棵层次树。

subsys描述该总线的子系统,subsys是一个kset结构,他连接到一个全局变量kset bus_subsys中。这样,每一根总线系统都会通过bus_subsys结构连接起来。kset *devices_kset是指向该总线所有设备的集合的指针,kset *drivers_kset是指向该总线所有驱动的集合的指针。该总线上的设备和驱动分别用一个链表连接在一起,分别是klist_devices,klist_drivers。每次都用kset *drivers_kset,kset *devices_kset遍历所有设备/驱动很麻烦,用klist比较直接方便。

需要注意的是,总线也是设备,也必须按设备注册。这里的parent是指该设备所属的父设备,struct kobject kobj;表示该设备并把它连接到结构体系中的kobject。请注意,作为一个通用准则,device->kobj->parent与&device->parent->kobj是相同的。bus_id是在总线上唯一标识该设备的字符串。struct bus_type *bus;标识了该设备连接在何种类型的总线上。struct device_driver *driver;管理该设备的驱动。void (*release)(struct device *dev);当指向设备的最后一个引用被删除时,内核调用该方法。它将从内嵌的kobject的release方法中调用。device_private中的knode_parent,knode_driver,knode_bus分别是挂入parent,驱动,总线链表中的指针。

name指向驱动的名字,上边的device中也有一个名为bus_id的字符数组。查看一下,struct bus_type中有一个match,函数,这个是干什么用的呢。设备有了驱动才可以工作,只有驱动没有设备也是不行,驱动和设备需要关联上,这就需要这个match函数。驱动和设备是通过name来管理的,所以在match函数中要比较device的bus_id和driver中的name是否相等。如果相等,就说明驱动和设备互相找到了,这时device_driver中的probe函数被调用。我下边的例子中是这样实现的:

下面是一个测试程序:

BUS:

DEVICE:

DRIVER:

Makefile:

测试:

参考:
《Linux设备驱动程序(第三版)》
《Linux那些事儿之我是USB》

分享到:
评论

相关推荐

    Linux设备模型(中)之上层容器.pdf

    Linux内核经典文献之《 Linux设备模型(中)之上层容器.pdf 》,适合深入Linux内核!

    Linux常见驱动源码分析(kernel hacker修炼之道全集)--李万鹏

    Linux设备模型(中)之上层容器.pdf Linux设备模型(上)之底层模型.pdf Linux驱动修炼之道-驱动中一些常见的宏.pdf Linux驱动修炼之道-内存映射.pdf Linux驱动修炼之道-看门狗框架源码分析.pdf Linux驱动...

    cdi:容器设备接口-用于Linux容器的设备

    在Linux上,使容器能够感知设备就像在容器中暴露设备节点一样简单。 但是,随着设备和软件变得越来越复杂,供应商希望执行更多操作,例如: 将设备暴露于容器中可能需要暴露多个设备节点,从运行时名称空间安装...

    容器虚拟化之网络概述

    下网络设备虚拟化,容器虚拟化,docker网络模型等多个方面介绍。 网络虚拟化相对计算、存储虚拟化来说是比较抽象的,以我们在学校书本上学的那点网络知识来理解网络虚拟化可能是不够的。 在我们的印象中,网络就是由...

    onnx-mlir:MLIR编译器基础结构中ONNX模型的表示和参考降低

    ONNX MLIR MLIR中的开放式神经网络交换实现( )。 系统 建置状态 x86-Linux s390-Linux ... 要使用这些映像之一,请直接将其从Docker Hub中拉出,启动一个容器并在其中运行交互式bash shell,或将其

    精通Qt4编程(第二版)源代码

    \Qt还支持嵌入式系统,Qt的嵌入式版本称为Qtopia Core,可以在多种处理器上运行,目标操作系统通常是嵌入式Linux。Qtopia Core应用程序直接使用framebuffer,而不是笨重的X Window系统。Qt相关的另一个产品——Qt ...

    精通qt4编程(源代码)

    \ 第11章 事件机制 李立夏介绍了Qt的事件处理模型,详细介绍了在Qt程序设计中处理事件的五种方法,并讨论了如何利用Qt事件机制加快用户界面响应速度。 283 \ 第12章 数据库 李立夏介绍了Qt的数据库处理,重点介绍了...

    传智播客扫地僧视频讲义源码

    04_类中不写成员函数易犯错误模型 05-易犯错误模型-为什么需要成员函数(补充资料)-传智扫地僧 06_课堂答疑类中写成员函数_调用的时才会执行 07_程序设计方法发展历程 08_C语言和C++语言的关系_工作经验分享 09_...

    C++ GUI Programming with Qt4中文版.pdf

     阐明了Qt 4的模型/视图结构、插件支持、布局管理、事件处理、容器类,等等  介绍了其他书籍中所没有的许多高级技术——包括从插件的创建到与本地API的集成。  专门用一个附录介绍了最新发布的Java版Qt Jambi...

    java文章合集2

    I O 模型.pdf IOT语义互操作性之语义.pdf Java-利用Nginx负载均衡实现Web服务器.pdf Java开发必须掌握的8种网站攻防技术.pdf JS中的二进制操作简介.pdf redis集群部署及踩过的坑.pdf 一文告诉你高逼格程序员上下班都...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Tomcat是一个免费的开源的Serlvet容器,在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很...

    Java及大数据学习路线.pdf

    分布式版本管理⼯具Git与Github Mysql⾼级 Mycat实现MySQL的分布式、分库分表、读写分离 Nginx反向代理、负载均衡、动静分离 JVM内存模型、参数调优 JUC线程⾼级 分布式架构注册中⼼Zookeeper 虚拟化应⽤容器Docker ...

    OpenCV计算机视觉库-其他

    OpenCV的部署用途包括将街景图像拼接在一起,检测以色列监视视频中的入侵,监视中国的矿山设备,帮助机器人在Willow Garage导航和拾取物体,检测欧洲游泳池溺水事故,在西班牙和纽约,在土耳其检查跑道上的碎屑,...

    java 面试题 总结

    但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。 21、...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理Struts和Hibernate。 WebStorage HTML新增的本地存储解决...

    超级有影响力霸气的Java面试题大全文档

    但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理, EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。 24、...

    基于J2EE框架的个人博客系统项目毕业设计论...

    Tomcat是一个免费的开源的Serlvet容器,在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很...

    网管教程 从入门到精通软件篇.txt

    如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。 Diskpart  创建和删除硬盘...

    starling:Starling是用于移动性仿真的基于代理的框架

    史达琳 史达琳(Starling)是用于城市交通的基于代理的仿真框架。... 然后,您可以直接在Linux上安装依赖项,也可以使用Docker容器运行模拟。 我们建议使用Linux安装进行开发,并建议使用Docker安装进行运行仿真。

Global site tag (gtag.js) - Google Analytics