IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> Linux kernel ARM64异常(Exception)处理流程 -> 正文阅读

[嵌入式]Linux kernel ARM64异常(Exception)处理流程

背景
异常(Exception)发生是针对CPU的,本来CPU就在不同异常等级(exception level)运行。
ARM64中有4个异常等级,分别是EL0, EL1, EL2, EL3
注意区分:异常发生的等级,以及跃迁到的目标异常等级,目标异常等级大于等于异常发生的等级,EL0不会是目标异常等级
异常类型分为同步异常和异步异常, 同步异常只有Synchronous,其它3个类型都是异步异常。

异常发生时,硬件做的事情
(1)CPU core感知到异常发生,生成一个目标异常等级
(2)把PSTATE寄存器里的值保存到对应目标异常等级的SPSR_ELx寄存器
便于恢复时使用
(3)把返回地址保存在对应目标异常等级的ELR寄存器中
若是同步异常,则ELR寄存器存的是aborted PC
(4)把PSTATE寄存器里的DAIF字段都mark掉
相当于把本地CPU的中断关闭,但是同步异常不受影响,还是有机会继续发生。
(5)对于同步异常,把异常的原因写入到ESR_ELx寄存器
(6)设置SP,指向目标异常等级里的栈,自动切换SP到SP_ELx寄存器中
(7)异常等级切换到目标异常等级,PC指针切换到对应的异常向量表去执行

软件处理是从对应的异常等级的向量表vectors开始的:
(1)先kernel_ventry
会分配栈,以及检查栈是否溢出
第一句就是分配pt_regs的栈: sub sp, sp, #PT_REGS_SIZE
(2)转到对应的子类型,先做kernel_entry来保存pt_regs, 也会做current->addr_limit设置
kernel_entry 做好后的主要寄存器:
/*
* Registers that may be useful after this macro is invoked:
*
* x20 - ICC_PMR_EL1
* x21 - aborted SP
* x22 - aborted PC
* x23 - aborted PSTATE
*/
(3)继续做对应后续处理
(4)若从处理里返回,先kernel_exit, 再用eret指令从目标异常返回
eret指令自动完成:
1)从ELR_ELx寄存器中恢复PC指针
2)从SPSR_ELx寄存器中恢复CPU状态

异常向量表补充
每个异常等级的异常向量表根据原异常等级,使用的SP以及ARM状态有4组, 每组又有4个类型,包括Synchronous, IRQ, FIQ, Error
异常向量表的内存布局,每个类型之间的偏差值需要符合ARM spec标准。向量表的起始地址存在vector base register里。

Linux kernel 5.14 rc6
arch/arm64/kernel/entry.S
/*

  • Exception vectors.
    */
    .pushsection “.entry.text”, “ax”

    .align 11
    SYM_CODE_START(vectors)
    kernel_ventry 1, t, 64, sync // Synchronous EL1t
    kernel_ventry 1, t, 64, irq // IRQ EL1t
    kernel_ventry 1, t, 64, fiq // FIQ EL1h
    kernel_ventry 1, t, 64, error // Error EL1t

    kernel_ventry 1, h, 64, sync // Synchronous EL1h
    kernel_ventry 1, h, 64, irq // IRQ EL1h
    kernel_ventry 1, h, 64, fiq // FIQ EL1h
    kernel_ventry 1, h, 64, error // Error EL1h

    kernel_ventry 0, t, 64, sync // Synchronous 64-bit EL0
    kernel_ventry 0, t, 64, irq // IRQ 64-bit EL0
    kernel_ventry 0, t, 64, fiq // FIQ 64-bit EL0
    kernel_ventry 0, t, 64, error // Error 64-bit EL0

    kernel_ventry 0, t, 32, sync // Synchronous 32-bit EL0
    kernel_ventry 0, t, 32, irq // IRQ 32-bit EL0
    kernel_ventry 0, t, 32, fiq // FIQ 32-bit EL0
    kernel_ventry 0, t, 32, error // Error 32-bit EL0
    SYM_CODE_END(vectors)

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:31:07  更:2021-08-29 09:32:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:59:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码