雄安网站建设需要多少钱,帮企业建网站步骤,刚刚合肥最新通告,国外做彩票网站违法吗本文基于Linux 5.10.186版本内核源码进行分析。 文章目录 current概述早期内核版本实现最新版本内核实现x86体系下的current宏实现ARMv8体系下的current实现 相关参考 current概述
Linux内核在运行时经常需要访问当前运行进程的task_struct指针#xff0c;于是#xff0c;系… 本文基于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 进程管理之currentLinux调度——神奇的current