引用计数器(kref)

news2024/11/15 17:58:26

1、什么是引用计数器

如果我们写了一个字符驱动,当硬件设备插上时,系统会生成一个设备节点。用户在应用空间操作这个设备节点就可以操作设备。如果此时将硬件断开,驱动是不是就要立刻释放呢?如果立刻释放,应用程序是不是就崩溃了呢。所以要等应用程序关闭,再去释放驱动。
在Linux系统中是通过引用计数来实现的。比如用kref这个变量记录某个驱动或者某块内存的引用计数。初始值为1,每引用一次+1,每取消一次-1,当计数值为0的时候,自动调用自定义的释放函数释放驱动或者内存。

2、相关结构体和api介绍

2.1 struct kref

在这里插入图片描述

2.2 kref_init

初始化kref的值为1
在这里插入图片描述

2.3 kref_get

计数值加1
在这里插入图片描述

2.4 kref_put

kref的计数值减1,当减到0时,会调用release函数执行释放的操作
在这里插入图片描述
在这里插入图片描述

3、kref实验

#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/kobject.h>
#include<linux/slab.h>

struct kobject *my_kobject01;
struct kobject *my_kobject02;
struct kobject *my_kobject03;

struct kobj_type mytype;

static int my_kobject_init(void)
{
     int ret;

     my_kobject01 = kobject_create_and_add("my_kobject01",NULL); // /sys/my_kobject01
     printk("my_kobject01 kref = %d\n",my_kobject01->kref.refcount.refs.counter);
     
     my_kobject02 = kobject_create_and_add("my_kobject02",my_kobject01); // /sys/my_kobject01/my_kobject02
     printk("my_kobject01 kref = %d\n",my_kobject01->kref.refcount.refs.counter);
     printk("my_kobject02 kref = %d\n",my_kobject02->kref.refcount.refs.counter);

     my_kobject03 = kzalloc(sizeof(struct kobject),GFP_KERNEL);
     ret = kobject_init_and_add(my_kobject03,&mytype,NULL,"%s","my_kobject03");
     printk("my_kobject03 kref = %d\n",my_kobject03->kref.refcount.refs.counter);

     return 0;
}

static void my_kobject_exit(void)
{
     printk("my_kobject01 kref = %d\n",my_kobject01->kref.refcount.refs.counter);
     printk("my_kobject02 kref = %d\n",my_kobject02->kref.refcount.refs.counter);
     printk("my_kobject03 kref = %d\n",my_kobject03->kref.refcount.refs.counter);
     kobject_put(my_kobject01);
     printk("my_kobject01 kref = %d\n",my_kobject01->kref.refcount.refs.counter);
     printk("my_kobject02 kref = %d\n",my_kobject02->kref.refcount.refs.counter);
     printk("my_kobject03 kref = %d\n",my_kobject03->kref.refcount.refs.counter);
     kobject_put(my_kobject02);
     printk("my_kobject01 kref = %d\n",my_kobject01->kref.refcount.refs.counter);
     printk("my_kobject02 kref = %d\n",my_kobject02->kref.refcount.refs.counter);
     printk("my_kobject03 kref = %d\n",my_kobject03->kref.refcount.refs.counter);
     kobject_put(my_kobject03);
     printk("my_kobject01 kref = %d\n",my_kobject01->kref.refcount.refs.counter);
     printk("my_kobject02 kref = %d\n",my_kobject02->kref.refcount.refs.counter);
     printk("my_kobject03 kref = %d\n",my_kobject03->kref.refcount.refs.counter);
     
}

module_init(my_kobject_init);
module_exit(my_kobject_exit);
MODULE_LICENSE("GPL");
obj-m += kref.o
KDIR := /home/johan/share/rk3588/linux_sdk/kernel
PWD ?= $(shell pwd)
all:
	make -C $(KDIR) M=$(PWD) modules
	

clean:
	rm -f *.ko *.o *mod* *.mod.c modules*  Module*

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1915167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络体系结构解析

