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



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

  

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

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

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

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

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

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

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

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

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

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

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

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




  

相关话题

  linux内核切换成分页模式后,ljmp $__BOOT_CS,$1f 这行代码有什么意思? 
  linux内核切换成分页模式后,ljmp $__BOOT_CS,$1f 这行代码有什么意思? 
  为什么汇编语言的功能在高级语言中一部分成为了关键字,一部分封装成了函数? 
  电脑关机后网卡还会工作吗? 
  如果在内核把特权级切换到用户态之前屏蔽 CPU 对软中断的响应,是不是就再也进不了内核态了? 
  学习Linux有没有比《鸟哥的Linux私房菜》更好的书? 
  假如Deepin把linux内核最内部部分代码在不改变架构逻辑设计前提下重写了,能算纯国产系统吗? 
  linux内核切换成分页模式后,ljmp $__BOOT_CS,$1f 这行代码有什么意思? 
  如何评价 6 月 2 日凌晨开源的 OpenHarmony 2.0 Canary? 
  Linux内核代码算屎山吗? 

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





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利