60 秒回答模板

ARM64 下外设中断到来时,CPU 从当前异常级切到内核异常入口,硬件把返回地址和状态放到 ELR_EL1、SPSR_EL1,并根据向量表进入对应的 IRQ entry。入口汇编会在内核栈上保存通用寄存器现场,形成 pt_regs,通常包括 x0-x30、sp、pc、pstate 等必要上下文,同时屏蔽或标记中断状态。随后进入 Linux 通用中断流程:irq_enter,和 GIC 交互读取中断号,找到 irq_domain 映射和 irq_desc,调用 handle_irq_event 执行注册的 handler;若是 threaded irq,则唤醒中断线程做耗时工作。处理结束后 EOI,irq_exit,检查是否需要调度,然后从 pt_regs 恢复寄存器,用 eret 返回被打断的位置。浮点/SIMD 寄存器通常不是每次硬中断都全量保存,而由内核上下文规则和惰性策略约束。

考点 入口路径
难度 真实面经题
回答目标 证明自己理解 ARM64 中断从硬件异常入口到 Linux 通用中断层的完整路径。

深入解析

01

硬件先进入异常向量

中断使 CPU 跳到向量表中的 IRQ 入口。硬件保存最小返回状态到系统寄存器,例如异常返回地址和程序状态,而不是自动保存所有通用寄存器。

02

入口汇编保存通用现场

Linux 的异常入口代码会把通用寄存器保存到当前内核栈,构造 pt_regs。这样 C 层中断处理可以安全使用寄存器,返回时再恢复。

03

中断控制器负责分发编号

ARM64 系统常用 GIC。内核从 GIC 获取 pending interrupt ID,通过 irq_domain 转成 Linux IRQ,找到对应 irq_desc 和 action。

04

通用中断层执行 handler

顶半部应尽量短,确认硬件、清中断源或唤醒线程;耗时、可能睡眠的工作放到 threaded handler、tasklet/workqueue 等下半部机制。

05

返回前可能触发调度

irq_exit 后内核可能处理软中断、检查 need_resched。如果唤醒了更高优先级任务,返回用户态或内核态前可能发生调度。

易错点

  • 说硬件自动保存所有寄存器,不区分系统寄存器和入口汇编保存。
  • 只讲驱动 handler,不讲异常向量和中断控制器分发。
  • 在顶半部做可能睡眠的慢操作。
  • 忽略 irq_exit 后可能处理软中断和调度。

面试官追问

硬件会自动保存 x0-x30 吗?

通常不会全量自动保存,硬件保存异常返回所需的系统寄存器,通用寄存器由入口汇编保存到栈上。

为什么中断里不能随便用浮点/SIMD?

内核对浮点/SIMD 上下文有严格保存恢复规则,硬中断中使用可能破坏任务上下文或带来高昂保存成本。

如果面试官让你现场排查,你会先看哪些证据?

我会先看 dmesg 和返回码,再查 /sys 下设备、驱动和资源状态,必要时加 trace/ftrace 或最小日志,先证明问题出在设备生成、匹配、资源获取、回调路径还是用户态交互。