/*
添加一个设备到liux设备驱动模型中
device_register()
{
device_initialize();
device_add();
}
*/
int device_add(struct device * dev)
{
struct device * parent = NULL;
struct class_interface * class_intf;
int error = -EINVAL;
dev = get_device(dev);
/**
增加设备的引用计数
过程:
to_dev(kobject_get(&dev->kobj));
struct kobject *kobject_get(struct kobject *kobj)
{
if (kobj)
{
kref_get(&kobj->kref)
{
//struct kref :引用计数器,嵌套在kobject中记录该kobejct的引用计数,包含一个atomic_t类型的计数值
//struct kref {
// atomic_t refcount;//当它的值为0的时候,kobject的生命周期就结束了,release会被调用
//};
atomic_inc(&kref->refcount);
}
}
return kobj;
}
/**
再设备的卸载时,也会减少引用计数,而且如果引用计数为0,调用release函数
*/
void device_unregister(struct device *dev)
{
pr_debug("device: '%s': %s\n", dev_name(dev), __func__);
device_del(dev);
put_device(dev)
{
if (dev)
{
kobject_put(&dev->kobj)
{
kref_put(&kobj->kref, kobject_release)
{
//从原子变量refcount中减去 1
if (atomic_dec_and_test(&kref->refcount))
{
release(kref);
return 1;
}
}
}
}
}
}
if (!dev)
{
goto done;
}
*/
device_add()浅析
最新推荐文章于 2024-01-31 14:10:02 发布