当前位置: 首页 > news >正文

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) 的计算过程如下:

  1. 首先使用 offsetof() 宏计算出结构体中 list 成员相对于结构体首地址的偏移量。
  2. 然后使用 (char *) 把 ptr 转换为 char * 类型,方便执行指针运算。这里使用的是 char * 而不是其他类型的指针,是因为 char 类型的大小为 1 字节,所以可以精确计算出指针偏移量。
  3. 对 ptr 进行指针减法运算,结果为 &(some_struct) - offsetof(struct my_struct, list)。也就是说,这里减去了 list 成员相对于整个结构体首地址的偏移量,从而得到了整个结构体的首地址。
  4. 最后使用 (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吗?…...

无线蓝牙耳机哪款音质好?目前音质最好的无线蓝牙耳机推荐

现如今,蓝牙耳机已经是一个非常实用且常见的数码产品了,不少人喜欢戴着蓝牙耳机听歌,玩游戏。一款音质好的蓝牙耳机不止能听个响,还能给人极致的听觉享受。在此,我来给大家分享几款目前音质最好的无线蓝牙耳机&#xf…...

【云原生进阶之容器】第六章容器网络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 设置/修改标签元素属性&#xff0c;比如通过 src更换 图片最常见的属性比如&#xff1a; href、title、src 等语法&#xff1a; 对象.属性 值 <!DOCTYPE html> <html lang"en">&…...

C# 中的多态和虚方法,如何实现多态和使用虚方法?

在 C# 中&#xff0c;多态&#xff08;Polymorphism&#xff09;是面向对象编程的基本特性之一&#xff0c;它允许使用不同的对象和方法来执行同一操作。C# 中实现多态的方式主要是通过虚方法和抽象类。 虚方法是一种允许子类覆盖的方法&#xff0c;它的实现是在运行时动态确定…...

R软件使用一些常见的问题

以下均是个人经验摸索的解决办法&#xff0c;使用 Rstudio 执行命令&#xff0c;如有高手能更好地解决问题&#xff0c;还望指教&#xff0c;提前感谢。 问题一&#xff1a; 有些 package 因为编辑得比较早又没有继续更新&#xff0c;所以需要用旧版本的 R 才能正常运行&#…...

为什么需要uboot?

一、先看概念 bootROM&#xff1a;一种固化在芯片内部的只读存储器&#xff08;ROM&#xff09;&#xff0c;用于启动和初始化系统。BootROM 中通常包含了一些预先编写好的代码&#xff0c;用于完成系统启动前的基本初始化和配置&#xff0c;例如初始化时钟、GPIO控制器、中断…...

Qt布局实战:实现高效、美观的GUI应用程序

Qt布局实战&#xff1a;实现高效、美观的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 向水平布局中添加部件…...

推荐几款项目管理工具,提高你的团队协作效率

如何管理团队才能使团队发挥最大的价值&#xff0c;如果团队缺少协作&#xff0c;就会因为团队的内耗和冲突导致项目无法完成&#xff0c;如何提高团队协作效率呢&#xff1f;我们可以借助团队协作类的项目管理工具。 几个常见的项目管理工具&#xff1a; 1、进度猫 进度猫是…...

SQL101 检索每个顾客的名称和所有的订单号(一)

描述 Customers表代表顾客信息含有顾客id cust_id和 顾客名称 cust_name cust_idcust_namecust10andycust1bencust2tonycust22tomcust221ancust2217hex Orders表代表订单信息含有订单号order_num和顾客id cust_id order_numcust_ida1cust10a2cust1a3cust2a4cust22a5cust221…...

mac压缩文件多了__MACOSX目录问题

文章目录 背景原因解决方案&#xff1a;更换压缩方式分析问题拓展&#xff08;.DS_Store&#xff09; 背景 项目中有一个场景&#xff0c;需要把目录压缩为app离线包的zip 但是压缩之后一致打不开&#xff0c;别人上传的zip是好的 原因 如图&#xff0c;我上传的在安卓设备…...

1.17 从0开始学习Unity游戏开发--场景切换

前面的所有文章我们都在一个固定的游戏场景内进行开发&#xff0c;在最开始介绍场景这个概念的时候就已经提及&#xff0c;这个场景可以是一张地图&#xff0c;或者是一个对战房间等等&#xff0c;所以显然这个场景可以有多个&#xff0c;并且可以从一个场景切换到另外一个场景…...

【golang学习笔记】——(五)Go格式化统一代码风格

我们在入职一家新公司的时候&#xff0c;除了要学习公司的流程规范和规章制度&#xff0c;还会做的一件事情就是进行公司编码规范的学习&#xff0c;基于google的C规范下&#xff0c;做了各自的发散和规范&#xff0c;久而久之就是包罗万象的样子&#xff0c;疲于应付各种规范约…...

CAD转SHP最好的方法 赶快收藏起来吧

1、利用 ArcToolsbox 工具先将 DWG 文件转为 MDB 通过 CASS 软件生成的 DWG 文件&#xff0c;字段中包含有很多属性内容&#xff0c;所以我们先将 DWG 格式 的文件转换为 MDB 格式&#xff0c;再通过 MDB 转换为 SHP 格式数据进行整理。具体步骤如下&#xff1a; 通过 ArcTool…...

PyQt PyQt5 Python VTK Gui Actor 选中 高亮显示 actor

前言&#xff1a; 本文主要介绍了如何使用Python VTK高亮显示actor&#xff0c;使用Python语言&#xff0c;高亮显示选中的actor。当窗口中的圆球actor被选中时&#xff0c;会变成红色&#xff0c;并且会显示actor三遍面片边缘信息。 效果&#xff1a; VTK VTK&#xff0c;&…...

TCP和UDP通信对比

tcp通信流程 服务器: 创建流式套接字 绑定 监听 提取 读写 关闭 客户端: 创建流式套接字 连接 读写 关闭 收发数据: read recv ssize_t recv(int sockfd, void *buf, size_t len, int flags); //flagsMSG_PEEK 读数据不会删除缓冲区的数据 write send ssize_t send(int…...

SpringCloud:ElasticSearch之自动补全

当用户在搜索框输入字符时&#xff0c;我们应该提示出与该字符有关的搜索项&#xff0c;如图&#xff1a; 这种根据用户输入的字母&#xff0c;提示完整词条的功能&#xff0c;就是自动补全了。 因为需要根据拼音字母来推断&#xff0c;因此要用到拼音分词功能。 1.拼音分词器…...

TOOM解析如何搭建一套适合自己的舆情监测系统?完整的实战指南

随着互联网的普及和社交媒体的盛行&#xff0c;人们在网络上的活动越来越多&#xff0c;同时也涌现出大量的信息和舆情。这些信息和舆情在一定程度上会影响社会和个人的发展和进步。因此&#xff0c;舆情监测逐渐成为一项重要的任务。在本篇文章中&#xff0c;我们将为大家介绍…...

技术分享 | OceanBase 手滑误删了数据文件怎么办

作者&#xff1a;张乾 外星人2号&#xff0c;现兼任六位喵星人的资深铲屎官。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 手滑误删了数据文件&#xff0c;并且没有可替换的节点时&…...