当前位置: 首页 > Linux

【笨叔比特10】中断到“底”了吗?

时间:2023-04-06 20:41:35 Linux

》我曾经在想为什么我一个小散户可以控制整个股市?不管之前的涨势有多疯狂,我买它肯定会跌!我会涨卖出吧。我做空的市场暴涨,我的仓位全亏了。手上有数百亿资金的做市商都盯着我手上的几万,这是为什么呢?A股搞不懂,但是在电脑里,中断和进程也是一头雾水?比如微信群里讨论一个问题:在非抢占式Linux内核中,为什么中断在中断时不被抢占发生在内核态?这个问题很明显是中断和进程之间那些不明确的东西。为什么linux2.4内核没有实现中断抢占?其实大家是站在现在linux4的角度来看老版本内核的.xkernel你要知道LInux内核也是90年代诞生的,1991年诞生,到现在才27岁,关于中断和进程之间的东西,我觉得下面的问题很有意思。中断发生,ARM处理器到底为你做了什么?【可以看《奔跑吧Linux内核》第618~625页】如果中断发生在内核态,它的中断上下文存放在哪里?需要保存哪些寄存器?或者那个那些寄存器是主角,那些寄存器实际上是配角?【参考625页图片】对于这个问题,大家需要搞清楚IRQ栈和SVC栈中存储的是什么。那些寄存器是必须的,就是主角,没有它就不行。那些寄存器实际上是在玩把戏,所以它没有伤害。3、如果中断发生在用户空间,中断处理完成后如何返回用户空间?【这道题可以去汇编,这个__irq_usr汇编函数在《奔跑吧》中没有详细分析,这个函数并不复杂,大家可以自己看】假设时钟的滴答中断来了,发生了在用户空间,硬件中断完成后,现在需要调度检查,然后调度下一个进程运行。假设下一个进程也是用户进程,那么下一个进程从哪里开始执行呢?【这道题其实很有意思,假设A的用户进程在B的地方中断了,然后又发生了调度。那么如果过了一段时间,A进程又被调度回来,是不是从B开始执行呢?想弄清楚这个问题,可以看看《奔跑吧linux内核》第369~374页的描述,或者参考这张图。其实重点在switch_to函数的实现和理解】。switch_to()函数如果简单概括,两条语句其实就够了。如下:cpu_switch_to:stmiar0!,{r4-sl,fp,sp,lr}@storeregsonstackldmiar1,{r4-sl,fp,sp,pc}@loadallregssavedpreviouslyassumethatr0pointstheprev进程的cpu_context数据结构,r1指向下一个cpu_context数据结构。第一次编译将上一个进程的sp和lr寄存器保存到r0指向的cpu_context中,然后将下一个进程的cpu_context中的sp和lr寄存器加载到CPU硬件的寄存器中,这样就简单完成了进程上下文交换。切换完成后,下一个进程从ldmia指令的下一条指令开始运行,真的,真的开始运行了。..小明狐疑地说:笨叔叔,你的鬼话我怎么验证呢?笨叔叔:其实很简单。您可以使用笨叔叔的“O0”内核进行单步调试。可以在switch_to函数中设置断点,然后观察prev和next进程的cpu_context中的lr设置了什么值,小明:嘿嘿,好方法,我试试笨叔叔:在同时可以把prev和next的sp栈打印出来看看。在copy_thread()函数中,第一次创建进程时在cpu_context中安装了什么葫芦。估计有小伙伴对pt_regs和cpu_context这两个数据结构搞混了。其实,如果理解了这两种数据结构的用途和用途,上述问题就不是问题了。pt_regs是当前进程中断或异常或发生系统调用时保存CPU的上下文,它驻留在进程内核栈的顶部。而cpu_context算是PCB的核心保存成员,什么是PCB?不是电路板,而是工艺核心控制块。cpu_context只是用来保存进程切换时的CPU状态。其实SP和LR都有用,而且是主角。笨叔叔今天废话不少,呵呵。笨叔弱弱的问,我的停牌来了,A股还有“底”吗?欢迎小伙伴们在评论区留言,“底”来了吗?最后,大家记得关注奔叔叔的书和配套视频,,奔叔叔出品,奔奔的味道,总有你想要的!