在threadA执行时,被调度了执行了threadB, 那么在threadB执行完之后是如何恢复threadA进程能够继续执行的呢?

我们从代码中去寻找答案, 系统调度是schedule()函数,那么我们就从schedule()函数看起
schedule() --> __schedule(true) --> context_switch(rq, prev,next) --> switch_to(prev, next, prev) --> __switch_to((prev), (next))

/** Thread switching.*/
struct task_struct *__switch_to(struct task_struct *prev,struct task_struct *next)
{struct task_struct *last;fpsimd_thread_switch(next);tls_thread_switch(next);hw_breakpoint_thread_switch(next);contextidr_thread_switch(next);
#ifdef CONFIG_THREAD_INFO_IN_TASKentry_task_switch(next);
#endifuao_thread_switch(next);/** Complete any pending TLB or cache maintenance on this CPU in case* the thread migrates to a different CPU.*/dsb(ish);/* the actual thread switch */last = cpu_switch_to(prev, next);return last;
}

1、通用寄存器的保存
schedule() --> __schedule(true) --> context_switch(rq, prev,next) --> switch_to(prev, next, prev) --> __switch_to((prev), (next)) --> cpu_switch_to(prev, next)

/** Register switch for AArch64. The callee-saved registers need to be saved* and restored. On entry:*   x0 = previous task_struct (must be preserved across the switch)*   x1 = next task_struct* Previous and next are guaranteed not to be the same.**/
ENTRY(cpu_switch_to)mov x10, #THREAD_CPU_CONTEXTadd x8, x0, x10     // previous task_struct + THREAD_CPU_CONTEXT,X8为前一个进程的struct cpu_context结构体指针mov    x9, spstp   x19, x20, [x8], #16     // store callee-saved registers  &&&& 压栈  &&&&stp   x21, x22, [x8], #16stp  x23, x24, [x8], #16stp  x25, x26, [x8], #16stp  x27, x28, [x8], #16stp  x29, x9, [x8], #16str   lr, [x8]       // lr压栈add   x8, x1, x10    // next task_struct + THREAD_CPU_CONTEXT,X8为后一个进程的struct cpu_context结构体指针ldp x19, x20, [x8], #16     // restore callee-saved registers  &&&& 出栈  &&&&ldp x21, x22, [x8], #16ldp  x23, x24, [x8], #16ldp  x25, x26, [x8], #16ldp  x27, x28, [x8], #16ldp  x29, x9, [x8], #16ldr   lr, [x8]        lr出栈mov sp, x9
#ifdef CONFIG_THREAD_INFO_IN_TASKmsr    sp_el0, x1
#elseand    x9, x9, #~(THREAD_SIZE - 1)msr  sp_el0, x9
#endifret
ENDPROC(cpu_switch_to)

根据ARM标准文档描述<IHI0056C_beta_aaelf64.pdf>, x19~x28是属于
callee-saved registers,需要保存,此外sp,lr,pc也需要保存

THREAD_CPU_CONTEXT为thread.cpu_context在struct task_struct结构体中的偏移

 DEFINE(THREAD_CPU_CONTEXT,  offsetof(struct task_struct, thread.cpu_context));
 struct task_struct {......struct thread_struct thread;};
 struct thread_struct {struct cpu_context    cpu_context;    /* cpu context */unsigned long      tp_value;   /* TLS register */
#ifdef CONFIG_COMPATunsigned long       tp2_value;
#endifstruct fpsimd_state   fpsimd_state;unsigned long      fault_address;  /* fault info */unsigned long       fault_code; /* ESR_EL1 value */struct debug_info    debug;      /* debugging */
}
struct cpu_context {unsigned long x19;unsigned long x20;unsigned long x21;unsigned long x22;unsigned long x23;unsigned long x24;unsigned long x25;unsigned long x26;unsigned long x27;unsigned long x28;unsigned long fp;unsigned long sp;unsigned long pc;
};

问与答:
关于前面的一段汇编,上面stp的一段是压栈,将前一个进程的寄存器保存起来。
后面ldp的一段是出栈,将后一个进程的寄存器恢复出来。
关于栈,不都是先进后出吗? 为何这里是先进先出、后进后出?

在arm32上,是PUSH,POP等指令,是先进后出
到了arm64上,没有了PUSH POP指令,取而代之的是STP LDP,这个指令其实就是读寄存器,没有"先进/后进/先出/后出"等概念了,你想怎么进就怎么进,想怎么出就怎么出

