看代码不如看系统状态

简介: 今天同事问我, linux的中断可以嵌套吗? 我说我也不知道啊, 印象中是cpu是可以中断嵌套的, 但是linux关掉了, 所以linux是不允许中断嵌套的, 如何证明, 找代码, 突然跳到另一个领域, 哪有这么快能找到, 看代码不如看系统 直接开个vm, 把状态停到中断函数里面, 比如do_timer ``` Breakpoint 1, do_timer (ticks=1) at k

今天同事问我, 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

目录
相关文章
你的应用进入了中断状态,但无任何代码显示,因为所有线程之前都在执行外部代码
你的应用进入了中断状态,但无任何代码显示,因为所有线程之前都在执行外部代码
2478 0
你的应用进入了中断状态,但无任何代码显示,因为所有线程之前都在执行外部代码
|
8月前
Vue3新增的两个生命周期分析解释【onRenderTracked()状态跟踪和onRenderTriggered() 状态触发】
Vue3新增的两个生命周期分析解释【onRenderTracked()状态跟踪和onRenderTriggered() 状态触发】
|
弹性计算 监控 大数据
集群状态显示,进程存在,但是组件状态显示未知
集群状态显示,进程存在,但是组件状态显示未知
|
前端开发 开发者
介绍有状态组件和无状态组件的区别|学习笔记
快速学习介绍有状态组件和无状态组件的区别
139 0
|
Java 程序员 调度
线程的创建方式,状态周期管理
进程是计算机中的程序,关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
105 0
线程的创建方式,状态周期管理
|
前端开发
前端工作小结79-重置逻辑
前端工作小结79-重置逻辑
60 0
|
前端开发
前端工作小结93-重置逻辑
前端工作小结93-重置逻辑
53 0
datagruad 日常状态检查
datagruad 日常状态检查
176 0
|
前端开发
介绍有状态组件和无状态组件的区别
介绍有状态组件和无状态组件的区别