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

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

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()

相关参考

相关推荐

  1. Linux】匿名管道实现简单进程

    2024-01-13 20:26:05       38 阅读
  2. Linux 进程管理

    2024-01-13 20:26:05       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-13 20:26:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-13 20:26:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-13 20:26:05       87 阅读
  4. Python语言-面向对象

    2024-01-13 20:26:05       96 阅读

热门阅读

  1. python爬虫,发送请求需要携带cookies

    2024-01-13 20:26:05       70 阅读
  2. 允许一切发生

    2024-01-13 20:26:05       60 阅读
  3. 【重点!!!】【DP】354. 俄罗斯套娃信封问题

    2024-01-13 20:26:05       66 阅读
  4. 第十讲_css2d转换

    2024-01-13 20:26:05       66 阅读
  5. Rust 宏的使用

    2024-01-13 20:26:05       62 阅读
  6. 一体机旅游景区污水处理设备工艺说明

    2024-01-13 20:26:05       69 阅读
  7. SpringBoot ObjectMapper 返回json 指定字段排序

    2024-01-13 20:26:05       73 阅读