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

【DeepSeek】ARM 异常级别切换机制详解

ARM 异常级别切换机制详解

一、异常级别层级图

ERET

ERET

ERET

异常/系统调用

异常/虚拟陷阱

SMC调用

EL3: Secure Monitor
安全监控器

EL2: Hypervisor
虚拟化管理

EL1: OS Kernel
操作系统内核

EL0: Application
用户应用


二、切换方式总结表

方向切换机制触发方式典型场景
低→高异常进入同步异常/异步异常系统调用、中断、陷阱
高→低异常返回ERET指令返回用户态、返回Guest

三、从低到高的切换方式

🔼 核心机制:异常进入

EL0 ──► EL1 : SVC指令 / 中断 / 数据异常 EL1 ──► EL2 : HVC指令 / 虚拟化陷阱 EL2 ──► EL3 : SMC指令 / 安全监控调用

具体触发方式:

异常类型触发指令/事件说明
同步异常SVC #immEL0→EL1 系统调用
HVC #immEL1→EL2 虚拟化管理调用
SMC #immEL2→EL3 安全监控调用
异步异常IRQ/FIQ外部中断触发
SError系统错误(如总线错误)
异常陷阱配置陷阱如访问敏感寄存器自动陷入更高EL

切换时的硬件自动操作:

// 异常进入时硬件自动完成: SP_ELx ← 当前SP // 保存栈指针 ELR_ELx ← 返回地址 // 保存PC SPSR_ELx ← 当前PSTATE // 保存处理器状态 PSTATE.EL ← 目标EL // 切换到目标异常级别 PC ← VBAR_ELx + offset // 跳转到异常向量

四、从高到低的切换方式

🔽 核心机制:异常返回(ERET)

EL3 ──► EL2 : ERET 指令 EL2 ──► EL1 : ERET 指令 EL1 ──► EL0 : ERET 指令

ERET 指令的作用:

// ERET 执行时硬件自动完成: PC ← ELR_ELx // 恢复返回地址 PSTATE ← SPSR_ELx // 恢复处理器状态(包含目标EL) SP ← SP_ELx // 恢复栈指针(如果使用banked SP)

⚠️关键点:目标EL由SPSR_ELx.M[3:0]决定,可实现降级切换。


五、相互调用机制

调用关系图:

高级别

低级别

SVC 系统调用

HVC 虚拟化调用

SMC 安全调用

ERET 返回

ERET 返回

ERET 返回

EL0: App

EL1: Kernel

EL2: Hypervisor

EL3: Monitor


六、调用规则详解

❌ 高级别能否调用低级别代码?

不能直接调用!必须通过ERET返回。

尝试方式结果原因
直接跳转BR/BLR❌ 失败权限检查失败
直接调用函数❌ 失败EL不能主动降低
使用ERET✅ 成功唯一合法方式

原因:处理器不允许主动降低特权级,防止恶意代码提权后降级执行恶意操作。


✅ 低级别能否调用高级别代码?

可以!通过异常/特殊指令。

调用方式指令场景
系统调用SVC #0EL0→EL1(如 read/write)
虚拟化调用HVC #0EL1→EL2(如VM管理)
安全调用SMC #0EL1/EL2→EL3(如TrustZone)
中断触发外部IRQ任意EL→更高EL

七、完整切换流程示例

示例:用户态系统调用

// ===== EL0 (用户态) ===== mov x0, #1 // 参数 mov x1, #buffer // 参数 svc #0 // 触发系统调用,进入EL1 // ===== EL1 (内核态) ===== // 异常向量入口 kernel_handler: stp x29, x30, [sp, #-16]! // 保存寄存器 bl sys_write // 执行系统调用 ldp x29, x30, [sp], #16 // 恢复寄存器 eret // 返回EL0 // ===== 回到 EL0 ===== // 继续执行svc后面的指令

八、权限控制总结

低→高

高→低

调用请求

调用方向?

✅ 允许

❌ 禁止直接调用

