现在的位置: 首页 > 综合 > 正文

和菜鸟一起学linux总线驱动之启动篇

2013年08月06日 ⁄ 综合 ⁄ 共 1144字 ⁄ 字号 评论关闭

       突然觉得学了这么久的内核驱动,都没有很深入看内核总线底层的实现。简单看过了最低版本的内核的源码,总算可以稍微理清一些头绪了。现在回过头来,把这一部分的知识给补上去。

       Linux设备的模型有:总线(bus)、设备(device)和驱动(driver),还有类(class)。其中总线是处理器与设备之间通道,在设备模型中,所有的设备都通过总线相连;设备是对于一个设备的详细信息描述,驱动是设备的相关驱动。其基本关系如下:bus 相当于一个容器,是device 和device_driver 的管理机构,它包含了一个device 集合和一个driver 集合。其中,device集合包含了挂在该总线下的所有设备,这些设备通过链表链接起来;driver集合包含了挂在该总线下的所有驱动程序,这些驱动程序通过链表链接起来。

       总线是处理器和一个或多个设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟"platform"总线。可以通过ls -l /sys/bus看到系统加载的所有总线。总线可以相互插入。设备模型展示了总线和它们所控制的设备之间的实际连接。

       类是一个设备的高层视图,它抽象出了底层的实现细节,从而允许用户空间使用设备所提供的功能,而不用关心设备是如何连接和工作的。类成员通常由上层代码所控制,而无需驱动的明确支持。但有些情况下驱动也需要直接处理类。

       几乎所有的类都显示在/sys/class目录中,可以通过ls -l /sys/class来显示。出于历史的原因,有一个例外:块设备显示在/sys/block目录中。在许多情况,类子系统是向用户空间导出信息的最好方法。当类子系统创建一个类时,它将完全拥有这个类,根本不用担心哪个模块拥有那些属性,而且信息的表示也比较友好。为了管理类,驱动程序核心导出了一些接口,其目的之一是提供包含设备号的属性以便自动创建设备节点,所以udev的使用离不开类。

       具体的linux设备模型可以参考华清远见的下图。

比如说总线是i2c,设备有一个eeprom的i2c设备。也有其驱动。当设备和驱动名一致,又注册好了之后,那么就会匹配上。之后驱动就可以实现设备的功能了。

 

一个很好的例子,也是面向对象的概念了。


       这个比喻形象地表示了linux设备模型中设备、总线和类的关系了。花属于花卉这一类,水果属于水果这一类,对应的梅花什么的,就好比是设备。茎运输养料给花卉和水果什么的,就好比总线中的数据传输了。

       现在的程序都以大自然为基本,面向对象就是妙啊。当初死板的面向过程,在这面前就显得如此的苍白无力了。

大概了解了linux设备模型中的一些简单的概念。那么就可以开始深入的去看源码了。Fighting!

 

抱歉!评论已关闭.