百科问答小站 logo
百科问答小站 font logo



中断为什么一定要在内核空间处理,如果把中断放到用户态处理可能会产生什么问题? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

放用户空间有两种情况,一种是IDT里直接写一个用户态的地址,另一种只是在用户态放一个任务(进程?线程?)来处理中断事件。

IDT里直接放一个用户态地址行不行?这个不好说,按说Interrupt Gate描述符上是有DPL的:

但这里写一个非0的值行不行,不好判断(但确实没见过有操作系统这么做),我个人理解是不能,如果当前在内核态,发生中断的话,DPL应该不符合跳转规定,然后产生一个异常。

那么剩下的一种就是:启动一个用户态任务来处理中断,抛开安全性不谈,这种方式是可行的。只不过,大部分中断服务程序都需要访问很多内核资源,比如开关中断指令(只能在内核中使用),读写寄存器(MMIO没映射到用户态)等等。

如果放开这些限制,会有一些问题:

比如:如果用户态的任务可以任意开关中断,或者操作硬件寄存器,那么这种操作系统的安全风险会很大,这跟DOS系统没什么区别。如果要堵住安全漏洞,就需要对用户态的任务做非常复杂的权限控制,代码效率会很差。

还有:因为CPU的原因用户态的代码不能直接操作某些硬件资源,那么就需要通过系统调用来支持,那么这些用户态的中断服务程序需要频繁的使用系统调用,比直接在内核里效率要差很多。

中断在用户态的好处也是有的:

中断服务程序崩溃不会波及内核。现在的中断服务程序一旦出了问题,必然是内核崩溃,蓝屏之类的。在用户态的话,中断服务程序可以更方便的重启。

我印象里,有些RTOS就是这么设计的(名字不记得了),好处肯定有,问题也会有很多。所以中断是可以在用户态处理的,只不过有些问题,而主流的桌面操作系统没有选择这样的设计模型。

如果未来CPU能提供更灵活的机制,那么用户态中断服务程序可能会有很多,就像现在用户态驱动程序一样,当然了,安全风险肯定也是有的。




  

相关话题

  操作系统内核态和用户态切换落实到代码层面和运行层面的本质是什么? 
  如果把systemd视作内核的一部分,Linux是混合内核吗? 
  图片为什么都是四边形的? 
  什么是微内核? 
  Linux主机中增加一块内存条后,物理地址如何扩展? 
  Linux 内核的 C 代码风格是怎样的? 
  Linux内核代码大佬们如何观看的? 
  为什么国产操作系统总是基于现有 Linux 内核,而不是从零开始开发一个操作系统? 
  为何linux作为服务器端十年不重启都不卡而安卓用半年就十分卡? 
  Linux内核代码大佬们如何观看的? 

前一个讨论
页表到底是保存在内核空间中还是用户空间中?
下一个讨论
USB有可能整合TCP/IP协议吗?





© 2024-12-23 - tinynew.org. All Rights Reserved.
© 2024-12-23 - tinynew.org. 保留所有权利