通过异常进入机制

只能通过ERET返回

执行高特权代码

返回低特权继续执行

核心原则:

原则说明
只能提权,不能主动降权防止权限滥用
降权必须通过ERET确保状态完整恢复
异常是唯一入口所有特权切换都经过异常处理
硬件自动保存状态ELR/SPSR保证可恢复

九、实际应用场景

场景切换路径触发方式
应用调用内核EL0→EL1SVC
内核调度用户进程EL1→EL0ERET
VM陷入HypervisorEL1→EL2陷阱/HVC
进入安全世界EL1→EL3SMC
中断处理任意EL→EL1IRQ

这种设计确保了安全性可控性,是现代处理器特权级管理的核心机制。

http://www.jsqmd.com/news/681930/

相关文章:

  • 手机打字效率翻倍:搜狗输入法隐藏的拼音分词和发送键优化全攻略
  • 别再只会arp -a了!揭秘Wireshark抓包找IP的底层原理与常见误区
  • Easy-Scraper终极指南:用Rust快速简化网页数据提取的完整方案
  • Docker容器逃逸防护升级(沙箱纵深防御白皮书):基于seccomp-bpf+userns+no-new-privileges的生产级加固实践
  • 富士胶片ApeosPort 3410SD网络打印机安装:从驱动下载到静态IP设置,保姆级避坑全记录
  • QT窗体自适应避坑指南:为什么你的resizeEvent总失效?
  • 终极免费激活方案:5分钟搞定Windows与Office永久激活的完整指南
  • 知识图谱实战:手把手用PyTorch复现TuckER模型完成链接预测任务
  • Vue Antd Admin架构实战:如何构建高性能企业级中后台系统
  • 基于安卓的心理健康自评与干预系统毕设
  • 别再死记硬背DC脚本了!一个真实项目带你搞定Synopsys DC综合全流程(附完整脚本)
  • 飞书群聊的Jira Bug看板:手把手教你配置Jenkins定时任务和参数化构建
  • 为什么你需要Webcamoid:重新定义网络摄像头体验的终极工具
  • AssetRipper完全指南:三步掌握Unity资源提取终极工具
  • 金蝶云星空K3Cloud实战:手把手教你搞定生产退料单WEBAPI自定义(附完整C#代码)
  • 4月22日成都地区包钢产无缝钢管(8163-20#;外径42-630mm)现货报价 - 四川盛世钢联营销中心
  • 别再只会用QMessageBox::information了!Qt对话框进阶:手把手教你打造自定义按钮和详细信息的弹窗
  • 从模型到芯片:手把手教你用RKNN-Toolkit Lite在RV1126开发板上跑通第一个AI Demo
  • 手把手教你用STM32F411CEU6和W25Q128打造一个超迷你的U盘(附完整代码)
  • ExplorerPatcher终极指南:免费恢复Windows 11经典界面与高效工作流
  • NeRF实战:用Google Colab免费GPU,30分钟从照片生成你的第一个3D模型
  • Tesseract OCR终极指南:如何用开源引擎实现高效文字识别
  • openKylin 2.0 SP2第三次更新:优化关键模块,新增装包功能提升速度
  • TI C2000 DSP的CAN中断实战:一个邮箱如何接收多个ID的数据帧?
  • 5分钟快速上手PKHeX自动合法性插件:宝可梦数据合规终极指南
  • 从‘秒’到‘纳秒’:手把手教你用`std::chrono`设计一个带暂停/重置功能的跨平台计时器类
  • 别再只用MD5了!深入对比PostgreSQL的SCRAM-SHA-256和MD5,附AWS RDS实战配置避坑指南
  • Django后台进阶:用SimpleUI自定义菜单与数据展示,打造你的专属运营中台
  • 22日成都市批发兼零售螺旋焊管(Q235B;内径DN200-3500mm)现货报价 - 四川盛世钢联营销中心
  • Mac音乐解密神器:3分钟解锁QQ音乐加密格式,让音乐自由播放