引用计数器(kref)

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_kobject01printk("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_kobject02printk("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) modulesclean:rm -f *.ko *.o *mod* *.mod.c modules*  Module*

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

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

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

相关文章

docker-compose构建、运行多容器简介

&#xff08;1&#xff09;准备依赖的镜像&#xff0c;包括mariadb、jdk1.8、nginx&#xff0c;配置docker-compose.yml文件 services:mariadb:image: mariadbports:- "3314:3306"environment:- MARIADB_ROOT_PASSWORD123456volumes:- ./mysql:/var/lib/mysqlnetwor…

PLC数采网关在实际应用中有哪些效能?天拓四方

在工业自动化领域中&#xff0c;PLC扮演着至关重要的角色&#xff0c;它负责控制和监测生产线的各个环节。然而&#xff0c;随着工业4.0的推进和智能制造的快速发展&#xff0c;单纯依靠PLC进行现场控制已无法满足企业对数据集中管理、远程监控和智能分析的需求。因此&#xff…

Efficient Estimation of Word Representations in Vector Space论文笔记解读

基本信息 作者TomasMikolovdoi10.48550发表时间2013期刊ICLR网址http://arxiv.org/abs/1301.3781 研究背景 1. What’s known 既往研究已证实 前馈神经网络语言模型(NNLM) 循环神经网络语言模型(RNNLM) 2. What’s new 创新点 Word2vec有两种模型&#xff1a;CBOW和Skip-gr…

AJAX-个人版2.0

AJAX&#xff08;Asynchronous Javascript And Xml&#xff09; 传统请求及缺点 传统的请求都有哪些&#xff1f; 直接在浏览器地址栏上输入URL。点击超链接提交form表单使用JS代码发送请求 window.open(url)document.location.href urlwindow.location.href url… 传统请…

【对抗算法复现】CW

