真实面经题目 · 原创解析
ARM64 架构下 Linux 中断处理流程是什么,需要保存哪些寄存器?
这题考 ARM64 Linux 中断入口和上下文保存,回答要讲清异常向量、保存 pt_regs、GIC 分发、通用中断层处理和返回恢复。
真实面经题目 · 原创解析
这题考 ARM64 Linux 中断入口和上下文保存,回答要讲清异常向量、保存 pt_regs、GIC 分发、通用中断层处理和返回恢复。
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 寄存器通常不是每次硬中断都全量保存,而由内核上下文规则和惰性策略约束。
中断使 CPU 跳到向量表中的 IRQ 入口。硬件保存最小返回状态到系统寄存器,例如异常返回地址和程序状态,而不是自动保存所有通用寄存器。
Linux 的异常入口代码会把通用寄存器保存到当前内核栈,构造 pt_regs。这样 C 层中断处理可以安全使用寄存器,返回时再恢复。
ARM64 系统常用 GIC。内核从 GIC 获取 pending interrupt ID,通过 irq_domain 转成 Linux IRQ,找到对应 irq_desc 和 action。
顶半部应尽量短,确认硬件、清中断源或唤醒线程;耗时、可能睡眠的工作放到 threaded handler、tasklet/workqueue 等下半部机制。
irq_exit 后内核可能处理软中断、检查 need_resched。如果唤醒了更高优先级任务,返回用户态或内核态前可能发生调度。
通常不会全量自动保存,硬件保存异常返回所需的系统寄存器,通用寄存器由入口汇编保存到栈上。
内核对浮点/SIMD 上下文有严格保存恢复规则,硬中断中使用可能破坏任务上下文或带来高昂保存成本。
我会先看 dmesg 和返回码,再查 /sys 下设备、驱动和资源状态,必要时加 trace/ftrace 或最小日志,先证明问题出在设备生成、匹配、资源获取、回调路径还是用户态交互。