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)

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

相关文章
|
4月前
|
Linux 网络安全 开发工具
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
本文介绍了如何基于Linux Kernel 5.15.102版本和BusyBox创建一个自定义的迷你Linux ARM系统,并使用QEMU进行启动和调试,包括内核和BusyBox的编译配置、根文件系统的制作以及运行QEMU时的命令和参数设置。
367 0
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
|
3月前
|
Go 开发工具 git
在Qemu+ARM上运行Minix3内核
在Qemu+ARM上运行Minix3内核
|
7月前
|
NoSQL Linux 开发工具
百度搜索:蓝易云【VSCode+GDB+Qemu调试ARM64 linux内核教程。】
请注意,根据你的具体环境和需求,上述步骤可能会有所调整和修改。建议参考相关文档和资源,以获得更详细的配置和调试指南。
102 0
|
传感器 资源调度 安全
ARM异常
ARM异常
111 0
|
NoSQL 安全 Linux
ARM深入理解-hypervisor调试方法一(异常寄存器分析)
ARM深入理解-hypervisor调试方法一(异常寄存器分析)
|
存储 人工智能
ARM深入理解-5.2-通往内核的大门(异常向量表_AArch64)
ARM深入理解-5.2-通往内核的大门(异常向量表_AArch64)
|
23天前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器架构有啥区别?X86计算、Arm、GPU异构、裸金属和高性能计算对比
阿里云ECS涵盖x86、ARM、GPU/FPGA/ASIC、弹性裸金属及高性能计算等多种架构。x86架构采用Intel/AMD处理器,适用于广泛企业级应用;ARM架构低功耗,适合容器与微服务;GPU/FPGA/ASIC专为AI、图形处理设计;弹性裸金属提供物理机性能;高性能计算则针对大规模并行计算优化。
|
2月前
|
编解码 弹性计算 应用服务中间件
阿里云服务器Arm计算架构解析:Arm计算架构云服务器租用收费标准价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将深入解析阿里云Arm计算架构云服务器的技术特点、适用场景以及包年包月与按量付费的收费标准与最新活动价格情况,以供选择参考。
|
2月前
|
机器学习/深度学习 弹性计算 编解码
阿里云服务器计算架构X86/ARM/GPU/FPGA/ASIC/裸金属/超级计算集群有啥区别?
阿里云服务器ECS提供了多种计算架构,包括X86、ARM、GPU/FPGA/ASIC、弹性裸金属服务器及超级计算集群。X86架构常见且通用,适合大多数应用场景;ARM架构具备低功耗优势,适用于长期运行环境;GPU/FPGA/ASIC则针对深度学习、科学计算、视频处理等高性能需求;弹性裸金属服务器与超级计算集群则分别提供物理机级别的性能和高速RDMA互联,满足高性能计算和大规模训练需求。
|
2月前
|
存储 Docker 容器
ARM架构鲲鹏主机BClinux离线安装docker步骤
下载并安装适用于ARM架构的Docker CE二进制文件,解压后移动至/usr/bin目录。创建docker组,配置systemd服务脚本(docker.service、docker.socket、containerd.service),重载systemd配置,启动并启用docker服务。编辑daemon.json配置存储驱动、镜像加速地址等,最后拉取所需镜像。
67 0