聊聊如何从复杂中断简单化

商务办公
arm64的异常向量表vectors中设置了各种异常的入口,目前有效的异常入口有两个同步异常el0_sync,el1_sync和两个异步异常el0_irq,el1_irq,其他异常入口暂时都invalid。中断属于异步异常,所以本文重点关注el0_irq和el1_irq。

 [[386223]]

本文转载自微信公众号「人人都是极客」,作者布道师Peter。转载本文请联系人人都是极客公众号。

中断处理流程

arm64的异常向量表vectors中设置了各种异常的入口,目前有效的异常入口有两个同步异常el0_sync,el1_sync和两个异步异常el0_irq,el1_irq,其他异常入口暂时都invalid。中断属于异步异常,所以本文重点关注el0_irq和el1_irq。

通过上图,我们可以看出中断的处理分为三个部分,保护现场,中断处理,恢复现场。其中el0_irq和el1_irq的具体实现略有不同,但处理流程大致是相同的。接下来我们以el0_irq为例对上面三个步骤进行梳理。

保护现场

将CPU寄存器按照pt_regs结构体的定义将第一现场保存到栈上。

  1. 保存PSTATE到SPSR_ELx寄存器;
  2. 将PSTATE中的D A I F全部屏蔽;
  3. 保存PC寄存器的值到ELR_ELx寄存器;

中断处理

如上图,大概主要有如下三个动作:

  1. 进入中断栈;
  2. 执行中断控制器的handle_arch_irq;
  3. 退出中断栈;

在处理之前我们先看下什么叫做中断栈。

中断栈

中断栈用来保存中断的上下文。

中断栈的创建:内核启动时中会去为每个cpu创建一个per cpu的中断栈:start_kernel->init_IRQ->init_irq_stacks

中断栈的使用:中断发生和退出的时候调用irq_stack_entry和irq_stack_exit来进入和退出中断栈。

恢复现场

主要分三步:

  1. disable中断;
  2. 检查在退出中断前有没有需要处理事情,如调度、信号处理等。
  3. 将之前压栈的pt_regs弹出,恢复现场。

 

责任编辑:武晓燕 来源: 人人都是极客
相关推荐

2010-12-08 11:33:21

面试

2009-12-10 16:56:39

Ruby on RaiDHH

2010-03-12 19:17:43

Python程序

2015-05-19 17:37:47

移动办公苹果filemaker

2017-05-10 10:57:14

互联网

2011-03-15 10:44:40

2022-11-01 12:16:47

Nginx微服务编译

2012-11-12 14:44:50

F100H3C防火墙

2021-12-11 19:00:54

Java中断机制

2020-12-09 08:50:55

web组件开发

2022-05-09 08:17:37

InstantJava字符

2022-03-17 08:54:59

软件系统重构

2010-03-22 14:42:08

Python包管理

2021-02-05 08:41:44

STM32网络中断

2024-03-19 08:15:09

云原生云计算容器

2023-11-29 08:26:38

2022-07-21 08:43:01

功能测试测试

2021-08-06 22:43:54

中断架构传递

2019-01-07 08:10:54

微服务单体 Web

2015-09-18 09:23:34

云APIAPI升级云服务中断
点赞
收藏

51CTO技术栈公众号