免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1071 | 回复: 0

设备模型总结 [复制链接]

论坛徽章:
0
发表于 2009-08-23 13:45 |显示全部楼层

1、必须明白的概念:subsystem,set,kobject。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image002.gif
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image004.gif
而subsystetem在最新内核代码中已经没有,被kset所取代。kobject提供基本的对象管理,是构成Linux2.6设备模型的核心结构,它与sysfs文件系统紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Kobject是组成设备模型的基本结构。

子系统对应有sys目录下的第一和第二级目录:如bus,pci,scsi等。
Kobject对应有设备、驱动等。

2、总线、设备、设备驱动关系
以上三者在设备模型中是相互关联的。分别有对应的结构体来表示:

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image006.gif

file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image008.gif
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image010.gif
以上三者关系图如下:
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image012.gif
3、分析顶层bus子系统和pci总线注册过程(分析代码)
Bus.c:(drivers/base)
subsystem_register(&bus_subsys) è kset_add è kset_add
顶层总线系统就对应/sys/bus目录。其他任何新注册的总线内型都在改目录下。顶层总线bus对外提供了bus_register函数来保证其他总线在/sys/bus目录下。往系统内注册一条新的总线需要调用该函数。下面可以看bus_register函数的调用过程:
int bus_register(struct bus_type * bus)
{
      int retval;

      retval = kobject_set_name(&bus->subsys.kset.kobj, "%s", bus->name);
      if (retval)
           goto out;

      subsys_set_kset(bus, bus_subsys);
      retval = subsystem_register(&bus->subsys);
      if (retval)
           goto out;

      kobject_set_name(&bus->devices.kobj, "devices");
      bus->devices.subsys = &bus->subsys;
      retval = kset_register(&bus->devices);
      if (retval)
           goto bus_devices_fail;

      kobject_set_name(&bus->drivers.kobj, "drivers");
      bus->drivers.subsys = &bus->subsys;
      bus->drivers.ktype = &ktype_driver;
      retval = kset_register(&bus->drivers);
      if (retval)
           goto bus_drivers_fail;
      bus_add_attrs(bus);

}
所以新注册进/sys/bus目录下的总线目录下又有devices和drivers两个目录,这也与上面device、device_driver、bus关系图相吻合。
    搜bus_register就可以知道系统内注册过哪些总线内型,找到pci总线注册的地方。
Pci-driver.c:(drivers/pci)
static int __init pci_driver_init(void)
{
   return bus_register(&pci_bus_type);
}
很简单,这里正是调用上面的总线注册函数,可以跟进去再分析一遍,加深映像。那么注册以后我们会看到目录/sys/bus/pci,并且该目录下还有drivers和devices两个目录,它们下面都是空的。
我们为什么要注册总线?
    为设备服务,这就引出如何注册设备、设备驱动程序?往系统中注册一个新的总线后至少要向外面到处两个函数,一个是该总线上设备到来后的往总线上注册设备的函数,另一个是注册设备驱动的函数。往往一个总线与其具体协议有关,如何发现设备、和注册设备是和具体的硬件驱动以及协议有关系,所以注册设备从最底下到上面是一个复杂的过程,如scsi总线系统注册一个scsi硬盘。
file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/03/clip_image014.gif

可以猜测上面分析的两个必备函数作用?最直观的感觉就是往相对应总线目录下devices和drivers目录下填设备的驱动的信息。这同样是根据kobject来实现的。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103332/showart_2034998.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP