小张学linux内核:十四. elf文件的加载和进程切换寄存器的保存

2023-05-16

重点关注虚拟内存的切换,pgd,mm_struct, start_code;理清楚这三个概念。
pgd不是在这里设置的遵循COW,是在写时缺页中断填充的。
start_code只是一个段开始的标记;真正的进程上下文,存在tast_struct->thread_inf->cpu_context中。
mm_struct:是进程的整个内存空间描述。

进程内核栈示意图

首先看task内核栈的分布图
在这里插入图片描述

task_struct->stack;即为进程的内核栈,指向栈底。
栈底,为magic word,进程调度时用来检测是否栈溢出的。然后是task_struct结构体,task_struct里面包含thread_info结构。
thread_info->保存进程切换两个进程的寄存器现场。

struct thread_info {
	unsigned long		flags;		/* low level flags */
	int			preempt_count;	/* 0 => preemptable, <0 => bug */
	mm_segment_t		addr_limit;	/* address limit */
	struct task_struct	*task;		/* main task structure */
	__u32			cpu;		/* cpu */
	__u32			cpu_domain;	/* cpu domain */
	struct cpu_context_save	cpu_context;	/* cpu 寄存器上下文*/
	__u32			syscall;	/* syscall number */
	__u8			used_cp[16];	/* thread used copro */
	unsigned long		tp_value[2];	/* TLS registers */
#ifdef CONFIG_CRUNCH
	struct crunch_state	crunchstate;
#endif
	union fp_state		fpstate __attribute__((aligned(8)));
	union vfp_state		vfpstate;
#ifdef CONFIG_ARM_THUMBEE
	unsigned long		thumbee_state;	/* ThumbEE Handler Base register */
#endif
};

cpu_context_save结构体:

struct cpu_context_save {
	__u32	r4;
	__u32	r5;
	__u32	r6;
	__u32	r7;
	__u32	r8;
	__u32	r9;
	__u32	sl;
	__u32	fp;
	__u32	sp;				/*栈指针*/
	__u32	pc;             /*pc值*/
	__u32	extra[2];		/* Xscale 'acc' register, etc */
};

通过宏TI_CPU_SAVE可以访问到这个成员的偏移量。

文件:arch\arm\kernel\asm-offsets.c

DEFINE(TI_CPU_SAVE,		offsetof(struct thread_info, cpu_context));

TI是thread_info的缩写。

进程上下文切换寄存器环境的切换

这些就能解释进程调度中上下文切换的pc的跳了。
来看__switch_to函数,汇编代码
文件arch\arm\kernel\entry-v7m.S

/*
 * Register switch for ARMv7-M processors.
 * r0 = previous task_struct, r1 = previous thread_info, r2 = next thread_info
 * previous and next are guaranteed not to be the same.
 */
ENTRY(__switch_to)
	.fnstart
	.cantunwind
	/*获取old进程cpu_context值*/
	add	ip, r1, #TI_CPU_SAVE          
	/*保存r4-r11寄存器*/ 
	stmia	ip!, {r4 - r11}		@ Store most regs on stack
	/*保存sp寄存器*/
	str	sp, [ip], #4        
	/*保存pc寄存器*/
	str	lr, [ip], #4
	mov	r5, r0
	/*获取新进程的cpu_context*/
	add	r4, r2, #TI_CPU_SAVE        
	ldr	r0, =thread_notify_head
	mov	r1, #THREAD_NOTIFY_SWITCH
	bl	atomic_notifier_call_chain
	mov	ip, r4
	mov	r0, r5
	/*j加载r4-r11寄存器值*/
	ldmia	ip!, {r4 - r11}		@ Load all regs saved previously
	/*加载sp*/
	ldr	sp, [ip]
	/*加载pc,完成进程的切换*/
	ldr	pc, [ip, #4]!
	.fnend
ENDPROC(__switch_to)

问:进程切换为什么不保护寄存器r0-r3的值?

答: r0,r1,r2用来做__switch_to传参用,r0:old task_struct的指针;r1是新进程指针,r2 old thread_info。

内栈顶的pt_regs是作甚的呢?

答:是系统调用保存用户侧上下文环境的寄存器值

#define current_pt_regs() task_pt_regs(current)

arch\arm\include\asm\processor.h中

	/*THREAD_START_SP 为内核栈大小-8*/
#define task_pt_regs(p) \
	((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1)
	
#define task_stack_page(task)	((void *)(task)->stack)	

elf文件的加载

直接分析函数load_elf_binary

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小张学linux内核:十四. elf文件的加载和进程切换寄存器的保存 的相关文章

  • 蒙特卡罗求积分(使用MATLAB实现,分层抽样,重点抽样,对偶变量,控制变量,Metropolis Hasting,Gibbs)

    蒙特卡罗求积分 64 author HCF 背景概述 为了解决某问题 xff0c 首先需要把它变成一个概率模型的求解问题 xff0c 然后产生符合模型的大量随机数 xff0c 最后对产生的随机数进行分析从而求解问题 xff0c 这种方法叫做
  • docker容器编译程序 的两种方案

    如果用docker 容器编译程序 有两种方案可供选择 1 xff0c 激活镜像作为slave编译 采用Jenkins提供的jnlp slave 或ssh slave 标准镜像二次封装 xff0c 或者初始镜像 xff0c 然后通过label
  • 安卓与串口通信-校验篇

    前言 一些闲话 时隔好几个月 xff0c 终于又继续更新安卓与串口通信系列了 这几个月太颓废了 xff0c 每天不是在睡觉就是虚度光阴 xff0c 最近准备重新开始上进了 xff0c 所以将会继续填坑 今天这篇文章 xff0c 我们来说说串
  • vscode的git冲突

    vscode的git冲突 vscode中使用git进行代码管理 xff0c 如果出现冲突了 xff0c git pull会报错 xff0c 需要进行以下步骤 xff1a git stash git pull git stash pop gi
  • 树莓派4b ubuntu mate 18.04设置开机自动登录,解决无HDMI无法开机问题

    一 树莓派4b ubuntu mate 18 04设置开机自动登录 之前安装的是树莓派4b Ubuntu server 的18 04版本 xff0c 通过命令行安装的ubuntu mate 18 04 xff0c 由于官方没有18 04ma
  • TX2 NX核心板-VNC远程桌面

    文章目录 前言一 前期准备二 TX2端安装VNC1 安装vino2 使能VNC服务3 编辑org gnome4 设置为Gnome编译模式5 设置VNC 登录密码6 配置本地网络地址为静态7 开机自启VNC 二 WINDOWS端安装VNC参考
  • docker(三)dockerfile

    文章目录 dockerfile构建过程基础知识dockerfile 的指令简单的dockerfile实验docker historyCMD 和 ENTRYPOUNT的区别举例 tomcat镜像 dockerfile构建过程 编写一个dock
  • FIND_IN_SET函数

    FIND IN SET函数是IN函数的升级版 功能类似 区别在于 如果是常量 xff0c 则可以直接用IN xff0c 否则要用FIND IN SET 函数 MySQL中原型为 xff1a FIND IN SET str strlist 假
  • 浅谈两轮平衡车的控制原理

    前言 xff1a 在IT行业摸爬滚打了好几年 xff0c 好不容易从学生熬成了社会人士 xff0c 通过自己的不断努力又从社会人士熬成了学生 这几年的修行 xff0c 同道博友给了我很多的帮助 xff0c 很早之前就有写博客的想法 xff0
  • 浅谈两轮平衡车的控制原理(续)

    前言 xff1a 上次云里雾里的说了一通 xff0c 不知道对平衡车的控制有没有说到点子上 单纯的讲解原理可能会很无聊 xff0c 但是作为一个技术宅来说 xff0c 就算头皮发麻也要接着看下去 哈哈 xff0c 吾理小子争取用通俗的语言把
  • 基于OpenCV3.0的车牌识别系统设计(一)--系统综述

    写在前面的话 车牌识别是图像处理技术的实际生活中一个非常重要的应用场景 xff0c 目前车牌识别系统已经非常完善 xff0c 识别准确率高达99 以上 作为学生 xff0c 在学习图像处理时 xff0c 自己搭建车牌识别系统是非常有价值的
  • 基于OpenCV3.0的车牌识别系统设计(二)--车牌提取

    写在前面的话 上一篇开篇博文写好之后找女朋友看了一下 xff0c 希望她提一点建设性建议 结果她很委婉的告诉我 xff0c 写的还行就是太表面了 xff0c 告诉我要注意细节的描述与具体的实现过程与原理等等 其实我只是想骗她看一下增加一下点
  • gazebo模型之间的转换:xacro>urdf>sdf

    gazebo模型之间的转换 xff1a xacro gt urdf gt sdf 前言1 xacro转urdf2 urdf转sdf3 其他工具结语 前言 gazebo的模型描述文件有三种形式 xff1a urdf xacro sdf urd
  • 电池SOC仿真系列-基于卡尔曼滤波算法的电池参数辨识

    基于 卡尔曼滤波算法电池参数辨识 本期在已经确定的电池模型的基础上 xff0c 建立二阶RC等效电路模型 以数学模型中的五个参数变量为卡尔曼滤波的状态变量 xff0c 根据已知的端电压数据估算出各个时刻的参数值 xff0c 进而得到相应的模
  • emWin 卡顿 触屏失效 黑屏 解决方法

    emWin初体验 刚学了uC OS体验到了操作系统的方便 xff0c 于是想体验下图形处理第三方的强大 xff0c emWin便是首选 我移植emWin一共遇到了两个问题 1 一直黑屏 最后实在整不出来 xff0c 有点郁闷 把例程和自己的
  • 小白学java——做一个歌手比赛系统(一)

    xfeff xfeff 完整代码加实验报告都在https download csdn net download qq 39980334 11232331 我已经设置成0积分下载了 xff0c 有需要的自行下载 xff0c 有问题的多看看代码
  • 小白学java------做一个歌手比赛系统(二)

    完整代码加实验报告都在 https download csdn net download qq 39980334 11232331 我已经设置成0积分下载了 xff0c 有需要的自行下载 xff0c 如果页面打不开可能还在审核中 xff08
  • 多旋翼无人机入门 第一章 硬件架构(上)

    多旋翼无人机系统概述 四轴 xff08 多轴 xff09 飞行器也叫四旋翼 xff08 多旋翼 xff09 飞行器 xff0c 它有四个 xff08 多个 xff09 螺旋桨 xff0c 四轴 xff08 多轴 xff09 飞行器也是飞行器
  • 多旋翼无人机入门第一章硬件架构(下)

    本篇主要讲解飞控 xff0c 遥控装置 xff0c GPS模块 xff0c 任务设备 xff0c 数据链路 xff0c 上位机 xff08 机载电脑 xff09 1 飞控 xff1a 包括陀螺仪 加速度计 电路控制板 各外设接口 大家可能都
  • 浙江大学Fast-Lab从0制作自主空中机器人公开课教程补充及部分注意事项(适用于ubuntu系统和ROS零基础)

    浙江大学Fast Lab从0制作自主空中机器人公开课纯萌新补充 xff08 适用于从没接触过ubuntu系统 xff09 1 ubuntu的换源 ubuntu系统安装后需要先换源 xff0c 不然没法安装软件 xff0c 推荐ustc源或者

随机推荐

  • SLAM重点摘要1: 相机变换之旋转矩阵与平移向量,R,T,变换矩阵

    注意 xff1a 本章内容简要 xff0c 不涉及具体详细的数学推导 xff0c 只简要介绍相关的数学理论 关键词 xff1a 旋转矩阵 xff0c 平移向量 xff0c 变化矩阵 xff0c 齐次线性坐标 在我的理解中 xff0c 向量
  • STM32F4系列+FreeRTOS+USB方式驱动有方4G模块

    USB方式驱动有方4G模块 参考博客如下 xff1a 1 https blog csdn net ZCShouCSDN article details 78936456 2 https blog csdn net gyzw mx artic
  • linux gdb调式入门(break,continue,step finnish,run,watch,bt frame),这篇就够了

    建立gdb c 1 include lt stdio h gt 2 3 int fun int n 4 5 int sum 61 0 6 int i 61 0 7 for i 61 0 i lt n i 43 43 8 9 sum 61 s
  • iic片选PCA9548A芯片

    PCA9548A数据表 产品信息和支持 TI com iic片选深入 从上图中我们可以看到通过iic的iic 例如 iic0 扩展出8路iic来访问slave 例如8个口的光模块 那么里面的原理是什么呢 我们先来看PCA9548A 文档 需
  • wireshark tcp报文深度解析

    封包详细信息是用来查看协议中的每一个字段 各行信息分别对应TCP IP协议的不同层级 以下图为例 xff0c 分别表示 xff1a 传输层 网络层 数据链路层 物理层 xff0c 一共四层 如果有应用层数据会显示第五层 xff0c 即一共会
  • 北京/西安内推 | 中国移动研究院NLP组招收自然语言处理算法实习生

    合适的工作难找 xff1f 最新的招聘信息也不知道 xff1f AI 求职为大家精选人工智能领域最新鲜的招聘信息 xff0c 助你先人一步投递 xff0c 快人一步入职 xff01 中国移动研究院 中国移动研究院 AI 中心是中国移动研究院
  • tcp 三次握手和四次挥手报文分析

    1 xff0c tcp 三次握手 报文抓取如下 xff1a 三段报文分析 xff1a 第一次 xff1a 26 gt 96报文交互 Seq num 61 567391014 ACK NUM 61 0 flags 61 SYN 第二次 xff
  • bootp引导程序协议

    bootp又称为引导程序协议 我们来简单了解一下这个协议以及他的用法 1 xff0c BOOTP 请求和应答均被封装在 U D P 数据报中 xff1b 2 xff0c B O O T P 使用 U D P xff0c 且通常需与 T F
  • http请求学习

    GET xff1a 向Web服务器请求一个文件 POST xff1a 向Web服务器发送数据让Web服务器进行处理 PUT xff1a 向Web服务器发送数据并存储在Web服务器内部 HEAD xff1a 检查一个对象是否存在 DELETE
  • linux c语言全面学习json解析函数

    1 json结构的定义 typedef struct cJSON cJSON结构体 struct cJSON next prev 遍历数组或对象链的前向或后向链表指针 struct cJSON child 数组或对象的孩子节点 int ty
  • matlab的图片滤波处理

    椒盐噪声 高斯噪声 MATLAB自带函数 均值滤波 中值滤波 自编模版 读取图片并转换为灰度图片 I 61 imread 39 1 jpg 39 imshow I I1 61 rgb2gray I imshow I1 椒盐噪声 I2 61
  • Linux 动态库的编译和执行

    静态库生成及测试 编码myccso脚本 gcc c Wall I inc src myadd c o myadd o ar rcs libmyadd a myadd o rm o mv libmyadd a lib gcc Wall g I
  • matlab中函数的定义和使用

    在matlab的选择框中的的新建中选择新建函数 xff0c 一般是以 m的文本文件 xff0c 新建后我们可以在里面写入我们的实现函数 xff0c 现在我们给出两个实例看一下 xff0c 分别是简单的求和和Fibonacci sequenc
  • matlab简单绘图plot,subplot

    a1 二维绘图plot的实现 subplot n m x 建立一个m n的绘图区域 xff0c 然后分别在其x 61 1 xff0c 2 xff0c 3 xff0c 4 区域绘制图像 function 61 plot1 x 61 0 0 3
  • python 函数的定义和应用

    1 xff0c 函数定义和使用 xff1a def substract sub a sub b sub res 61 sub a sub b return sub res sub test 61 substract 10 20 print
  • Linux shell中的-d,-f,-e,-n的作用

    1 xff0c d gt dirtionnary 判断目录是否存在 例 xff1a d tmp 返回为真便是 tmp是文件夹目录 2 xff0c e gt exist 判断是否存在 例 xff1a e filename 返回为真表示file
  • 「第四范式」2023届-秋季校园招聘正式启动!

  • Linux下用nginx和naxsi搭建web防火墙

    Linux下用nginx和naxsi搭建web防火墙 Naxsi Naxsi是一个开源 xff0c 高性能 xff0c 地位会规则 xff0c nginx的web应用程序防火墙模块 xff0c 著名的web服务器和反向代理 xff0c 它的
  • 【语义分割】类别不平衡损失函数合集

    在语义分割领域 xff0c 我们会常常遇到类别不平衡的问题 比如要分割的目标 xff08 前景 xff09 可能只占图像的一小部分 xff0c 因此负样本的比重很大 xff0c 导致网络倾向于将所有样本判断为负样本 本文介绍了在数据不平衡时
  • 小张学linux内核:十四. elf文件的加载和进程切换寄存器的保存

    重点关注虚拟内存的切换 xff0c pgd xff0c mm struct start code xff1b 理清楚这三个概念 pgd不是在这里设置的遵循COW xff0c 是在写时缺页中断填充的 start code只是一个段开始的标记