今天同事问我, linux的中断可以嵌套吗?
我说我也不知道啊, 印象中是cpu是可以中断嵌套的, 但是linux关掉了, 所以linux是不允许中断嵌套的, 如何证明, 找代码, 突然跳到另一个领域, 哪有这么快能找到, 看代码不如看系统
直接开个vm, 把状态停到中断函数里面, 比如do_timer
Breakpoint 1, do_timer (ticks=1) at kernel/time/timekeeping.c:1604
1604 {
(gdb) bt
#0 do_timer (ticks=1) at kernel/time/timekeeping.c:1604
#1 0xffffffff810da0bf in tick_do_update_jiffies64 (now=..., now@entry=...) at kernel/time/tick-sched.c:83
#2 0xffffffff810da191 in tick_sched_do_timer (now=now@entry=...) at kernel/time/tick-sched.c:131
#3 0xffffffff810da6e3 in tick_sched_timer (timer=timer@entry=0xffff88003fd0df40) at kernel/time/tick-sched.c:1047
#4 0xffffffff810a18e5 in __run_hrtimer (cpu_base=cpu_base@entry=0xffff88003fd0d920, base=base@entry=0xffff88003fd0d960, timer=0xffff88003fd0df40, now=now@entry=0xffff88003fd03ee0) at kernel/hrtimer.c:1218
#5 0xffffffff810a1a00 in __hrtimer_run_queues (cpu_base=cpu_base@entry=0xffff88003fd0d920, now=..., now@entry=...) at kernel/hrtimer.c:1272
#6 0xffffffff810a1dc9 in hrtimer_interrupt (dev=<optimized out>) at kernel/hrtimer.c:1306
#7 0xffffffff81048cdb in local_apic_timer_interrupt () at arch/x86/kernel/apic/apic.c:917
#8 0xffffffff81606d05 in smp_apic_timer_interrupt (regs=<optimized out>) at arch/x86/kernel/apic/apic.c:941
#9 <signal handler called>
#10 0xffffffffffffff10 in ?? ()
Cannot access memory at address 0x297
(gdb) info registers
rax 0x15fe 5630
rbx 0xf583e 1005630
rcx 0xf4240 1000000
rdx 0xffffffff81927184 -2121109116
rsi 0x148a8f680 5514000000
rdi 0x1 1
rbp 0xffff88003fd03e48 0xffff88003fd03e48
rsp 0xffff88003fd03e38 0xffff88003fd03e38
r8 0x6 6
r9 0x2 2
r10 0x4b6 1206
r11 0x7 7
r12 0x148a90c7e 5514005630
r13 0xffff880035fcbba8 -131940489577560
r14 0xffff88003fd0d920 -131940324681440
r15 0xffff88003fd0d960 -131940324681376
rip 0xffffffff810d3a1f 0xffffffff810d3a1f <do_timer>
eflags 0x2 [ ]
cs 0x10 16
ss 0x18 24
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
eflags 0x2 [ ] 中断没开, 可以再换个函数看一下, 看了一圈, 基本都没开, 可以认为中断是不能嵌套的
其实是真的不能嵌套的
https://github.com/torvalds/linux/commit/e58aa3d2d0cc01ad8d6f7f640a0670433f794922