在学习了解Linux内核的同时,我在Kobject
结构和容器中遇到了参考计数器。
那么,如何映射这些结构会有什么帮助呢?
以下是ULK第3版的准备。
kref字段是
k_ref
类型的结构,由单个refcount字段组成。顾名思义,这个字段是kobject的引用计数器,但它也可以作为kobject容器的引用计数器。kobject_get( )
和kobject_put( )
函数分别增加和减少参考计数器;如果计数器达到零值,则释放kobject使用的资源,并执行kobj_type
的{{1}}对象的释放方法。此方法通常仅在动态分配kobject容器时定义,才能释放容器本身。
类似地,在更多上下文中使用了该参考计数器。 我想知道参考计数器的实际映射。
答案 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和引用计数器: - )