【转】Linux那些事儿之我是Sysfs(5)举例二sculld - wilson的日志 ...

来源:百度文库 编辑:神马文学网 时间:2024/05/23 20:27:16

【转】Linux那些事儿之我是Sysfs(5)举例二sculld

linux kernel 2009-07-14 16:28:49 阅读89 评论0   字号:大小 订阅

不妨再把sculld的代码也分析一下,先看初始函数
sculld_init()
             -> register_ldd_driver()
                         ->driver_register()
                                            ->bus_add_driver()
             -> register_ldd_device()
                         ->device_register()
                                           ->device_add()
                                                             ->kobject_add()
                                                             ->bus_add_device()

首先注册驱动,看bus_add_driver()
    532 int bus_add_driver(struct device_driver * drv)
    533 {
    534         struct bus_type * bus = get_bus(drv->bus);
    535         int error = 0;
    536
    537         if (bus) {
    538                 pr_debug("bus %s: add driver %s\n", bus->name, drv->name);
    539                 error = kobject_set_name(&drv->kobj, "%s", drv->name);
    540                 if (error) {
    541                         put_bus(bus);
    542                         return error;
    543                 }
    544                 drv->kobj.kset = &bus->drivers;
    545                 if ((error = kobject_register(&drv->kobj))) {
    546                         put_bus(bus);
    547                         return error;
    548                 }
    549
    550                 down_write(&bus->subsys.rwsem);
    551                 driver_attach(drv);
    552                 up_write(&bus->subsys.rwsem);
    553                 module_add_driver(drv->owner, drv);
    554
    555                 driver_add_attrs(bus, drv);
    556         }
    557         return error;
    558 }
    559

545行kobject_register()与kobject_add()差不多,进行注册,把自己kobject链接到内核中去。
551,driver_attach(drv); 在总线中寻找,有没有设备可以让这个driver驱动。

    353 void driver_attach(struct device_driver * drv)
    354 {
    355         struct bus_type * bus = drv->bus;
    356         struct list_head * entry;
    357         int error;
    358
    359         if (!bus->match)
    360                 return;
    361
    362         list_for_each(entry, &bus->devices.list) {
    363                 struct device * dev = container_of(entry, struct device, bus_list);
    364                 if (!dev->driver) {
    365                         error = driver_probe_device(drv, dev);
    366                         if (error && (error != -ENODEV))
    367                                 /* driver matched but the probe failed */
    368                                 printk(KERN_WARNING
    369                                     "%s: probe of %s failed with error %d\n",
    370                                     drv->name, dev->bus_id, error);
    371                 }
    372         }
    373 }


然后注册设备,
    455 int bus_add_device(struct device * dev)
    456 {
    457         struct bus_type * bus = get_bus(dev->bus);
    458         int error = 0;
    459
    460         if (bus) {
    461                 down_write(&dev->bus->subsys.rwsem);
    462                 pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
    463                 list_add_tail(&dev->bus_list, &dev->bus->devices.list);
    464                     465                 up_write(&dev->bus->subsys.rwsem);
    466                 device_add_attrs(bus, dev);
    467                 sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id);
    468         }
    469         return error;
    470 }
463,把设备连入其总线的devices.list链表中。
464,device_attach(dev)与driver_attach()相对应,它在总线的驱动中寻找,看有没有一个driver能驱动这个设备。
467,创建了一个链接。

最后形成的kobject层次结构如图所示。 

变化
计划赶不上变化,当前的内核版本已经是2.6.22了,其中不少数据结构作了变动,而且subsystem这个数据结构已经没有了,完全被kset取缔了。但是原理上并没有变,我认为,学习知识是一方面,更重要的是学习方法。只要懂了方法,我们才可"以不变应万变"。

17大马上要召开了,刘翔又夺冠了,奥尔默特与阿巴斯也会面了,明年就奥运了。和谐的社会里充满着希望与绝望。不管怎样,终于把设备模型介绍完毕,接下来进入sysfs部分。

人面不知何处去,桃花依旧笑春风。 唐·崔护·题都城南庄

【转】Linux那些事儿之我是Sysfs(5)举例二sculld - wilson的日志 ... 【转】Linux那些事儿之我是Sysfs(4)举例一lddbus - wilson的日志 ... [转]Linux那些事儿之我是Sysfs(1)sysfs初探 - wilson的日志 - ... 【转】Linux那些事儿之我是Sysfs(6)文件系统 - wilson的日志 - 网易博... 【转】Linux那些事儿之我是Sysfs(9)sysfs文件系统模型 - wilson的日... 【转】Linux那些事儿之我是Sysfs(10)sysfs 创建目录 - wilson的日... 【转】Linux那些事儿之我是Sysfs(7)dentry与inode - wilson的... 【转】Linux那些事儿之我是Sysfs(11)sysfs 创建普通文件 - wilson... 【转】Linux那些事儿之我是Sysfs(12)举例三:sysfs读入文件夹内容 - wi... 【转】Linux那些事儿之我是Sysfs(13)举例四:sysfs读入普通文件内容 - w... 【转】Linux那些事儿之我是Sysfs(8)一起散散步-pathwalk - wilso... [明朝那些事儿]朱元璋传说之二 linux启动时对编译进内核驱动模块的加载 - wilson的日志 - 网易博客 明朝的那些事儿(二) 明朝的那些事儿(二) 明朝的那些事儿 第二二章 明朝的那些事儿 第三二章 二小那些事儿 二小那些事儿 linux内核netfilter之ip_conntrack模块的作用举例 linux内核netfilter之ip_conntrack模块的作用举例 Linux 系统内核空间与用户空间通信的实现与分析 - wilson的日志 - 网易博客 IDC那些事儿 二十六章节 中国互联网发展的两个瓶颈之监管篇 - 运营管理 - 行业探讨 ... [转] 60 70年代的那些事儿