第四节 处理器状态

1. 处理器状态

处理器状态主要包括条件标志,异常屏蔽标志、执行状态和权限级等信息。飞腾CPU的当前处理器状态不是单一系统寄存器来描述的,是由若干系统寄存器一起来描述的。
在AArch64模式中,处理器状态PSTATE包括以下域:

  1. {N, Z, C, V} 条件标志

寄存器NZCV是一个32位寄存器,描述了用于数据处理过程的条件标志,包括第31位的负标志N、第30位的零标志Z、第29位的借位标志C和第28位的溢出标志V。这些条件标志位可以在EL0权限级修改。
mrs x0, nzcv
msr nzcv, x0

  1. SS 软件单步控制位,包含在监控调试系统控制寄存器MDSCR的第0位SS。
  1. 调试器首先使能该软件单步控制位
  2. 调试器对异常链接寄存器elr编程,指向要执行指令,并异常返回eret。
  3. 处理器执行一条指令,触发一次软件单步异常,然后将控制权交给调试器。
  4. 调试器返回上面2,循环下一步;或者将该软件单步控制位关闭,退出。
    mrs x0, mdscr_el1
    msr mdscr_el1, x0
  1. IL 非法执行状态位,非法返回事件包括
  1. 非法异常返回
  2. 从调试状态非法返回
  3. 在调试状态执行dprs指令

从调试状态返回,处理器状态就会保存在寄存器dspsr_el0中,而不是寄存器spsr_elx。

  1. {D, A, I, F} 调试掩码位D,中断掩码位A/I/F,软件可以独立修改每一位;寄存器DAIF是一个32位寄存器,设置异常屏蔽标志,包括:
  1. 调试异常屏蔽位D
  2. 系统错误屏蔽位A
  3. 中断IRQ屏蔽位I
  4. 快速中断FIQ屏蔽位F

如果某个异常掩码位设置为1,对应的异常事件就被飞腾CPU屏蔽。这些异常屏蔽位一般不允许在EL0权限级访问;在高权限级下,MRS/MSR指令用于访问DAIF寄存器。

mrs x0, daif
msr daif, x0
msr daifset, #imm
msr daifclr, #imm

  1. nRW 当前执行模式,执行模式是指CPU位长模式,即
  1. AArch64
  2. AArch32
  1. EL 当前权限级。CurrentEL寄存器是一个32位只读寄存器,描述了飞腾CPU当前所处的权限级,其中第2、3两位有效:
  1. 0b00是EL0;
  2. 0b01是EL1;
  3. 0b10是EL2;
  4. 0b11是EL3。

该寄存器不允许在EL0权限级访问,在高权限级下是只读寄存器。

mrs x0, CurrentEL

  1. SP 堆栈指针寄存器选择位
  1. 一般说来,CPU会提供一个通用堆栈寄存器SP;因此当权限级切换时,软件需要对堆栈寄存器进行保存或恢复操作。
  2. 为了优化这种由权限级切换导致的堆栈寄存器保存恢复操作,飞腾CPU分别为四权限级定义了64位堆栈寄存器SP_ELx(x=0/1/2/3)。
  3. 飞腾CPU提供了堆栈选择寄存器SPSel,用来决定哪一个SP_ELx作为通用堆栈寄存器SP来使用。
  1. 如果堆栈选择寄存器SPSel的第0位为1,在权限级ELx下对寄存器SP的访问就是对相应的SP_ELx访问;
  2. 如果堆栈选择寄存器SPSel的第0位为0,无论哪一个权限级,对堆栈寄存器SP的访问就是对SP_EL0访问。
  3. msr SPSel, #imm
  1. 根据权限级和堆栈寄存器选择,飞腾CPU可以分为
  1. 权限级为EL0: EL0t(堆栈寄存器为SP_EL0)
  2. 权限级为EL1:EL1t(堆栈寄存器为SP_EL0)和EL1h(堆栈寄存器为SP_EL1)
  3. 权限级为EL2:EL2t(堆栈寄存器为SP_EL0)和EL2h(堆栈寄存器为SP_EL2)
  4. 权限级为EL3:EL3t(堆栈寄存器为SP_EL0)和EL3h(堆栈寄存器为SP_EL3)

