瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
【公众号】迅为电子
【粉丝群】824412014(加群获取驱动文档+例程)
【视频观看】嵌入式学习之Linux驱动(第九期_设备模型_全新升级)_基于RK3568
【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板
第91章 什么是引用计数器
91.1 什么是引用计数器。
引用计数器(reference counting)是一种内存管理技术,用于跟踪对象或资源的引用数量。它通过在对象被引用时增加计数值,并在引用被释放时减少计数值,以确定何时可以安全地释放对象或资源。
引用计数器的基本原理如下:
对象或资源被创建时,引用计数器初始化为1。
当有新的引用指向对象或资源时,引用计数器增加。
当引用不再指向对象或资源时(引用被删除、超出作用域等),引用计数器减少。
当引用计数器的值为0时,表示没有任何引用指向对象或资源,可以安全地释放对象或资源,并进行相关的清理操作。
91.2 引用计数器kref介绍
kref是Linux内核中提供的一种引用计数器实现,它是一种轻量级的引用计数技术,用于管理内核中的对象的引用计数。
在Linux系统中,引用计数器用结构体kref来表示。struct kref定义在include/linux/kref.h头文件当中,本质是一个int型变量。如下所示:
struct kref {
refcount_t refcount;
};
typedef struct {
atomic_t refs;
} refcount_t;
typedef struct {
int counter;
} atomic_t;
在使用引用计数器时,通常会将结构体kref嵌入到其他结构体中,例如struct kobject,以实现引用计数的管理。如下所示:
图 91-1
为了实现引用计数功能,struct kobject通常会包含一个嵌入的struct kref对象。这样可以通过对struct kref的操作来对struct kobject进行引用计数的管理,并在引用计数减少到0时释放相关资源。
再比如结构体device_node,如下所示:
图 91-2
91.3 常用api函数
struct kref提供了一些常用的API函数来进行引用计数的增加和减少操作,下面是一些常用的struct kref API函数。
kref_init(struct kref *kref):
函数作用:初始化一个 struct kref 对象。在使用引用计数之前,必须先调用此函数进行初始化。初始化kerf的值为1
函数原型:
static inline void kref_init(struct kref *kref)
{
refcount_set(&kref->refcount, 1);
}
kref_get(struct kref *kref):
函数作用:增加 struct kref 的引用计数。每次调用此函数,引用计数都会增加。kref计数值加1
函数原型:
static inline void kref_get(struct kref *kref)
{
refcount_inc(&kref->refcount);
}
kref_put(struct kref *kref, void (*release)(struct kref *)):
函数作用:减少 struct kref 的引用计数,并在引用计数减少到零时调用 release 函数来进行资源的释放。通常,release 函数会在其中执行对象的销毁和内存释放等操作。
函数原型:
static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref))
{
if (refcount_dec_and_test(&kref->refcount)) {
release(kref);
return 1;
}
return 0;
}
void refcount_set(refcount_t *r, int n)
函数作用:设置kerf的计数值。
函数原型:
static inline void refcount_set(refcount_t *r, int n)
{
atomic_set(&r->refs, n);
}