OSI参考模型 与 TCP/IP模型 如图所示 TCP/IP模型有几层 应用层&#xff1a;只需要专注于为用户提供应用功能 HTTP、SMTP、Telnet等&#xff0c;工作在操作系统中的用户态&#xff0c;传输层及以下工作在内核态传输层&#xff1a;为应用层提供网络支持&#xff08;TCP、UDP传…

《昇思25天学习打卡营第01天|qingyun201003》

打卡 日期 心得 我的主语言并不是Python,以及现在从事的工作也并不是开发&#xff1b;所以对于这个系列的课程&#xff0c;学习起来是较为困难的&#xff0c;所以基于这种情况&#xff0c;该如何进行学习&#xff1f;我的做法是全部交给AI&#xff0c;使用AI一步步解析代码&a…

xcode配置swift使用自定义主题颜色或者使用RGB或者HEX颜色

要想在xcode中使用自定义颜色或者配置主题色&#xff0c;需要在Assets中配置&#xff0c;打开Assets文件&#xff0c;然后点击添加Color Set&#xff1a; 输入颜色的名称&#xff0c;然后选中这个颜色&#xff0c;会出现两个颜色&#xff1a; Any Appearance表示亮色模式下使用…

JRT打印药敏报告

最近没写jrt系列博客&#xff0c;不是中途而废了。而是在写微生物系统。今天终于把微生物大体完成了&#xff0c;伴随着业务的实现&#xff0c;框架趋于完善和稳定。构建一套完美而强大的打印体系一直是我的理想&#xff0c;从最开始C#的winform打印控件到刚接触bs时候用js打印…

react学习——24redux实现求和案例(精简版)

1、目录结构 2、count/index.js import React, {Component} from "react"; //引入store,用于获取数据 import store from ../../redux/store export default class Count extends Component {state {count:store.getState()}componentDidMount() {//监测redux中的…

手撸俄罗斯方块(一)——简单介绍

手撸俄罗斯方块 简单介绍 《俄罗斯方块》&#xff08;俄语&#xff1a;Тетрис&#xff0c;英语&#xff1a;Tetris&#xff09;&#xff0c;是1980年末期至1990年代初期风靡全世界的电脑游戏&#xff0c;是落下型益智游戏的始祖&#xff0c;电子游戏领域的代表作之一&a…

关于气象探测设备的介绍

气象探测设备概述 气象探测设备是用于收集、记录和分析大气环境信息的专用工具。它们能够实时监测气温、湿度、气压、风速、风向、降雨量等多种气象要素&#xff0c;为天气预报、气候研究、农业生产和环境保护等领域提供重要数据支持。气象探测设备种类繁多&#xff0c;包括地…

【UML用户指南】-33-对体系结构建模-系统和模型

目录 1、系统和子系统 2、模型和视图 3、跟踪 4、常用建模技术 4.1、对系统的体系结构建模 4.2、对系统的系统建模 模型是对现实世界的简化——即对系统的抽象&#xff0c;建立模型的目的是为了更好地理解系统。 1、系统和子系统 一个系统可能被分解成一组子系统&#…

MySQL超详细学习教程,2023年硬核学习路线

文章目录 前言1. 数据库的相关概念1.1 数据1.2 数据库1.3 数据库管理系统1.4 数据库系统1.5 SQL 2. MySQL数据库2.1 MySQL安装2.2 MySQL配置2.2.1 添加环境变量2.2.2 新建配置文件2.2.3 初始化MySQL2.2.4 注册MySQL服务2.2.5 启动MySQL服务 2.3 MySQL登录和退出2.4 MySQL卸载2.…

推荐3款电脑必备专业软件,错过拍大腿

SolveigMM Video Splitter SolveigMM Video Splitter是一款功能强大的视频编辑工具&#xff0c;主要用于视频的无损剪切和合并。该软件支持多种常见的视频格式&#xff0c;如AVI、WMV、ASF、MP3、WMA等。此外&#xff0c;它还支持AVCHD、MPEG-2、WebM、FLV等格式&#xff0c;并…