linux kernel进程切换(寄存器保存与恢复)相关推荐

  1. [architecture]-ARMV7架构下Linux Kernel的Userspace进程切换时保存和恢复哪些寄存器

    ★★★ 个人博客导读首页-点击此处 ★★★ . 文章目录 1.armv7的通用寄存器简介 2.寄存器的保存和恢复 3.Linux Kernel参考代码 1.armv7的通用寄存器简介 ARMV7处理器 ...

  2. linux 让暂停的进程恢复,Linux 下进程的挂起和恢复命令

    本文给大家介绍进程的挂起及恢复命令,具体内容如下所示: #ctrl+z:挂起,程序放到后台,程序没有结束. #jobs:查看被挂起的程序工作号 恢复进程执行时,有两种选择:fg命令将挂起的作业放回到前 ...

  3. (3)Linux进程调度-进程切换

    目录 背景 1. 概述 2. 抢占 2.1 用户抢占 2.1.1 抢占触发点 2.1.2 抢占执行点 2.2 内核抢占 2.2.1 抢占触发点 2.2.2 抢占执行点 2.3 preempt_coun ...

  4. [architecture]-ARMV7架构下SecureMonitor双系统切换时保存和恢复哪些寄存

    ★★★ 个人博客导读首页-点击此处 ★★★ . 文章目录 1.armv7的通用寄存器简介 2.寄存器的保存和恢复 3.参考代码: 1.armv7的通用寄存器简介 ARMV7处理器有40个32位寄存器, ...

  5. linux kernel 进程管理,Linux内核 | 进程管理

    1. 进程和线程 1.1 定义 进程是处于运行状态的程序和相关资源的总称,是资源分配的最小单位. 线程是进程的内部的一个执行序列,是CPU调度的最小单位.有一段可执行程序代码. 有一段进程专用的系统堆 ...

  6. [ATF]-ARM级别/异常/状态切回时候的寄存器保存与恢复

    文章目录 1.save/restore函数的定义 (1).el1_sysregs_context_save //保存系统寄存器 (2).el1_sysregs_context_restore //恢复 ...

  7. 任务切换的基础:模拟任务切换时寄存器的保存与恢复

    文章目录 1 任务切换的基础:模拟任务切换时寄存器的保存与恢复 1 任务切换的基础:模拟任务切换时寄存器的保存与恢复 需求说明:使用PendSVC触发异常,在异常处理函数中,保存R4-R11寄存器到缓 ...

  8. 《深入理解Linux内核》-3.3. 进程切换

    3.3. 进程切换 为了控制进程的执行,内核必须能够挂起正在运行的进程并恢复运行其他之前被挂起的进程.这个活动通过进程切换,任务切换或上下文切换执行这种各样的操作.接下来的章节介绍Linux系统上的进 ...

  9. Linux进程管理+内存管理:进程切换的TLB处理(ASID-address space ID、PCID-process context ID)

    目录 一.前言 二.单核场景的工作原理 1.block diagram 2.绝对没有问题,但是性能不佳的方案 3.如何提高TLB的性能? 4.特殊情况的考量 4.进一步提升TLB的性能 - ASID( ...

最新文章

  1. 6月27日任务 配置Tomcat监听80端口、配置Tomcat虚拟主机、Tomcat日志
  2. python给图片添加字符
  3. bash alias, VIM配置,和使用的插件 RAILS开发相关
  4. 替换弹窗中字段显示的值
  5. ICML论文录取难度逐年上升,New In ML为你特设“名师辅导班”
  6. docker jib_Jib –为Spring Boot应用程序构建docker映像
  7. python win10 连接hive_使用win10+python3.5+impyla 连接大数据平台hive表的步骤与问题解决...
  8. datatable怎么根据两列分组_公司要IT转型,我该怎么办?用Python进行数据处理
  9. 清除浮动(采用BFC)
  10. 前端面试时面试官想要听到什么答案(关于一些Vue的问题)
  11. 环保牵手大数据 佛企需反向挖掘数据价值
  12. 深入理解docker graph driver - DeviceMapper
  13. 解决从PDF复制文本到word的时候排版问题小技巧
  14. 漫画:程序员要不要去考证?
  15. 如何把word文件转换成PDF格式?
  16. 数独基本规则_数独游戏规则?
  17. 最新版MATLAB怎么运行代码,matlab怎么运行代码
  18. VBA 贴片电阻名称转换
  19. WC2020 打铁记
  20. Vallen Dispersion——计算Lamb波色散,声发射信号模态分析的免费软件

热门文章

  1. 精密空调内部培训资料
  2. 数据中心网络组网的不同方案
  3. linux ie8找不到,ie浏览器不见了怎么办 三种方法搞定【图文教程】
  4. arraylist转int数组_五千字的数组拓展,面试官对我竖起大拇指喊停
  5. 奇奇怪怪的小姿势——关于UI的各种Position
  6. UOJ #310 黎明前的巧克力 (FWT)
  7. ASP.NET Core 实现带认证功能的Web代理服务器
  8. js记录用户访问页面和停留时间
  9. 20155334 2016-2017-2 《Java程序设计》第四周学习总结
  10. HDU1402 A * B Problem Plus(FFT)