不妨再把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部分。
人面不知何處去,桃花依舊笑春風。 唐·崔護·題都城南莊