论文 | REACT: SYNERGIZING REASONING AND ACTING INLANGUAGE MODELS

本文首先认为&#xff0c;到目前为止&#xff0c;LLM 在语言理解方面令人印象深刻&#xff0c;它们已被用来生成 CoT&#xff08;思想链&#xff09;来解决一些问题&#xff0c;它们也被用于执行和计划生成。 尽管这两者是分开研究的&#xff0c;但本文旨在以交错的方式将推理…

JDBC编程的学习——MYsql版本

目录 前言 什么是JDBC ??? 前置准备 使用JDBC的五个关键步骤 1.建立与数据库的连接 2.创建具体的sql语句和Statement 3.执行SQL语句 4.处理结果集 5.释放资源 完整流程展示 前言 笔者在先前的博客就提过会写关于JDBC的内容 [Mysql] 的基础知识和sql 语句.教你速成…

python怎么调用cmd命令

关于python调用cmd命令&#xff1a; 1、python的OS模块 OS模块调用CMD命令有两种方式&#xff1a;os.popen()、os.system()都是用当前进程来调用。 OS.system是无法获取返回值的。当运行结束后接着往下面执行程序。用法如&#xff1a;OS.system("ipconfig"). OS.…

Invoice OCR

Invoice OCR 发票识别 其他类型ORC&#xff1a; DIPS_YTPC OCR-CSDN博客

【AI大模型】检索增强生成(RAG)模型在企业中的应用

彩蛋 ChatGPT4相比于ChatGPT3.5,有着诸多不可比拟的优势&#xff0c;比如图片生成、图片内容解析、GPTS开发、更智能的语言理解能力等&#xff0c;但是在国内使用GPT4存在网络及充值障碍等问题&#xff0c;如果您对ChatGPT4.0感兴趣&#xff0c;可以私信博主为您解决账号和环境…

基于Make的c工程No compilation commands found报错

由于安装gcc时只安装了build-essential&#xff0c;没有将其添加到环境变量中&#xff0c;因此打开Make工程时&#xff0c;CLion会产生如下错误&#xff1a; 要解决这个问题&#xff0c;一个方法是将GCC添加到环境变量中&#xff0c;但是这个方法需要修改至少两个配置文件&…

校园外卖系统带万字文档在线外卖管理系统java项目java课程设计java毕业设计

文章目录 校园外卖系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 校园外卖系统 一、项目演示 校园外卖服务系统 二、项目介绍 语言&#xff1a;java 数据库&…

MySQL实现数据备份的方式可以基于哪几种?

MySQL 数据库实现数据备份的方式主要有以下几种&#xff1a; 物理备份 (Physical Backup)&#xff1a; 冷备份 (Cold Backup)&#xff1a;在数据库关闭的情况下&#xff0c;直接复制数据库文件&#xff08;数据文件、日志文件等&#xff09;。这种方式操作简单&#xff0c;但是…

pd虚拟机去虚拟化是什么意思?pd虚拟机去虚拟化教程 PD虚拟机优化设置

Parallels Desktop for Mac&#xff08;PD虚拟机&#xff09;去虚拟化是指在虚拟机&#xff08;Virtual Machine&#xff0c;简称 VM&#xff09;中禁用或减少虚拟化层的影响&#xff0c;使其表现更接近于物理机。这种操作通常用于提高虚拟机的性能或解决某些软件兼容性问题。具…

【BUG】Python3|COPY 指令合并 ts 文件为 mp4 文件时长不对(含三种可执行源代码和解决方法)

文章目录 前言源代码FFmpeg的安装1 下载2 安装 前言 参考&#xff1a; python 合并 ts 视频&#xff08;三种方法&#xff09;使用 FFmpeg 合并多个 ts 视频文件转为 mp4 格式 Windows 平台下&#xff0c;用 Python 合并 ts 文件为 mp4 文件常见的有三种方法&#xff1a; 调用…