什么是关于设备驱动程序模型的参考计数器?

时间:2015-12-12 22:08:14

标签: linux-device-driver device-driver reference-counting

在学习了解Linux内核的同时,我在Kobject结构和容器中遇到了参考计数器。 那么,如何映射这些结构会有什么帮助呢? 以下是ULK第3版的准备。

  

kref字段是k_ref类型的结构,由单个refcount字段组成。顾名思义,这个字段是kobject的引用计数器,但它也可以作为kobject容器的引用计数器。 kobject_get( )kobject_put( )函数分别增加和减少参考计数器;如果计数器达到零值,则释放kobject使用的资源,并执行kobj_type的{​​{1}}对象的释放方法。此方法通常仅在动态分配kobject容器时定义,才能释放容器本身。

类似地,在更多上下文中使用了该参考计数器。 我想知道参考计数器的实际映射。

1 个答案:

答案 0 :(得分:0)

" kobject"的关键功能是作为对象的参考计数器 它嵌入其中。只要存在对象的引用,对象(以及支持它的代码)就必须继续存在。用于操纵kobject的引用计数的低级函数是:

struct kobject *kobject_get(struct kobject *kobj);
void kobject_put(struct kobject *kobj);

调用kobject_get会增加kobject的引用计数器并返回指向kobject的指针,如果kobject正在被销毁,则此特定操作失败并且kobject_get返回" Null"。

类似地,当要释放引用时,对kobject_put的调用会减少引用计数器并释放对象。

struct dev的引用计数可以按如下方式实现:

struct kobject *dev_get(struct dev *p)
{
struct module *owner = p->owner;
struct kobject *kobj;

if (owner && !try_module_get(owner))
return NULL;
kobj = kobject_get(&p->kobj);
if (!kobj)
module_put(owner);
return kobj;
}

我希望这个答案能以某种方式帮助你理解kobject和引用计数器: - )