2. 堆栈寄存器选择

一般说来,CPU会提供一个通用堆栈寄存器SP;因此当权限级切换时,软件需要对堆栈寄存器进行保存或恢复操作。
为了优化这种由权限级切换导致的堆栈寄存器保存恢复操作,飞腾CPU分别为四权限级定义了64位堆栈寄存器SP_ELx(x=0/1/2/3)。

  1. 如果直接访问这四个堆栈寄存器SP_ELx,必须用MRS/MSR指令才能直接访问。直接访问这四个堆栈寄存器有最低权限级要求。
  2. 另外,也可以通过通用堆栈寄存器SP来访问相应的堆栈寄存器SP_ELx。
  1. 在权限级EL0下,堆栈寄存器只能是SP_EL0;
  2. 权限级EL1下,堆栈寄存器可以是SP_EL0或者SP_EL1;
  3. 权限级EL2和EL3的情况和EL1类似。

因此,飞腾CPU提供了堆栈选择寄存器SPSel,用来决定哪一个SP_ELx作为通用堆栈寄存器SP来使用。如果堆栈选择寄存器SPSel的第0位为1,在权限级ELx下对寄存器SP的访问就是对相应的SP_ELx访问; 如果堆栈选择寄存器SPSel的第0位为0,无论哪一个权限级,对堆栈寄存器SP的访问就是对SP_EL0访问。

Linux4.19操作系统内核实现中

  1. 当飞腾CPU处于EL0权限级时,堆栈寄存器SP是SP_EL0;
  2. 在EL1权限级时,堆栈寄存器SP是SP_EL1。

3. 处理器状态保存

除了描述当前处理器状态的系统寄存器组,飞腾CPU还提供了保存处理器状态寄存器,专门用于权限级切换的处理器状态保存。

飞腾CPU提供了3个异常链路寄存器ELR_ELx(x=1/2/3),当异常进入ELx权限级时,ELR_ELx就用于保存异常返回地址。
飞腾CPU提供了七个SPSR寄存器,其中包含了三个常规SPSR_ELx(x=1/2/3)寄存器;其他的四个处理器保存寄存器是:

  1. spsr_abt,异常进入Abort状态,采用该寄存器保存处理器状态
  2. spsr_fiq,异常进入FIQ状态,采用该寄存器保存处理器状态
  3. spsr_irq,异常进入IRQ状态,采用该寄存器保存处理器状态
  4. spsr_und,异常进入未定义状态,采用该寄存器保存处理器状态

