您的位置:首页 > 运维架构 > Linux

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

2016-05-17 17:40 369 查看
不妨再把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部分。

人面不知何处去,桃花依旧笑春风。 唐·崔护·题都城南庄
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: