本文简单介绍了设备驱动模型中最最简单的一个数据结构:kref,它作为内核中最基本的引用计数而存在。
首先直观地介绍该数据结构及操作它的一些方法,然后再介绍其具体的用法。参考:kref.h kref.c kref.txt
一、kref及操作kref的方法
struct kref
{
atomic_t refcount;
};
可以看到kref结构体的成员只有一个原子变量refcount,为什么还要用kref结构体来包装一下呢?
目前我所知道的有两种说法:
1、为了方便编译器做类型检查(不是很懂......)
2、为了以后方便扩展(这个很好理解)
不管怎样,反正目前这个结构体很简单啦。另外,内核还提供了4个函数用来操作kref:
void kref_set(struct kref *kref, int num);
void kref_init(struct kref *kref);
void kref_get(struct kref *kref);
int kref_put(struct kref *kref, void (*release) (struct kref *kref));
下面来看一下它们的源码。
/**
* kref_set - initialize object and set refcount to requested number.
* @kref: object in question.
* @num: initial reference counter
*/
void kref_set(struct kref *kref, int num)
{
atomic_set(&kref->refcount, num); //设置kref的引用计数为num
smp_mb(); //......这个暂时就不管了吧,没具体研究过
}
/**
* kref_init - initialize object.
* @kref: object in question.
*/
void kref_init(struct kref *kref)
{
kref_set(kref, 1); //简单地调用kref_set,将引用计数设置为1
}
/**
* kref_get - increment refcount for object.
* @kref: object.
*/
void kref_get(struct kref *kref)
{
WARN_ON(!atomic_read(&kref->refco