ARM深入理解-5.3-通往内核的大门(异常向量表_AArch32)

简介: ARM深入理解-5.3-通往内核的大门(异常向量表_AArch32)
  • 1 建立异常向量表
  • 2 示例
  • 3 使能中断


异常的初始化就是建立异常向量表并使能异步异常(可以理解为中断)的过程。


1 建立异常向量表


在ARMv8架构的AArch32状态下启动处理器的时候,SCTLR.V决定了reset向量的位置,这与AArch64状态下是不同的(AArch64状态下,reset不再是向量表的一部分):

  • SCTLR.V=0,处理器从0x00000000启动;
  • SCTLR.V=0,处理器从0xFFFF0000启动。

可以通过硬件输入管脚VINITHI设置SCTLR.V的复位值。

除了reset向量之外,其余的异常都要通过异常向量表进行查找,而这些向量表的位置可以通过可编程向量表基地址寄存器进行用户自定义。通俗的讲,就是这些异常向量表放在任何位置都可以,你只需要把它的起始基地址写入到基地址寄存器中,处理器的硬件自动就能找到。这类表有4个,分别是:

  • 向量表基地址寄存器(VBAR)(安全模式使用);
  • Monitor向量表基地址寄存器(MVBAR);
  • Hyp向量表基地址寄存器(HVBAR);
  • VBAR(非安全模式使用);


2 示例


  • 示例1:展示了一个典型的32位状态下的向量表,包含reset和其它异常


.balign 0x20
vector_table_base_address:
B reset_handler
B undefined_handler
B svc_handler
B prefetch_handler
B data_handler
NOP
B IRQ_handler
// 还可以把FIQ handler的代码添加在这儿

4个向量表中的表项可以不同。具体可以参考ARM® Architecture Reference Manual ARMv8, for ARMv8-A architecture规范中的Exception vectors and the exception base address部分内容。

必须初始化4个向量表,也就是在使用向量表之前,需要设置4个向量表基地址寄存器。向量表的基地址必须是32字节对齐的。

  • 示例2:展示了reset之后,如何初始化VBARMVBAR
LDR R1, =secure_vector_table_base_address
MCR P15, 0, R1, C12, C0, 0      // 初始化VBAR(Secure)
LDR R1, =monitor_vector_table_base_address
MCR P15, 0, R1, C12, C0, 1      // 初始化MVBAR


3 使能中断


异常分为异步和同步异常,异步异常通俗的讲就是我们常规意义上的中断,同步异常就是我们常规意义上的异常

异步异常包括abortIRQFIQ,我们称之为广义上的中断。reset之后,可以通过设置CPSR.{A,I,F}标志位进行屏蔽。因此,如果想要捕获 abortIRQFIQ,必须将CPSR.{A,I,F}标志位清零。

另外,为了使能中断,还必须要初始化外部中断控制器(GIC),发送中断信号给处理器。关于GIC控制器的初始化可以参考GICv2或v3相关手册。

  • 示例3:展示了如何使能abortIRQFIQ
// 使能异步abort、中断和快速中断
CPSIE aif
  • CPSIE快速开关中断的命令:a,异步abort;i,中断;f,快速中断。需要注意的是,该命令只是通知处理器不接收中断信号而异,并没有控制GIC通用中断控制器,中断该发生还是发生。

上期主题:通往内核的大门(异常向量表_AArch64)

下期主题:分门别类处理异常

相关文章
|
23天前
|
Linux 网络安全 开发工具
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
本文介绍了如何基于Linux Kernel 5.15.102版本和BusyBox创建一个自定义的迷你Linux ARM系统,并使用QEMU进行启动和调试,包括内核和BusyBox的编译配置、根文件系统的制作以及运行QEMU时的命令和参数设置。
76 0
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
|
19天前
|
Go 开发工具 git
在Qemu+ARM上运行Minix3内核
在Qemu+ARM上运行Minix3内核
|
4月前
|
NoSQL Linux 开发工具
百度搜索:蓝易云【VSCode+GDB+Qemu调试ARM64 linux内核教程。】
请注意,根据你的具体环境和需求,上述步骤可能会有所调整和修改。建议参考相关文档和资源,以获得更详细的配置和调试指南。
86 0
|
传感器 资源调度 安全
ARM异常
ARM异常
98 0
|
NoSQL 安全 Linux
ARM深入理解-hypervisor调试方法一(异常寄存器分析)
ARM深入理解-hypervisor调试方法一(异常寄存器分析)
|
存储 人工智能
ARM深入理解-5.2-通往内核的大门(异常向量表_AArch64)
ARM深入理解-5.2-通往内核的大门(异常向量表_AArch64)
|
4月前
|
数据处理 编译器 数据库
x64 和 arm64 处理器架构的区别
x64 和 arm64 处理器架构的区别
|
1月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
|
18天前
ARM64架构提供的Cache操作
ARM64架构提供的Cache操作
|
1月前
|
Ubuntu Windows
ARM架构安装ubuntu系统
8月更文挑战第19天
212 0