Linux设备驱动模型(三)—追根之溯源

软件设计的根本是把现实世界的事物用计算机世界的模型表示出来,Linux设备模型的设计采用了面向对象的思想。

在前一讲中,提到sysfs文件系统,Sysfs文件系统的目标就是要展现设备驱动模型组件之间的层次关系。在Linux中,sysfs文件系统被安装于/sys目录下:

mount -t sysfs sysfs /sys
/sys
     |—block/
     |   |–fd0
     |   |–hda
     |   |–dev
     |   |–device->../../devices/pci0000:00/0000:00:1f.1/ide0/0.0
     |    …
     |–bus/
     |–class/
     |–devices/
     |–firmware/

     
|–power/
     |–module/


   那么,在这样的目录树中,哪些目录是驱动模型要关注的对象?

bus系统中用于连接设备的总线,在内核中对应的结构体为 struct bus_type { …  };
device内核所识别的所有设备,依照连接它们的总线对其进行组织, 对应的结构体为struct device { …  };
class系统中设备的类型(声卡,网卡,显卡,输入设备等),同一类中包含的设备可能连接到不同的总线, 对应的结构体为 struct class { …  };
为什么不对Power进行单独描述?实际上,Power与device有关,它只是device中的一个字段。
除此之外,立马闪现在我们脑子里的对象还有:
driver在内核中注册的设备驱动程序, 对应的结构体为
struct device_driver{ …  };

以上bus,device,class,driver,是可以感受到的对象,在内核中都用相应的结构体来描述。而实际上,按照面向对象的思想,我们需要抽象出一个最基本的对象,这就是设备模型的核心对象kobject.
   Kobject Linux 2.6引入的新的设备管理机制,在内核中就是一个struct kobject结构体。有了这个数据结构,内核中所有设备在底层都具有统一的接口,kobject提供基本的对象管理,是构成Linux2.6设备模型的核心结构,它与sysfs文件系统紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Kobject是组成设备模型的基本结构。类似于C++中的基类,它嵌入于更大的对象中,即所谓的容器,如上面提到的bus,classdevices, drivers 都是典型的容器,它们是描述设备模型的组件。
  
下一讲,将围绕kobject展开。

 
.

发表评论

电子邮件地址不会被公开。 必填项已用*标注