device_add()浅析

/*
    添加一个设备到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;              
    }   
    */


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值