【问题标题】:What is reference counter with respect to Device Driver Model?关于设备驱动程序模型的引用计数器是什么?
【发布时间】:2016-03-18 15:59:44
【问题描述】:

在学习了解Linux内核时,我在Kobject结构和容器中遇到了引用计数器。 那么,映射这些结构有何帮助?
下面给出的是 ULK 第 3 版中的一段。

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

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

【问题讨论】:

  • 你读过kref documentation吗?引入内核中使用的引用计数看起来不错。
  • 谢谢,我是 linux 新手,我刚刚经历过。

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


【解决方案1】:

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

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

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

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

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 和引用计数器的一些信息 :-)

【讨论】:

  • 我在我提到的书中读过这个,问题是我怀疑它不仅仅是递增和递减。
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2021-07-04
  • 2010-09-11
相关资源
最近更新 更多