Chinaunix首页 | 论坛 | 博客
  • 博客访问: 113010
  • 博文数量: 23
  • 博客积分: 2092
  • 博客等级: 大尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-10 19:40
文章分类
文章存档

2011年(3)

2010年(17)

2009年(3)

我的朋友

分类: LINUX

2010-09-12 14:15:09

上个月走马观花读完《linux设备驱动详解》,读完了也就完了,虽然也有不少收获,但是感觉还是不够。后来见到《linux内核修炼之道》才明白什么叫相见恨晚。网络上的PDF 下回来一口气读完,有机会买本回来读读。linux那些事也非常精彩,写这些只为做一些杂记,只为记住我读到哪里了,不为别的。
 
总线设备驱动模型即
struct bus_type
struct device
struct device_driver
这三者间的相互关系。

struct bus_type 中为devices drivers 准备了两个链表,而代表device 的结构体struct device 中又有两个成员,struct bus_type *bus struct device_driver *driver,同样,代表

driver 的结构体struct device_driver 同样有两个成员,struct bus_type *bus struct list_head devices,struct device struct device_driver 的定义和struct bus_type 一样,

include/linux/device.h

 

于是我们想知道,关于bus,关于device,关于driver,他们是如何建立联系的呢?换言之,这三个数据结构中的指针是如何被赋值的?绝对不可能发生的事情是,一旦为一条总线申请了一个struct bus_type 的数据结构之后,它就知道它的devices 链表和drivers 链表会包含哪些东西,这些咚咚一定不会是先天就有的,只能是后天填进来的.而具体到usb 系统,完成这个工作的就是

usb core.usb core 的代码会进行整个usb 系统的初始化,比如申请struct bus_type usb_bus_type,然后会扫描usb 总线,看线上连接了哪些usb 设备,或者说root hub 上连了哪些usb 设备,比如说连了一个usb 键盘,那么就为它准备一个struct device,根据它的实际情况,为这个struct device 赋值,并插入devices 链表中来.又比如root hub 上连了一个普通的hub,那么除了要为这个hub 本身准备一个struct device 以外,还得继续扫描看这个hub 上是否又

连了别的设备,有的话继续重复之前的事情,这样一直进行下去,直到完成整个扫描,最终就把usb_bus_type 中的devices 链表给建立了起来.

 

 

而此刻我们只需注意到其中的struct device_driver driver 这个成员,usb core 为每一个设备驱动准备了一个函数,让它把自己的这个struct device_driver driver 插入到usb_bus_type 中的drivers 链表中去.而这个函数正是我们此前看到的usb_register.而与之对应的usb_deregister 所从事的正是与之相反的工作,把这个

结构体从drivers 链表中删除.

 

 

很久很久以前,在那激情燃烧的岁月里,先有的是device,每一个要用的device 在计算机启动之前就已经插好了,插放在它应该在的位置上,然后计算机启动,然后操作系统开始初始化,总线开始扫描设备,每找到一个设备,就为其申请一个struct device 结构,并且挂入总线中的devices 链表中来,然后每一个驱动程序开始初始化,开始注册其struct device_driver 结构,然后它去总线的devices 链表中去寻找(遍历),去寻找每一个还没有绑定driver 的设备,struct device 中的struct device_driver 指针仍为空的设备,然后它会

去观察这种设备的特征,看是否是他所支持的设备,如果是,那么调用一个叫做device_bind_driver 的函数,然后他们就结为了秦晋之好.换句话说,struct device 中的struct device_driver driver 指向这个driver,struct device_driver driver struct device 加入他的那张struct list_head devices 链表中来.就这样,bus,device,driver,这三者之间或者说他们中的两两之间,就给联系上了.知道其中之一,就能找到另外两个.一荣俱荣,一损俱损.

 

出现了一种新的名词,叫热插拔.device可以在计算机启动以后在插入或者拔出计算机了.因此,很难再说是先有device 还是先有driver .因为都有可能.device 可以在任何时刻出现,driver 也可以在任何时刻被加载,所以,出现的情况就是,每当一个struct device 诞生,它就会去bus drivers 链表中寻找自己的另一半,反之,每当一个一个struct device_driver 诞生,它就去bus devices 链表中寻找它的那些设备.如果找到了合适的,那么ok,和之前那种情况一下,调用device_bind_driver 绑定好.如果找不到,没有关系,等待吧,等到昙花再开,等到风景看透,心中相信,这世界上总有一个人是你所等的,只是还没有遇到而已。

阅读(1552) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2010-12-30 17:36:01

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com