浅析Linux进程管理:current宏实现

本文基于Linux 5.10.186版本内核源码进行分析。

文章目录

    • current概述
    • 早期内核版本实现
    • 最新版本内核实现
      • x86体系下的current宏实现
      • ARMv8体系下的current实现
    • 相关参考

current概述

Linux内核在运行时经常需要访问当前运行进程的task_struct指针,于是,系统提供了current宏来查找当前运行进程的task_struct指针。由于体系结构的不同,加上内核版本在不断演进,current宏的实现方式也发生了较大的变化。

早期内核版本实现

早期内核版本中,current宏主要是通过thread_info结构中的task成员获取task_struct指针。task_struct和thread_info都用来保存进程相关信息,其中,task_struct用于存储通用的管理信息,而thread_info存储与体系结构相关的部分。在早期的Linux实现中,thread_info结构被存放在进程内核栈的顶部,如下:
在这里插入图片描述

最新版本内核实现

最新版本的内核中,thread_info结构已经删除了task成员,因此已经无法再通过thread_info结构来获取task_struct指针了。这里以x86和ARMv8为例说明对应体系结构下的current宏实现方式。

x86体系下的current宏实现

在x86体系下,Linux内核定义了名为current_task的Per-CPU变量,每个CPU上当前运行的进程task_struct指针都保存在current_task变量中。

DECLARE_PER_CPU(struct task_struct *, current_task);

static __always_inline struct task_struct *get_current(void)
{
	return this_cpu_read_stable(current_task);
}

#define current get_current()

ARMv8体系下的current实现

在ARMv8体系下,每个异常等级都有对应的SP_ELx寄存器,当系统运行在内核态时,SP_EL0寄存器是空置的,因此便被Linux内核用于存储当前运行进程的task_struct指针。

static __always_inline struct task_struct *get_current(void)
{
	unsigned long sp_el0;

	asm ("mrs %0, sp_el0" : "=r" (sp_el0));

	return (struct task_struct *)sp_el0;
}

#define current get_current()

相关参考

  • Linux 进程管理之current
  • Linux调度——神奇的current

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ptaR7-6/zzuli2106 有去有回

题目 输入n个整数,第一趟按从左到右间隔k个数取数据,然后第二趟再从右到左间隔k-1个数取余下的数,如果数据没有取完,下一趟再间隔k-2个从左到右取数据,如此反复,直到所有的数据取完为止。注意:…

【2023年度回顾】让我们在新的一年继续努力前行

每当我们在努力的时候都会想:为什么我要努力?躺着不舒服吗? 大家好!我是命运之光,一名普普通通的计算机科学与技术专业的大三学生。 📕回顾一下整个2023年 因为我有每天发朋友圈的习惯,所以这一…

QToolBar、QStatusBar和QDockWidget的使用

1. 工具栏 QToolBar 1.1 创建工具栏 1.1.1 工具栏的基本函数 设置工具栏的停靠区域 参数 Qt::LeftToolBarArea //左边 Qt::RightToolBarArea //右边 Qt::TopToolBarArea //顶部 Qt::BottomToolBarArea //底部 Qt::AllToolBarAreas //所有区域 Qt::NoToolBarArea //没有QMa…

数据结构与算法之美学习笔记:47 | 向量空间:如何实现一个简单的音乐推荐系统?

这里写自定义目录标题 前言算法解析总结引申 前言 本节课程思维导图: 很多人都喜爱听歌,以前我们用 MP3 听歌,现在直接通过音乐 App 在线就能听歌。而且,各种音乐 App 的功能越来越强大,不仅可以自己选歌听&#xff0…

HBase 复制、备份、迁移

行业分享 HBase金融大数据乾坤大挪移 https://www.jianshu.com/p/cb4a645dd66a HBase跨机房迁移技术分享总结 https://www.jianshu.com/p/defc787b2704 dbaplus181期:腾讯金融HBase跨机房迁移实战 https://m.qlchat.com/topic/details?topicId2000003847589595 ht…

原生Jdbc获取库、表、字段;驼峰与下划线转换

1、获取catalog 1)代码如下: /*** 获取catalog** param jdbcdriver 驱动类(DriverClass)(com.mysql.cj.jdbc.Driver)* param url 地址(jdbc:mysql://10.20.30.40:3306)* param username 用户名* param password 密码*/public static List&l…

[acm算法学习] 后缀数组SA