首先进行数据的预处理 transform transforms.Compose([transforms.ToTensor(), # 将图片转换为Tensor&#xff0c;自动将[0,255]映射到[0,1]transforms.Normalize((0.491,0.482 ,0.446), (0.247 ,0.243 ,0.261)) # 对张量进行标准化&#xff0c;使其范围为[-1,1] ])CW实现 …

“十四五”新型基础设施建设

一、基础设施 基础设施包括交通设施、邮电通讯设施、能源动力设施、供水排水设施、环保设施、防卫防灾安全设施等传统基础设施。这些设施共同构成了一个国家或地区正常运转的支柱&#xff0c;确保社会经济活动的正常进行。 交通设施&#xff1a;交通设施是基础设施的重要组成部…

AbyssFish单连通周期边界多孔结构2D软件

软件介绍 AbyssFish单连通周期边界多孔结构2D软件&#xff08;以下简称软件&#xff09;可用于生成具备周期性边界条件的单连通域多孔结构PNG图片&#xff0c;软件可设置生成模型的尺寸、孔隙率、孔隙尺寸、孔喉尺寸等参数&#xff0c;并且具备孔隙形态控制功能。 软件生成的…

视频号热门视频数据分析工具,快速查看同行数据创作者必看!

每天排行榜是帮助创作者查看同行数据为自己提供创作灵感&#xff0c;此外每天排行榜热门的视频收集了用户喜欢看的类型。 灵感分类了解当前社会关注的热点内容。该工具通过监测和分析视频号全网舆情&#xff0c;选取热门话题进行排序&#xff0c;形成一个每日热点排行榜。 这…

yolov8 分类太阳能板

原文:yolov8 分类太阳能板 - 知乎 (zhihu.com) 1、数据集 https://github.com/zae-bayern/elpv-dataset​github.com/zae-bayern/elpv-dataset 2、数据分析 import matplotlib.pyplot as plt import ostrain_dir = "./images" valid_extensions=(.jpg, .png, .j…

华为防火墙上的配置(1)

实验拓扑图 实验要求&#xff1a; 1、DMZ区内的服务器&#xff0c;生产区仅能在办公时间内&#xff08;9&#xff1a;00-18:00)可以访问&#xff0c;办公区的设备全天可以访问 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3、办公区设备10.0.2.10不…

00:HAL库的认识

一&#xff1a;HAL库 开发现状&#xff1a; 1&#xff1a;下载 网站&#xff1a; https://www.st.com/zh/embedded-software/stm32cube-mcu-mpu-packages.html 去选择我们的系列 我们使用的是STM32F103C8t6的这个 继续一直向下拉点击这个&#xff1b;之后傻瓜步骤直接可以…

最新2023年行政区划、路网、土壤质地矢量数据

行政区划矢量数据是指用矢量格式表示的地理信息系统&#xff08;GIS&#xff09;数据&#xff0c;其中包含了行政区域的边界信息&#xff0c;如国家、省份、城市、区县、乡镇甚至村级的界限。这些数据通常以点、线、面的几何图形来表示具体的地理实体&#xff0c;并且每个实体都…

亚马逊erp跟卖采集之关键词采集

大家好&#xff0c;今天讲这款erp的跟卖采集关键词采集。 打开erp跟卖功能采集任务&#xff0c;点新增任务站点美国&#xff0c;有5种采集方式&#xff1a;关键词、店铺链接、类目ASIN。 选择关键词采集&#xff0c;这里我选择女童装&#xff0c;选择女童板鞋复制粘贴。页数我…

新书速览|HTML5+CSS3 Web前端开发与实例教程:微课视频版

《HTML5CSS3 Web前端开发与实例教程&#xff1a;微课视频版》 本书内容 《HTML5CSS3 Web前端开发与实例教程&#xff1a;微课视频版》秉承“思政引领&#xff0c;立德树人”的教育理念&#xff0c;自然融入多维度、深层次的思政元素&#xff0c;全面对标企业和行业需求&#x…

Chameleon:动态UI框架使用详解

文章目录 引言Chameleon框架原理核心概念工作流程 基础使用安装与配置创建基础界面 高级使用自定义组件响应式布局数据流与状态管理 结论 引言 Chameleon&#xff0c;作为一种动态UI框架&#xff0c;旨在通过灵活、高效的方式帮助开发者构建跨平台、响应用户交互的图形用户界面…

ant-design-vue表格设置某列标题部分文字颜色

在ant-design-vue的表格组件中&#xff0c;可以通过使用slot自定义列头&#xff08;title&#xff09;的内容来实现部分文字的颜色设置。以下是一个简单的例子&#xff0c;展示如何设置某列标题部分文字颜色为红色&#xff1a; <template><a-table :columns"col…

iwconfig iwpriv学习之路

iwconfig和iwpriv是两个常用的wifi调试工具&#xff0c;最近需要使用这两个工具完成某款wifi芯片的定频测试&#xff0c;俗话说好记性不如烂笔头&#xff0c;于是再此记录下iwconfig和iwpriv的使用方式。 -----再牛逼的梦想&#xff0c;也抵不住傻逼般的坚持&#xff01; ----2…

单向链表队列

实现单向链表队列的&#xff0c;创建&#xff0c;入队&#xff0c;出队&#xff0c;遍历&#xff0c;长度&#xff0c;销毁。 queue.h #ifndef __QUEUE_H__ #define __QUEUE_H__#include <stdio.h> #include <stdlib.h> #include <string.h> #define max 30…

大语言模型里的微调vs RAG vs 模板提示词

文章目录 介绍微调&#xff08;Fine-tuning&#xff09;定义优点&#xff1a;缺点&#xff1a;应用场景&#xff1a;技术细节 检索增强生成&#xff08;RAG&#xff0c;Retrieval-Augmented Generation&#xff09;定义优点&#xff1a;缺点&#xff1a;应用场景&#xff1a;技…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥派生(ArkTS)】

密钥派生(ArkTS) 以HKDF256密钥为例&#xff0c;完成密钥派生。具体的场景介绍及支持的算法规格。 开发步骤 生成密钥 指定密钥别名。 初始化密钥属性集&#xff0c;可指定参数HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG&#xff08;可选&#xff09;&#xff0c;用于标识基…