bus,device,driver三者关系

news/2024/7/4 1:43:55 标签: struct, class, 工作, 嵌入式, 游戏
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

bus,device,driver三者关系

bus:
总线作为主机和外设的连接通道,有些总线是比较规范的,形成了很多协议。如 PCI,USB,1394,IIC等。任何设备都可以选择合适的总线连接到主机。当然主机也可能就是CPU本身。内存也是通过BUS连接到主机的,可内存 使用的总线不是外设总线,因此和内存使用相同类型的总线的设备,谈及BUS比较含糊。
一块网卡在嵌入式开发中,直接通过内存总线接入到CPU。我们在写网卡驱动时,要给该BUS定义就麻烦了。

driver:
驱动程序是在CPU运行时,提供操作的软件接口。所有的设备必须有与之配套驱动程序才能正常工作。一个驱动程序可以驱动多个类似或者完全不同的设备。

device:
设备就是连接在总线上的物理实体。设备是有功能之分的。具有相同功能的设备被归到一个类(CLASS中)。如音频设备(和声音相关的都算),输入设备(鼠标,键盘,游戏杆等)。。。。

从宏观考虑,任何设备必须要连接到主机才能发挥其作用。一个鼠标离开了电脑主机就不再是鼠标了。提到了连接就必然出现总线BUS。任何设备要正常运行必须有软件支持,所有的设备必须有DRIVER。设备的目的就是完成功能,根据功能的分类,该设备必然属于某个CLASS。


1.三者的定义在 include/linux/device.h里。

2.总线中的那两条链表是怎么形成:
     这要求每次出现一个设备就要向总线汇报,或者说注册,每次出现一个驱动,也要向总线汇报,或者说注册。比如系统初始化的时候,会扫描连接了哪些设备,并为 每一个设备建立起一个class="tags" href="/tags/STRUCT.html" title=struct>struct device的变量,每一次有一个驱动程序,就要准备一个class="tags" href="/tags/STRUCT.html" title=struct>struct device_driver结构的变量。把这些变量统统加入相应的链表,device 插入devices 链表,driver插入drivers链表。这样通过总线就能找到每一个设备,每一个驱动.然而,假如计算机里只有设备却没有对应的驱动,那么设备无法工 作。反过来,倘若只有驱动却没有设备,驱动也起不了任何作用。

3.总线上的两条链表已经有了,链表里的device和driver又是如何联系
      每一个要用的device在计算机启动之前就已经插好了,插放在它应该在的位置上,然后计算机启动,然后操作系统开始初始化,总线开始扫描设备,每找到一个设备,就为其申请一个class="tags" href="/tags/STRUCT.html" title=struct>struct device结构,并且挂入总线中的devices链表中来
     
      然后每一个驱动程序开始初始化,开 始注册其class="tags" href="/tags/STRUCT.html" title=struct>struct device_driver结构,然后它去总线的devices链表中去寻找(遍历),去寻找每一个还没有绑定driver的设备,即class="tags" href="/tags/STRUCT.html" title=struct>struct device中的class="tags" href="/tags/STRUCT.html" title=struct>struct device_driver指针仍为空的设备,然后它会去观察这种设备的特征,看是否是他所支持的设备,如果是,那么调用一个叫做 device_bind_driver的函数。 换句话说,把class="tags" href="/tags/STRUCT.html" title=struct>struct device中的class="tags" href="/tags/STRUCT.html" title=struct>struct device_driver driver指向这个driver,而class="tags" href="/tags/STRUCT.html" title=struct>struct device_driver driver把class="tags" href="/tags/STRUCT.html" title=struct>struct device加入他的那张class="tags" href="/tags/STRUCT.html" title=struct>struct klist klist_devices链表中来。就这样,bus、device和driver,这三者之间或者说他们中的两两之间,就给联系上了


4.热插拔:
    device可以在计算机启动以后在插入或者拔出计算机了。因此,很难再说是先有 device还是先有driver了。因为都有可能。device可以在任何时刻出现,而driver 也可以在任何时刻被加载,所以,出现的情况就是,每当一个class="tags" href="/tags/STRUCT.html" title=struct>struct device诞生,它就会去bus的drivers链表中寻找自己的另一半,反之,每当一个一个class="tags" href="/tags/STRUCT.html" title=struct>struct device_driver诞生,它就去bus的devices链表中寻找它的那些设备。如果找到了合适的,那么ok,和之前那种情况一下,调用 device_bind_driver绑定好.

    http://blog.csdn.net/yinkaizhong/archive/2009/02/16/3896383.aspx


http://www.niftyadmin.cn/n/1720191.html

相关文章

sort 对多列进行排序

sort -t \t -k 3,3 -k 2,2 文件名 # 先对第三列进行排序,然后再对第二列进行排序转载于:https://www.cnblogs.com/0820LL/p/10753089.html

C++:引用及引用作为类成员变量 tcy

常量变量:必须通过构造函数参数列表进行初始化。 引用变量:必须通过构造函数参数列表进行初始化。 普通静态变量:要在类外通过"::"初始化。 静态整型常量:可以直接在定义的时候初始化。 静态非整型常量:…

浅析dev目录下设备文件mknod节点gid,uid和mode的如何方便设置

init > handle_device_fd 收到uevent信息 > handle_device_event > static void handle_device_event(struct uevent *uevent){.../* are we block or char? where should we live? */if(!strncmp(uevent->path, "/block", 6)) {block 1;base …

C++ 模板 class,typename的区别 tcy

1.1.定义:模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用. 1.2.分类: 1)从属名称: 模板(template)内出现的名称, 相依于某个模…

Android平台上使用属性系统(property system)

在使用Android的属性系统(property system)时遇到了一些问题,结合此次经历,对属性系统的使用做以简单介绍。 一、Property系统简介 属性系统是android的一个重要特性。它作为一个服务运行,管理系统配置和状态。所有这些配置和状态都是属性。…

C实现python中的简单列表list tcy

1.说明: 本类参考python的List实现封装;实现一维动态数组;插入删除时动态内存自动增加减少;你能用基本的数据类型包含结构枚举联合;唯一和python中List的区别是不能存放不同数据类型(所有的类型应相同&…

C++Set封装:实现类似python的集合实现子交并补及判断 tcy

本篇通过C的Set,封装啦类似python的集合函数。实现子交并补的运算及判断。相比于python集合内只能放一种任意的类型。 集合的运算:设A和B是集合,则它们的并差交补集分别定义如下:A∪B { x | x∈A or x∈B } 并集A∩B { x | x∈A and x∈B …

Android筆記

好一段時間 , 都在 ARM based RTOS 通訊產品中開發 , 很難有機會回到 Embedded Linux 的領域 , 而 Linux 上所擁有的豐富資源 , 更是凡事都要親力親為的 RTOS 環境所不能比擬的 . 最近 , 有機會參與移植 Android 到新的晶片計畫 , 也藉此機會 , 把 Android 的基礎工程做一個 R…