飞腾CPU体系结构(四)相关推荐

  1. 飞腾CPU体系结构(十四)

    飞腾CPU体系结构(十四) 1. MMU原理 MMU的大致工作原理是: 64位虚拟地址首先分成虚拟页帧号和页内偏移量两部分,虚拟页帧号即页表项索引:根据页表项索引,在进程的页表里查找到对应页表项,然后 ...

  2. 飞腾CPU体系结构(九)

    飞腾CPU体系结构(九) 向量访存指令主要包括LD1/ST1. LD2/ST2.LD3/ST3和LD4/ST4四种. LD1/ST1一般针对一个向量寄存器,也有两个.三个或四个向量寄存器的模式. LD ...

  3. 飞腾CPU体系结构简单介绍(一)

    第一章 飞腾CPU体系结构简介 ARM体系结构是一种精简指令集体系结构RISC,具有以下基本特点:通用寄存器数量较多:采用统一寻址模式,系统主存和外设分布在CPU物理地址空间的不同范围:采用load/ ...

  4. 飞腾CPU体系结构(十)

    飞腾CPU体系结构(十) 1.高速缓存模型 为了优化整体性能,飞腾CPU芯片内部提供L1高速缓存和L2高速缓存,有些飞腾CPU也提供芯片内部的L3高速缓存,本节不对这个情况进行赘述. 靠近流水线的高速 ...

  5. 飞腾CPU体系结构(十二)

    飞腾CPU体系结构(十二) 1. CPU物理地址空间 飞腾CPU支持的物理地址宽度为44位,物理地址空间实际上只有16TB.系统主存(芯片外部内存)和IO外设(例如SoC设备.PCIe设备)都在这个物 ...

  6. 飞腾CPU体系结构(五)

    飞腾CPU体系结构(五)-- 通用寄存器 1. 64位通用寄存器 在AArch64执行状态下,飞腾CPU提供31个64位通用寄存器Xn(n=0/1/-/30),其中X30用作跳转链接寄存器. 某些指令 ...

  7. 飞腾CPU体系结构(十一)

    飞腾CPU体系结构(十一) 1. 预取机制 飞腾CPU为了提升性能,支持从外部内存中预取数据到L1或L2缓存中.如果某个缓存块内容不在L1/L2缓存中,当该缓存块的某个地址单元被第一访问时,就会遇到内 ...

  8. 飞腾CPU体系结构(八)

    飞腾CPU体系结构(八)--标量访存指令 在阅读之前,请先查看<飞腾CPU体系结构(五)>的SIMD和浮点寄存器.飞腾CPU还提供了32个128 位SIMD和浮点寄存器,这32个128位寄 ...

  9. 飞腾CPU体系结构之虚拟地址

    飞腾CPU体系结构之虚拟地址 1. 基本概念 虚拟地址:程序运行时指令和数据对应的地址. 虚拟地址空间:一个进程运行时指令和数据能访问到的虚拟地址范围. 注意事项: 每个进程拥有自己的虚拟地址空间,进 ...

  10. 飞腾CPU体系结构(二)

    第二节 权限级模型 2.1 基本概念 CPU在运行时都会处于一个权限级中.从程序员角度看,权限级可以简单地看作是CPU被允许运行的指令范围.可以访问的寄存器集合和地址范围.一般而言,CPU可以支持多个 ...

最新文章

  1. Matplotlib绘图双纵坐标轴设置及控制设置时间格式
  2. 小学生python入门-极度舒适的全套 Python 入门教程,小学生看了也能学会
  3. 这门国产语言终于要发布 1.0 版本了
  4. RK瑞芯微WIFI模组2020最新支持列表,放心使用!
  5. 宝塔linux面板假设nextcloud,宝塔面板部署NextCloud(14.0.3)逐一解决后台安全及设置警告...
  6. 200道物理学难题——038蚱蜢跃树
  7. 苹果cms仿ZzzFun动漫视频站PC模板
  8. excel表中怎么插入visio_快速制作组织架构图,还在用Visio就out了,Excel简单三步搞定...
  9. java memcmp_C 库函数
  10. 在linux中配置安装telnet服务
  11. 2022国产GIS软件排名
  12. 梅科尔工作室-第七次网络前端培训(JS)
  13. 计算机程序员的英文求职面试,程序员英文面试自我介绍
  14. 按需使用vue-cli-plugin-element插件
  15. 系统测试(功能测试、性能测试、负载测试、压力测试、兼容性测试、安全测试、健壮性测试、配置测试、可用性测试、文档测试)
  16. 关于图片格式中的那些“小”事---- 由编辑图片格式时所想到的
  17. 支付宝支付后页面跳转
  18. html实现点击出现小爱心
  19. NDIS拨号流程+dhcp
  20. 屏幕分辨率:聊一聊像素

热门文章

  1. 软银201亿美元收购Sprint七成股权
  2. IVI车载信息娱乐系统的网络安全注意事项
  3. Python三十行代码实现简单人脸识别
  4. oracle怎么查询换行符,oracle 回车、换行符
  5. hive 中的case when嵌套与if用法实战
  6. C语言strcpy()函数
  7. windows 2000 安全策略设置,2003 IP安全设置
  8. PIE原则——编程要表达出意图
  9. https://raw.githubusercontent.com无法下载解决流程
  10. JavaScript中改变鼠标指针样式的方法