RK3568驱动指南|第九篇 设备模型-第91章 什么是引用计数器

2024-01-02 19:04:01

瑞芯微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);

}


?

文章来源:https://blog.csdn.net/BeiJingXunWei/article/details/135344304
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。