- 写在前面 - 寄存器大小写不敏感 currentel currentEL都可以 - 通用寄存器 General-Purpose Register - x0-x31 - w0-w31 - 特殊寄存器 Special-Purpose Register - Pstate (跟spsr是对应的,只不过可以拆开来用) - CurrentEL - 例子 `mrs x0 CurrentEL` - 典型应用场景 - DAIF - 例子 `mrs x0 daif` - 典型应用场景 - NZCV - 例子 `mrs x0 nzcv` - 典型应用场景 - PAN Privileged Access Never 可选 - ARMv8.1-PAN - UAO User Access Override 可选 - ARMv8.2-UAO - DIT Data Independent Timing 可选 - ARMv8.4-DIT - 例子 - 典型应用场景 - TCO Tag Check Override - ARMv8.5-MemTag - SSBS - ARMv8.0-SSBS 8.5? - ELR Related **重要** - ELR - 说明 记录异常地址返回值 看一下LR寄存器 - 典型应用场景 - 进入异常时,硬件设置 - kernel_entry 处理异常 ? - kernel_exit 异常退出 - `msr elr_el1, x21` - SPSR Related **重要** - SPSR - 说明 用于进入异常之前备份Pstate - 典型应用场景 - 进入异常时硬件设置 - kernel_entry 处理异常 - kernel_exit 异常退出 - `msr spsr_el1, x22` - Floating Point Related 补充 - FPCR - FPSR - 系统寄存器 Reg_ELn n=0-3 - 基本分类 - 通用系统控制寄存器 **General System Control Register** - 重要 - 调试寄存器 Debug Register - 部分寄存器DBG开头 - 性能监控寄存器 Performance Monitor Register - PM开头 - 活动监控寄存器 Activity Monitor Resister - AM开头 - 统计扩展寄存器 Statistical Profiling Extention Register - PM开头 - RAS 寄存器 Reliability, Availability, and Serviceability Extension Register - 大部分ER开头 - 通用定时器寄存器 Generic Timer Resister - CNT开头, CNTP开头 - 通用系统寄存器列表 - VBAR **Vector Base Address Register** - 说明 中断向量基地址 - 典型使用场景 - Linux \_\_primary_switched中设置为vectors中的地址 - `adr_l  x8, vectors` // load VBAR_EL1 with virtual - `msr    vbar_el1, x8` // vector table address - Rt-thread rt_hw_set_current_vbar - `MSR     VBAR_EL1,X0` - Cache相关 - CTR **Cache Type Register** 只有EL0 - 说明 - 典型使用场景 - Linux read_cpuid_cachetype() - 地址转换相关 TCR/SCTLR/TTBR - TCR **Translation Control Register** - 说明 控制页表转换控制, 一堆可配置bit位 - SCTLR **System Control Register** EL1-EL3 - 说明 系统控制,一堆可配置bit位 - 典型使用场景 - 设置大小端 - 设置MMU - TTBR - 说明 页表基地址 - 典型使用场景 - 设置页表基地址 - 异常相关 - ESR **Exception Syndrome Register** - 说明 记录了异常原因的寄存器 一共有5个有效bit,叫做exception class - 典型使用场景 ?没分析对 - ID寄存器 MIDR/MPIDR/REVIDR/TPIDR - MPIDR **Multiprocessor Affinity Register** EL1 - 说明 只读寄存器,记录PE亲和信息 aff0-3 由小到大记录PE的id,有超线程会记录超线程 - ![[mpidr说明.png]] - 观测方法 - 未知 - 典型场景 - Linux ==调查== - Rt-thread - TPIDR **Read/Write Software Thread ID Register** EL0-EL3 - 说明 PE不用这个寄存器 纯给OS软件用 我理解就是软件自己定义的cpuid,从mpidr转化而来 - 典型场景 - Linux ==不清楚== - Rt-thread 存Lwp ID用? - MIDR - 说明 用于显示厂商,架构等 EL1 - 观测方法 - - 典型场景 没啥用 - REVIDR - 说明 提供次要修订信息 厂商自己实现,全0 - SCR/HCR - HCR Hypervisor Configuration Register 只有EL2 - 功能 用来配置EL2 - SCR Secure Config Register 只有EL3 - 功能 用来配置EL3 - 使用场景 - 与中断路由有关系 - TVAL - MAIR - , Memory Attribute Indirection Register - CLIDR - CSSELR - CCSIDR - DCZID - MODE - RMR - RVBAR - CPACR - ZCR