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

Linux内核进程管理子系统有什么第六十六回 —— 进程主结构详解(62) - 实践

接前一篇文章:Linux内核进程管理子系统有什么第六十五回 —— 进程主结构详解(61)

本文内容参考:

Linux内核进程管理专题报告_linux rseq-CSDN博客

《趣谈Linux操作系统 核心原理篇:第三部分 进程管理》—— 刘超

《图解Linux内核 基于6.x》 —— 姜亚华 机械工业出版社

https://zhuanlan.zhihu.com/p/296750228

https://blog.csdn.net/xi_xix_i/article/details/142306000

https://blog.csdn.net/longwang155069/article/details/104346778

https://blog.csdn.net/weixin_45030965/article/details/132734258

特此致谢!

进程管理核心结构 —— task_struct

12. current

前几回讲了current在x86以及ARM上的实现,本回来看本部分剩余的一个知识点:通过task_struct定位内核栈stack和通过内核栈定位task_struct。

  • 通过task_struct找内核栈stack

如果有一个task_struct的指针在手,就可以找到内核栈。如前文书所讲,根据CONFIG_THREAD_INFO_IN_TASK宏是否定义,分为两种情况(代码都位于include/linux/sched/task_stack.h中)。

1)CONFIG_THREAD_INFO_IN_TASK已定义的情况

#ifdef CONFIG_THREAD_INFO_IN_TASK
/** When accessing the stack of a non-current task that might exit, use* try_get_task_stack() instead.  task_stack_page will return a pointer* that could get freed out from under you.*/
static __always_inline void *task_stack_page(const struct task_struct *task)
{return task->stack;
}
……
#endif

2)CONFIG_THREAD_INFO_IN_TASK未定义的情况

#ifdef CONFIG_THREAD_INFO_IN_TASK
……
#elif !defined(__HAVE_THREAD_FUNCTIONS)
#define task_stack_page(task)	((void *)(task)->stack)
……
#endif

这里要提到一个关键的结构体 —— struct pt_regs。

在内核栈的最高地址端,存放的是另一个结构pt_regs,这个结构体保存着进程从应用层进入到内核层时,用户态寄存器的状态。

内核栈是一个非常特殊的结构,如下图所示:

由上图可以看到,在结构 pt_regs上面还有一个内核栈预留空间,这在x86(32位)架构的一个遗留问题,在x86_64架构和arm64架构都没有该内核栈预留空间,如下图所示:

上边已提到,当Linux程序通过系统调用、中断、异常等手段从用户态切换到内核态时,内核态需要保存用户态的寄存器上下文。

在内核栈的最高地址端,存放的是另一个结构pt_regs,这个结构体保存着进程从应用层进入到内核层时,用户态寄存器的状态。

通常内核态会在内核态堆栈的最顶端保留一段空间来存储用户态的寄存器上下文,这段空间的存储格式为pt_regs。

当系统调用从用户态到内核态的时候,首先要做的第一件事情,就是将用户态运行过程中的CPU 上下文保存起来。其实主要就是保存在这个结构的寄存器变量里。这样当从内核系统调用返回的时候,才能让进程在刚才的地方接着运行下去。

当进程用内核态切换回用户态时,就会获取pt_regs结构体中的成员,这样就可以获取当进程用户态运行的寄存器上下文状态了。

struct pt_regs寄存器是体系结构相关的,在Linux内核源码中搜索,可以看到多个结果:

下一回重点讲解x86、x86_64、arm、arm64中的struct pt_regs的相关内容。

http://www.gsyq.cn/news/46173.html

相关文章:

  • HTML 01 【基础语法学习】 - 详解
  • 2025年浓硫酸订做厂家权威推荐榜单:液体硝酸/工业级盐酸/工业级盐酸源头厂家精选
  • vscode c语言 颜色设置
  • 2025年乌鲁木齐黄金回收权威推荐榜单:黄金上门回收/黄金首饰加工/打金店源头商家精选
  • 2025年华美月饼厂家权威推荐榜单:华美冰皮月饼/榴莲冰皮月饼/五仁月饼源头厂家及品牌代理精选
  • 转让发明专利
  • MySQL主从复制延迟诊断与GTID故障切换看我这篇就行了!
  • 2025研发效能制品库选型新思维:构建安全、高效与国产化兼容的研运基座
  • 网页调试和jmeter调试天气预报
  • 2025年石英砂生产线厂家权威推荐榜单:硅砂生产线/光伏砂生产线/玻璃砂生产线源头厂家精选
  • 一次由 DNS 反解析引发的 SpringBoot 启动卡顿问题
  • 2025年航空警示球厂家权威推荐榜单:有机复合材料手孔井/树脂穿线井/复合弱点手孔井源头厂家精选
  • 查询快递
  • JMeter查询天气
  • 树莓派语言设置
  • 2025年热门的灰铁铸件热门厂家推荐榜单
  • JMeter查询快递
  • 2025年口碑好的绢云母粉厂家最新推荐排行榜
  • 2025年知名的矿车厂家推荐及选择指南
  • 回归与分类算法全解析:从理论到实践 - 实践
  • 2025年靠谱的视频号短视频推广热门推荐榜单
  • 2025年知名的大阪机场接送舒适便捷权威榜
  • Python3 sys模块和os模块的区别是什么?
  • 2025年11月数控加工中心推荐:知名厂家排行榜与口碑评价对比指南
  • 快递查询
  • 2025年质量好的马车不锈钢螺栓最新TOP厂家排名
  • 详细介绍:Java-Spring入门指南(二十六)Android Studio下载与安装
  • 2025年靠谱的法兰不锈钢螺栓高评价厂家推荐榜
  • 2025年11月数控铣床推荐:靠谱生产厂家排行榜与热门口碑选择方案
  • debian中打包已安装的库(迁移安装)