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

ARM64 linux系统的一般执行过程

1、正在运行的用户进程X

2、发生异常(包括系统调用等),CPU完成的工作:把当前程序指针寄存器PC放入ELR_EL1寄存器,把PSTATE放入SPSR_EL1寄存器,把异常产生的原因放在ESR_EL1寄存器,将异常向量表的起始地址VBAR_EL1寄存器的值与该异常类型在异常向量表里的偏移量,得出异常向量表空间的入口地址,然后加载该异常向量空间的入口地址到程序指针寄存器PC

ELR_EL1:Exception Link Register (EL1)

SPSR_EL1:Saved Program Status Register (EL1)

ESR_EL1:Exception Syndrome Register (EL1)

VBAR_EL1:Vector Base Address Register (EL1)

3、保存现场,每个异常向量空间仅有128字节最多可以存储32条指令(每条指令4字节),而且异常向量空间最后一条指令是b指令跳转到异常处理程序保存现场,此时完成了用户静态进程上下文切换到中断上下文,即从进程X的用户态切换到进程X的内核态。

        .align 7就是2的7次方,128个字节

        异常向量表和处理函数在arch/arm64/kernel/entry.S这个文件

        异常处理函数的头文件定义:

4. 异常处理过程中,异常返回前有机会调用schedule函数,其中switch_mm切换进程空间,switch_to切换进程cpu的上下文,将当前进程的X的内核堆栈切换到进程调度算法选出来的next进程(本例定位进程Y)的内核堆栈,并完成了进程CPU上下文寄存器的状态切换

5.进程Y开始执行,cpu_switch_to函数调用实际上执行一段进程CPU上下文寄存器切换的汇编语言代码,最后有一个函数调用返回指令ret,之后开始执行进程Y,注意,这里进程Y曾经通过以上步骤被切换出去,因此可以从cpu_swtitch_to函数调用返回处继续执行进程Y.

6.恢复现场,与3中保存现场相对应。注意,这里是在进程Y的异常过程中,而3中保存现场是在进程X的异常处理过程中,因为内核堆栈从进程X的内核堆栈切换到进程Y的内核堆栈了

7.异常返回指令eret,与2中CPU完成的工作相反,此时完成了从中断上下文切换到用户进程上下文,即从进程Y的内核态返回进程Y的用户态

8.继续执行用户态进程Y

相关文章:

  • ​​Git提交代码Commit消息企业级规范
  • Qwen VLo :一个多模态统一理解与生成模型
  • PICkit3编程器MCLR引脚全解析
  • 汇总表支持表头分组,查询组件查询框可以调整高度,DataEase开源BI工具v2.10.11 LTS版本发布
  • 面向对象Plus(2/2)
  • 鸿蒙 SideBarContainer 开发攻略:侧边栏交互设计与多端适配
  • 设计在线教育项目核心数据库表
  • 2024百度之星:BD202404 110串
  • 判定表测试
  • Django ORM 1. 创建模型(Model)
  • yaml 导致的原型污染 -- GPN CTF 2025 Secure by Default
  • 基于51单片机-蜂鸣器演奏《飞雪玉花》
  • 编译原理---文法和语法分析
  • 利用python实现NBA数据可视化
  • SpringBoot 防刷 重复提交问题 重复点击问题 注解 RequestParam RequestBody
  • 《高等数学》(同济大学·第7版)第九章 多元函数微分法及其应用第五节多元函数微分学的几何应用
  • 6.27_JAVA_面试(被抽到了)
  • OpenLayers 渲染之矢量影像图层
  • 10【认识文件系统】
  • 【机器学习深度学习】线性回归(基本模型训练流程)