linux设备与驱动关系,Linux下设备device_register和驱动driver_register先后注册的影响和关系...

这篇博客详细介绍了Linux内核中设备驱动注册过程中的链表操作。通过`kobject_add`函数,设备驱动的kobject被添加到bus的drivers链表中,使得在设备注册时能遍历该链表找到对应的驱动。同时,设备的`bus_list`直接加入到bus的`devices.list`链表,实现设备的注册。这种结构简化了设备和驱动的管理,便于系统遍历查找。文章强调了理解这些链表操作对于深入理解驱动注册的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所以 drv->kobj.kset = &bus->drivers;这个做的事情需要结合函数 kobject_register->kobject_add函数中去

static void unlink(struct kobject * kobj)

{

if (kobj->kset) {

down_write(&kobj->kset->subsys->rwsem);

list_del_init(&kobj->entry);

up_write(&kobj->kset->subsys->rwsem);

}

kobject_put(kobj);

}

/**

* kobject_add - add an object to the hierarchy.

* @kobj: object.

*/

int kobject_add(struct kobject * kobj)

{

int error = 0;

struct kobject * parent;

if (!(kobj = kobject_get(kobj)))

return -ENOENT;

if (!kobj->k_name)

kobj->k_name = kobj->name;

parent = kobject_get(kobj->parent);

pr_debug("kobject %s: registering. parent: %s, set: %s\n",

kobject_name(kobj), parent ? kobject_name(parent) : "",

kobj->kset ? kobj->kset->kobj.name : "" );

if (kobj->kset) {

down_write(&kobj->kset->subsys->rwsem);

if (!parent)

parent = kobject_get(&kobj->kset->kobj);

list_add_tail(&kobj->entry,&kobj->kset->list); //kobj的list_head内容加到bus->drivers的list链表中

up_write(&kobj->kset->subsys->rwsem);

}

kobj->parent = parent;

error = create_dir(kobj);

if (error) {

/* unlink does the kobject_put() for us */

unlink(kobj);

if (parent)

kobject_put(parent);

} else {

kobject_hotplug(kobj, KOBJ_ADD);

}

return error;

}

在这里有这么一个list_add_tail宏来完成device_driver中将成员kobject的kset链表头加入到kobj->kset->list中去,实际是drv->kobj.kset = &bus->drivers,也就是加入到链表头bus->drivers->list中去。这样就顺利完成了在设备注册时,可以遍历到这个链表头下面的驱动。

总结一下的话,其实devices和driver在注册中,最终都会挂接到bus下面,类型是kset(device和driver)下的list。最终都去遍历这个链表头下面对应的驱动和设备。而我们知道一个驱动可以有多个设备,因此device下的driver_list会添加到driver下面的链表头中去。

相对于driver_register的实现,device_register这方面的实现,就简单多了,一句list_add_tail(&dev->bus_list, &dev->bus->devices.list); //将设备的bus_list加入到devoces.list的链表头中,这个简单了很多很多。很明了,而不需要像驱动那样将kobj下面的链表加入到Bus下面去用于遍历。

总之,这个问题很小,但是和内核走的很近很近,所以,遇到这个问题我想必须解决,这样可以带给我对驱动很深入的理解。继续努力,走在linux的世界里。0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值