Linux学习笔记(2)--一些内核接口
1)dump_stack
dump_stack()是Linux内核中的一个函数,用于在内核中输出当前的函数调用栈。该函数会输出当前线程(或进程)的函数调用栈信息,以及相应的调用地址和虚拟内存地址等信息,一般用于诊断程序运行时的错误或异常。使用该函数可以帮助开发者找到程序崩溃的原因所在,并进行快速排错。它常常被用于内核调试和性能分析。
2)kref_put
kref_put 是 Linux 内核中的一个函数,用于在引用计数器(也称为 kref)归零时释放内核资源。
具体来说,当内核中的某个结构体需要在多个地方被引用,通过使用 kref 引用计数器可以追踪该结构体被引用的数量。当该结构体不再被需要时,可以通过 kref_put 函数来将该结构体的引用计数减 1,如果此时引用计数为 0,则说明该结构体可以被安全地释放。
以下是 kref_put 函数的原型:
void kref_put(struct kref *kref, void (*release)(struct kref *kref));
其中,kref 是指向内核引用计数器的指针,release 是一个回调函数,用于在引用计数达到 0 时释放资源。
使用 kref_put 函数可以避免由于引用计数器未正确管理引用计数而导致的内存泄漏和资源占用过多等问题。
3)kfree_rcu
kfree_rcu是Linux内核中提供的一种资源释放接口,用于在RCU(Read-Copy-Update)保护下释放内存。RCU是一种经典的读写锁算法,用于保护共享的数据结构,它的特点是在读的过程中不需要获取锁,在写的过程中通过复制一份数据来保证读操作不受写操作的影响。因此在释放内存时,需要使用RCU使得所有对该内存的访问都已完成,否则可能会触发未定义的行为。kfree_rcu接口是在RCU保护下调用kfree接口来释放内存所使用的函数。+
4)atomic_dec()
是一个原子操作接口,用于将一个整数变量减小 1,并保证这个操作是原子的。
在并发程序中,如果多个线程同时对同一个变量进行修改操作,可能会产生竞争条件(Race Condition)的问题。其中一种解决方式是使用原子操作,即将整个操作作为一个不可分割的单元执行,从而保证操作的完整性。atomic_dec() 就是 Linux 内核中提供的一种原子减 1 操作。
使用 atomic_dec() 接口时,需要将待减小的整数变量以指针的方式传入函数中。函数会自动将该变量减小 1,并返回减小后的结果。该操作是原子的,也就是说,在该操作执行完之前,任何其他线程无法修改该变量。
5)container_of
是一个宏定义,常用于 C 语言中的链表实现中,用于从链表节点的地址计算出整个数据结构的地址。它的定义和用法如下:
#define container_of(ptr, type, member) \((type *)((char *)(ptr) - offsetof(type, member)))struct my_struct {int x;float y;struct list_head list;
};
ptr:指向结构体中某个成员的指针,例如&some_struct.list。type:结构体类型,例如struct my_struct。member:结构体中某个成员的名称,例如list。
那么 container_of(&some_struct.list, struct my_struct, list) 的计算过程如下:
- 首先使用
offsetof()宏计算出结构体中list成员相对于结构体首地址的偏移量。 - 然后使用
(char *)把ptr转换为char *类型,方便执行指针运算。这里使用的是char *而不是其他类型的指针,是因为char类型的大小为 1 字节,所以可以精确计算出指针偏移量。 - 对
ptr进行指针减法运算,结果为&(some_struct) - offsetof(struct my_struct, list)。也就是说,这里减去了list成员相对于整个结构体首地址的偏移量,从而得到了整个结构体的首地址。 - 最后使用
(type *)把结果强制转换为结构体类型struct my_struct *,即可得到整个结构体的地址。
需要注意的是,container_of() 的使用必须保证 ptr 指向的是某个结构体成员,否则计算结果将不正确。另外,该宏也不支持嵌套结构体。
5)wait_for_completion() 函数
是 Linux 内核中的一个同步原语,它用于等待一个完成量被另一个进程或线程完成。等待队列和 completion 结构体在 Linux 内核中被广泛使用,比如读写锁、自旋锁、信号量、定时器等都会用到它们。
在调用 wait_for_completion() 函数之前,首先要初始化一个 completion 结构体,而这个结构体通常被作为一个等待队列中的头结点使用,用于等待某个事件的完成。
当一个线程或进程执行 wait_for_completion() 函数时,如果它所等待的事件还没有完成,那么就会进入睡眠状态(即挂起当前线程或进程),直到所等待的事件完成,并调用 complete() 函数告知等待队列中的所有等待者事件已经完成为止。此时 wait_for_completion() 函数才返回,线程或进程才被唤醒,接着继续执行下面的代码。
6)spin_unlock_irqrestore() 函数
是用于解锁自旋锁并恢复中断的函数。在 Linux 内核中,自旋锁是一种线程同步机制,用于保护共享资源免受并发访问的干扰。当一个线程获取了自旋锁之后,其他线程会被阻塞,直到该线程释放自旋锁。
在多核CPU系统中,中断处理程序在运行时可能会产生竞争问题。当中断处理程序需要访问被自旋锁保护的共享资源时,需要临时禁止本地CPU中断以确保同步。函数 spin_lock_irqsave() 和 spin_unlock_irqrestore() 提供了这项功能,spin_lock_irqsave() 禁止中断,并尝试获取自旋锁。spin_unlock_irqrestore() 函数则释放自旋锁,并在解锁后恢复特定的中断状态。
因此 spin_unlock_irqrestore() 函数用于解锁一个被自旋锁保护的资源,并将中断的状态恢复为调用 spin_lock_irqsave() 时的状态,以避免干扰其他需要使用该状态的程序。
7)spin_lock_irqsave() 函数
是 Linux 内核中用于获得自旋锁并且禁用中断的函数。
自旋锁是一种在多线程环境下保护共享资源的机制,当多个线程尝试往同一个共享资源中写入数据时,自旋锁能够确保同一时刻只有一个线程能够访问该资源,从而避免竞态条件的出现。
spin_lock_irqsave() 函数在获取自旋锁时会先禁止中断,确保当前 CPU 不会被切换到别的上下文中执行其他的中断处理程序。在获取自旋锁成功后,函数会返回一个无符号整数值,这个值包含了此时 CPU 执行中断的状态,以便后续使用 spin_unlock_irqrestore() 函数恢复当前 CPU 的中断状态。
8)getenv() 函数
是一个 C 标准库函数,用于获取环境变量的值。它的原型如下:
char *getenv(const char *name);
传递一个环境变量名 name,函数将返回该环境变量的值,如果该环境变量不存在,则返回 NULL。
使用方法示例:
char *path = getenv("PATH");
if (path != NULL) {printf("PATH=%s\n", path);
}
上述代码将获取环境变量名为 PATH 的值,并打印出来。
相关文章:
Linux学习笔记(2)--一些内核接口
1)dump_stack dump_stack()是Linux内核中的一个函数,用于在内核中输出当前的函数调用栈。该函数会输出当前线程(或进程)的函数调用栈信息,以及相应的调用地址和虚拟内存地址等信息,一般用于诊断程序运行时…...
学习风`宇博客用户权限菜单模块
文章目录 用户-角色-菜单-资源 各表关系图菜单 和 路由菜单表及分析分析 /api/admin/user/menus接口MenuServiceImpl#listUserMenus接口返回示例及分析 前端代码分析menu.jsSideBar.vue 接口权限控制资源表 及 分析分析 WebSecurityConfig权限控制整体流程先说登录UserDetailsS…...
centos7.6部署ELK集群(一)之elasticsearch7.7.0集群部署
32.3. 部署es7.7.0 32.3.1. 下载es(各节点都做) wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-linux-x86_64.tar.gz 32.3.2. 解压至安装目录(各节点都做) tar -xvf elasticsearch-7.7.0-li…...
leetcode142. 环形链表 II
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数…...
Linux: network: dummy 类型网络接口
文章目录 参考创建一个重要的用途是在container平台的应用dpdk相关的一个用途另一个用途ChatGPT的回复参考 https://tldp.org/LDP/nag/node72.html 这里举了一个例子,说为什么需要dummy类型的接口:就是一个类local loopback的一个接口,当应用需要给另一个本地的应用发送包的…...
java记录-lambda表达式、接口应用、方法引用
基本形式 (str)->{System.out.println(str) };调用作为参数的接口实例的方法 1、用一个类实现接口,然后使用该类实例调用方法 2、匿名内部类 3、在 接口(不能是抽象类) 有且只有一个抽象方法时,可以使用lamda表达式来重写这个…...
AI写作机器人-ai文章生成器在线
使用AI续写生成器,让内容创作事半功倍! 随着人工智能技术的不断进步和应用,AI续写生成器的出现为内容创作带来了全新的革命。这种技术可以让你的写作事半功倍,让你轻松生成高质量的文章和内容。在这篇文章中,我们将介绍…...
HarmonyOS原子化服务卡片整改、下架、升级失败部分原因及处理办法
随着HarmonyOS应用体系相关规则、团队的不断发展和完善,早期上架运营的HarmonyOS原子化服务卡片,很多都收到了整改、下架的通知,主要集中在用户协议、隐私声明、服务卡片的设计规范性等细节方面的问题;需要进行优化调整升级才行。…...
博客系统测试报告【可上线】
目录 1、测试概述 1.1、项目名称 1.2、测试时间 1.3、编写目的 1.4、测试范围 2、测试计划 2.1、测试用例 2.1.1、注册/登录模块 2.1.2、个人中心模块 2.1.3、找回密码模块 2.1.4、博客主列表模块 2.1.5、个人博客列表模块 2.1.6、个人草稿列表模块 2.1.7、博客详…...
shell中的for循环和if判断
一.编写脚本for1.sh,使用for循环创建20账户,账户名前缀由用户从键盘输入,账户初始密码由用户输入,例如: test1、test2、test3、.....、 test10 1.创建脚本for1.sh [rootserver ~]# vim for1.sh 2.编写脚本for1.sh 3.执行脚本for1.sh [roo…...
【Unity入门】16.脚本引用组件
【Unity入门】脚本引用组件 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)脚本引用普通组件 (1)点击控制音频播放 还记得我们的车载音乐AudioSource吗?…...
无线蓝牙耳机哪款音质好?目前音质最好的无线蓝牙耳机推荐
现如今,蓝牙耳机已经是一个非常实用且常见的数码产品了,不少人喜欢戴着蓝牙耳机听歌,玩游戏。一款音质好的蓝牙耳机不止能听个响,还能给人极致的听觉享受。在此,我来给大家分享几款目前音质最好的无线蓝牙耳机…...
【云原生进阶之容器】第六章容器网络6.6.1--Cilium网络方案概述
《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述...
集中式版本控制工具 —— SVN
一、简介 1️⃣ SVN 是什么? 代码版本管理工具他能记住每次的修改查看所有的修改记录恢复到任何历史版本恢复已经删除的文件 2️⃣ SVN 与 Git 相比有什么优势? 使用简单、上手快目录级权限控制,企业安全必备子目录 Checkout,…...
【Dom获取属性操作】JavaScript 全栈体系(十)
Web APIs 第四章 操作元素属性 一、操作元素常用属性 还可以通过 JS 设置/修改标签元素属性,比如通过 src更换 图片最常见的属性比如: href、title、src 等语法: 对象.属性 值 <!DOCTYPE html> <html lang"en">&…...
C# 中的多态和虚方法,如何实现多态和使用虚方法?
在 C# 中,多态(Polymorphism)是面向对象编程的基本特性之一,它允许使用不同的对象和方法来执行同一操作。C# 中实现多态的方式主要是通过虚方法和抽象类。 虚方法是一种允许子类覆盖的方法,它的实现是在运行时动态确定…...
R软件使用一些常见的问题
以下均是个人经验摸索的解决办法,使用 Rstudio 执行命令,如有高手能更好地解决问题,还望指教,提前感谢。 问题一: 有些 package 因为编辑得比较早又没有继续更新,所以需要用旧版本的 R 才能正常运行&#…...
为什么需要uboot?
一、先看概念 bootROM:一种固化在芯片内部的只读存储器(ROM),用于启动和初始化系统。BootROM 中通常包含了一些预先编写好的代码,用于完成系统启动前的基本初始化和配置,例如初始化时钟、GPIO控制器、中断…...
Qt布局实战:实现高效、美观的GUI应用程序
Qt布局实战:实现高效、美观的GUI应用程序 引言 (Introduction)1.1 Qt布局简介 (Brief introduction to Qt layouts)1.2 Qt布局的优势 (Advantages of Qt layouts) 2.布局类型 (Layout Types)2.1 水平布局 (QHBoxLayout)2.1.1 创建水平布局2.1.2 向水平布局中添加部件…...
推荐几款项目管理工具,提高你的团队协作效率
如何管理团队才能使团队发挥最大的价值,如果团队缺少协作,就会因为团队的内耗和冲突导致项目无法完成,如何提高团队协作效率呢?我们可以借助团队协作类的项目管理工具。 几个常见的项目管理工具: 1、进度猫 进度猫是…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
