linux arm32中断子系统学习总结(一)--- 预备知识

2022/6/26 5:20:30

本文主要是介绍linux arm32中断子系统学习总结(一)--- 预备知识,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、预备知识

  中断处理与cpu体系结构强相关,比如x86处理器与arm处理器对中断的处理方式是不一样的;本文对arm32的中断子系统进行分析,因此首先需要熟悉一些arm32体系结构的知识。

1.1 arm32处理器的运行模式

处理器模式

描述

用户模式(User, usr)

正常程序执行的模式

快速中断模式(FIQ, fiq)

用于高速数据传输和通道处理

外部中断模式(IRQ, irq)

用于通道的中断处理

特权模式(Supervisor, sve)

供操作系统使用的一种保护模式

数据访问中止模式(Abort, abt)

用于虚拟存储及存储保护

未定义指令中止模式(Undefined, und)

用于支持通过软件仿真硬件的协处理器

系统模式(System, sys)

用于运行特权级的操作系统任务

  

  如上表所示,ARM32处理器共有7种运行模式,除用户模式外,其他6种称为特权模式,在特权模式下,程序可以访问所有的系统资源,也可以任意进行处理器模式切换(在用户模式下,无法进行模式切换)。其中,除系统模式外,其他5种特权模式又称为异常模式。

       处理器模式可以通过软件修改状态寄存器CPSR进行切换,处理器也可以通过响应外部中断,自动修改CPSR寄存器进行工作模式切换。

1.2 arm32处理器的寄存器

  Arm32处理器每一种运行模式都有一组寄存器,这些寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器以及程序计数器(PC);在所有的寄存器中,有些是各模式共用的物理寄存器,有些是各模式自己拥有的独立的物理寄存器,因此,在进行模式切换的时候,需要对各模式共用的物理寄存器进行上下文保存,以便现场恢复。各模式下的寄存器如下表所示。

用户模式

系统模式

特权模式

中止模式

未定义指令模式

外部中断模式

快速中断模式

R0

R0

R0

R0

R0

R0

R0

R1

R1

R1

R1

R1

R1

R1

R2

R2

R2

R2

R2

R2

R2

R3

R3

R3

R3

R3

R3

R3

R4

R4

R4

R4

R4

R4

R4

R5

R5

R5

R5

R5

R5

R5

R6

R6

R6

R6

R6

R6

R6

R7

R7

R7

R7

R7

R7

R7

R8

R8

R8

R8

R8

R8

R8_fiq

R9

R9

R9

R9

R9

R9

R9_fiq

R10

R10

R10

R10

R10

R10

R10_fiq

R11

R11

R11

R11

R11

R11

R11_fiq

R12

R12

R12

R12

R12

R12

R12_fiq

R13

R13

R13_svc

R13_abt

R13_und

R13_irq

R13_fiq

R14

R14

R14_svc

R14_abt

R14_und

R14_irq

R14_fiq

PC

PC

PC

PC

PC

PC

PC

CPSR

CPSR

CPSR

CPSR

CPSR

CPSR

CPSR

 

 

SPSR_svc

SPSR_abt

SPSR_und

SPSR_irq

SPSR_fiq

  一般,R13作为栈指针SP,R14作为lr,存放当前子程序的返回地址。

1.3 中断控制器GIC

       在arm体系结构中,所有的中断都是统一汇聚到中断控制器GIC,然后,由GIC统一处理分发给各个cpu;这个中断控制器GIC是ARM公司设计的,目前有V1~V4这几个版本,本文分析的是GIC-V2。

1.4 arm32处理器异常中断的处理方法

       Arm32处理异常使用异常向量表的机制。针对arm32体系中的7种异常中断(复位、未定义指令、软件中断、指令预取中止、数据访问中止、外部中断请求以及快速中断请求),在内存中需要创建一张异常向量表(异常向量表的存放地址可以通过CP15协处理器的寄存器指定),表的每一项对应一种异常中断的处理函数;那么,当cpu检测到中断发生时,就会自动将处理器的工作模式切换到该异常模式(比如IRQ中断,处理器会自动将CPSR拷贝到SPSR_IRQ,然后,修改CPSR的相应bit,进入IRQ中断模式),然后将程序计数器PC指向对应的异常向量。

 

参考资料:《ARM体系结构与编程》

 



这篇关于linux arm32中断子系统学习总结(一)--- 预备知识的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程