zoukankan      html  css  js  c++  java
  • ARMV8 datasheet学习笔记5:异常模型

    1.前言

    2.异常类型描述

    见 ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST 一文

    3. 异常处理路由对比

    AArch32、AArch64架构下IRQ 和Data Abort 异常处理流程图对比.

     3.1 IRQ 路由

    3.1.1.   AArch32 IRQ 路由

    图 AArch32 IRQ 路由

     

    3.1.2.    AArch64 IRQ 路由

    图 AArch64 IRQ路由

     

     

    图 AArch64 IRQ向量查找

    3.2.     Data Abort 路由

    3.2.1.    AArch32 Data Abort 路由

     

    3.2.2.    AArch64 Data Abort 路由

     

    4. 源代码异常入口

    4.1     C函数入口

     异常类型

    AArch32 State

    AArch64 State

    所在文件

    函数

    所在文件

    函数

    Und

    arm/kernel/traps.c

    do_undefinstr

    Arm64/kernel/traps.c

    do_undefinstr

    Data Abort

    arm/mm/fault.c

    do_DataAbort

    arm64/mm/fault.c

    do_mem_abort

    IRQ

    arm/kernel/irq.c

    asm_do_IRQ

    arm64/kernel/irq.c

    handle_IRQ

    FIQ

           

    System Call

           

    4.2    上报流程图

    例举Data Abort 和 IRQ中断的入口流程图

    • Data Abort 上报

      

    • IRQ上报

     

    4.3.    异常进入压栈准备

    分析64位kernel_entry 压栈代码逻辑(代码路径:kernel/arch/arm64/kernel/entry.S)

    压栈准备

    说明

    • sp指向 #S_LR – #S_FRAME_SIZE 位置

    #S_FRAME_SIZE是pt_regs结构图的size

    • 依次把x28-x29 … x0-x1 成对压入栈内

    每压入一对寄存器,sp指针就移动 -16 =((64/8)*2)字节长度,栈是向地址减少方向增长的.

    • 保存sp+#S_FRAME_SIZE数据到x21

    add x21, sp, #SP_FRAME_SIZE

    • 保存elr_el1到x22

    mrs x22, elr_el1

    • 保存spsr_el1到x23

    mrs x23, spsr_el1

    • 把lr、x21写入sp+#S_LR地址内存

    保存lr和x21的数据到指定栈内存位置

    • 把x22、x23写入sp+#S_PC地址内存

    保存elr,spsr数据到指定栈内存位置

    4.4.     栈布局

    5. 参考文档

    [1] DDI0487A_k_armv8_arm_iss10775.pdf

  • 相关阅读:
    Scala Ant Tasks
    Git挂钩
    读写文件
    DC10用CSS定位控制网页布局
    table设置colspan属性,列宽显示错位解决方法
    ATM和购物商城-错题集
    python 函数参数多种传递方法
    python 函数 初学
    python 集合 gather
    元组 字体高亮 购物车练习
  • 原文地址:https://www.cnblogs.com/smartjourneys/p/6848204.html
Copyright © 2011-2022 走看看