加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Linux内核达成中断和中断处理

发布时间:2021-11-18 18:14:23 所属栏目:教程 来源:互联网
导读:Linux实现中断处理 内核是怎么知道应用程序要调用系统调用的呢?或者说应用程序怎么通知系统内核自己需要执行一个系统调用,这是通过软中断实现的,通过引发一个异常来促使系统切换到内核态去执行异常处理程序 PS:什么时候会从用户态切换到内核态呢?1.中断
Linux实现中断处理
 
内核是怎么知道应用程序要调用系统调用的呢?或者说应用程序怎么通知系统内核自己需要执行一个系统调用,这是通过软中断实现的,通过引发一个异常来促使系统切换到内核态去执行异常处理程序
 
PS:什么时候会从用户态切换到内核态呢?1.中断;2.陷阱;3.系统调用
 
 
 
中断分为两种,硬中断和软中断;
 
在许多处理器体系结构处理异常和处理中断的方式类似,为了助于理解,可以把异常想象成软中断,我们通常说的中断是硬中断,硬中断是由硬件引起而不是软件引起的
 
每一种中断都有一个对应的中断处理程序,如果一种中断设备可以产生多种中断,那这个中断设备就有多个中断处理程序对应,而一个中断处理程序就是该设备对应的设备驱动程序中的一部分
 
我们想让中断处理程序运行的快,还想让中断处理程序多干活,显然是有冲突的,所以我们把中断程序分为两个部分,中断处理程序是上半部分,能够被允许稍后完成的工作会推迟到下半部去(注意!在执行中断上半部分的时候,是不允许产生其他中断的,所以设置标志位IRQF_DISABLED )
 
举个栗子:拿我们可爱的网卡来说事情吧,例如网卡从网上收集了很多数据包,于是我们的朋友网卡君就通知内核,嘿,我这来了一批新货,要看看么,于是内核屁颠屁颠的去处理了(调用中断处理程序)中断开始执行,通知硬件开始拷贝数据(从网卡到内存),这件事是很紧迫的,因为网卡有一定的缓存,超过缓存这家伙就不干活了(丢弃数据包),为了压榨网卡(让他好好干活),内核必须尽快处理这件事情,而且这件事情是硬件相关的(就是和网卡脱不了干系),没了网卡干不了,不能延后,拷贝完这些数据包之后的事情就可以放到下部分了,于是内核忙完了,又去处理刚才被中断的进程了
 
中断处理程序标志
IRQF_DISABLED——在执行当前中断处理程序的时候,禁止所有其他的中断(野蛮!!尽量给想要尽快运行的轻量级中断使用)
 
IRQF_SAMPLE_RANDOM——表明这个设备的中断对内核熵池有贡献
 
  PS:内核熵池负责提供从各种随机事件导出真正的随机数,就是说中断啥时候来(随机的),有个中断产生速率(自然也随机了),就拿去扔池      子里产生随机数用了。。。和中断关系似乎不是很大
 
IRQF_TIMER——专门为系统定时器的中断处理而准备的
 
IRQF_SHARED——共享中断线,中断线可以理解为中断单独对着的一个号,同时一个号可以对应多个终端
 
中断和锁之间不得不说的那些事儿
这里简单的把锁分为两类,自旋锁和睡眠锁(当然对应着很多具体的锁),分为两类是因为,自旋锁是可以用于中断(争用该锁会导致忙循环)的,但是拥有睡眠性质的锁是不能用于中断(争用该锁会导致睡眠),只能用于进程。我们之前说了,中断处理程序的上半部分是很紧迫的,这么紧迫的事情你怎么可以去睡眠偷懒呢?!哪怕现在轮不到你,你也得给我等着!
 
为什么不能让中断睡眠?因为睡眠是为了进程调度存在的,但是中断处理程序一旦睡眠不仅没有时间可以唤醒中断处理程序,而且无法调度,因为进程有个进程号,但是中断没有,一旦当前的中断处理睡眠了,没有其他的东西会获得处理器,而且中断处理永远不会被唤醒,那么系统就会瘫痪

(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读