学习自B站up主 kouylan 定义 后缀是包含最后个字母的子串 把字符串 str 的所有后缀按字典排序,sa[i]表示排名为 i 的后缀的开头下标 如何求解SA 倍增的方法 先把每个位置开始的长度为1的子串排序,在此基础上再把长度为2的子串排序(长度…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-7 LQR控制器 Linear Quadratic Regulator

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-7 LQR控制器 Linear Quadratic Regulator 线性控制器设计-轨迹跟踪(Fellow a Desired Path)

软件测试|如何实现字典的键值互换,你会了吗?

简介 在Python中,字典是一种非常有用的数据结构,它将数据存储为键值对,并且键必须是唯一的。有时候,我们可能需要将字典的键和值互换,以便查找或操作数据更加方便。本文将详细介绍如何在Python中实现字典键值的互换操…

【Effective Objective - C】—— 熟悉Objective-C

【Effective Objective - C】—— 熟悉Objective-C 熟悉Objective-C1.oc的起源消息和函数的区别运行期组件和内存管理要点: 2.在类的头文件中尽量少引入其他头文件向前声明要点: 3.多使用字面量语法,少用与之等价的方法字符串字面量字面数值字…

AntDesignBlazor示例——暗黑模式

本示例是AntDesign Blazor的入门示例,在学习的同时分享出来,以供新手参考。 示例代码仓库:https://gitee.com/known/BlazorDemo 1. 学习目标 暗黑模式切换查找组件样式覆写组件样式 2. 添加暗黑模式切换组件 1)双击打开MainL…

在CMake中自定义宏 add_definitions(-DDEBUG)

hehedalinux:~/Linux/loveDBTeacher-v6$ tree . ├── CMakeLists.txt └── test.c0 directories, 2 files hehedalinux:~/Linux/loveDBTeacher-v6$ test.c #include <stdio.h> #define NUMBER 3int main() {int a 10; #ifdef DEBUGprintf("我是一个程序猿,我…

驾驭未来:从传统运维到智能化运维的转型之路

随着科技的飞速发展&#xff0c;企业的业务需求也在不断变化。为了满足这些需求&#xff0c;企业的IT架构逐渐向云原生、容器化和微服务化演进。作为支撑企业业务发展的运维人员&#xff0c;我们需要紧跟时代步伐&#xff0c;不断提升自己的技能和认知水平。 在2023年全球运维大…

评估LLM在细胞数据上的实用性(3)-基因层面的评估

目录 定义基因功能预测扰动预测基因网络分析 基因层面的评估基因功能预测扰动预测基因网络分析 定义 基因功能预测 基因功能预测对于识别基因在不同条件下的特性非常重要。因为人类大约有20,000个蛋白质编码基因&#xff0c;只有一些被标注了功能。对基因功能的准确预测可以帮…

CMake在静态库中链接静态库

hehedalinux:~/Linux/multi-v2$ tree . ├── calc │ ├── add.cpp │ ├── CMakeLists.txt │ ├── div.cpp │ ├── mult.cpp │ └── sub.cpp ├── CMakeLists.txt ├── include │ ├── calc.h │ └── sort.h ├── lib │ ├── l…

【WEB API自动化测试】接口文档与在线测试

这一篇我们主要介绍如何做API帮助文档&#xff0c;给API的调用人员介绍各个 API的功能, 输入参数&#xff0c;输出参数, 以及在线测试 API功能(这个也是方便我们自己开发调试) 我们先来看看我们的API最终帮助文档及在线测试最终达到的效果: 概要图 GET API 添加产品API: 删除…

flutter使用get库管理路由,并设页面跳转动画和常见动画

get库还是非常强大的一个仓库&#xff0c;里面包含了非常常用的一些方法&#xff0c;比如路由管理&#xff0c;这是最常见和最常用的一个功能了&#xff0c;我们可以先配置一个路由对象&#xff0c;然后在里面配置路由列表&#xff0c;并且设置路由跳转方式。 第一种方式&…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑦

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷7 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷7 模块一 …

jetson orin nano 使用yolov8导出engine

1. 导出onnx 经过前面训练&#xff0c;得到了best.pt模型&#xff0c;现在想要使用tensorrt进行推理&#xff0c;需要先导出为onnx格式&#xff0c;再转化为engine格式。 yolo export modelbest.pt formatonnx opset12 simplifyTrue2.解决错误 在导出过程中&#xff0c;可能…

postman 之 接口请求

一、前言 1. 安装 2. 主界面 3. 请求区域 Body下主要包含以下4中格式 form-data&#xff1a;混合表单&#xff0c;支持上传文件x-www-form-urlencoded&#xff1a;文本表单raw&#xff1a;原始格式&#xff0c;支持JSON/XML格式&#xff08;后面可选择&#xff09;binary&am…