本人目前就职于烽火集成,从事云计算产品架构设计相关工作,长期专注于内核、虚拟化、分布式、云计算等方向。
技术交流请联系:xiaoding@fiberhome.com
linux的设备是按照总线,设备,驱动联系起来的。简单来说就是任何设备都是挂在在一个总线上,而设备也有相应的驱动,才能正确的运行。
在理解这些概念前,首先要介绍一下linux中的对象模型。
kobject:每一个对象都必须是一个kobject。所有的设备时间通过uevent来驱动。比如kobj的增加,删除等。
kset:就是kobject的集合。
举个例子,在系统中bus是一个根节点,bus中包含各种各样的总线,比如xen,pci,scsi等等。xen,pci,scsi就属于在kset中。
linux为了方便管理这些设备。这些设备会加入到sysfs中。
sysfs是一个特殊的文件系统,专门用来呈现设备模型。
今天,就从代码级别来看一下他们具体是如何被组织起来的。
从xen-bus前端总线的驱动来看总线是怎么工作的。
可以看到,在系统初始化时就会被执行bus_register来注册xenbus。
打开bus_register来看可以看到整个bus的处理过程。注册一个bus到系统总线中。
上面介绍了一个总线对象的初始化过程。创建了kobj,并加入到kset中。然后再sysfs上注册相应信息。
对于设备的发现,也是通过总线扫描来做到的。xenbus是通过
xenbus_thread来对xenstore进行监控,当检测到有信息变化时候,执行了xenbus_probe_node然后调用
device_register来进行设备的注册。
device_add函数并没有过多需要说明的,也就是类似bus_register进行了sysfs相关文件建立,确定了父子kobj之间的关系,加入到device的集合等操作。在device_add中加入了bus_probe_device函数,该函数是用来把device加入到相应的总线中。
上面描述了一个设备的插入的过程。可以看到从总线扫描到一个设备,然后建立设备和驱动之间的关联,从而将总线
,设备,驱动联系在了一起。