用户态中断在KAKAOS上的实现

4 篇文章 0 订阅
2 篇文章 0 订阅

之前linux内核社区提出来用户态中断的概念,详见 链接 ,主要功能如下:

如果该进程正在用户空间中运行,那么 handler 函数将会被立即调用,并取得相应的 vector 编号。一旦 handler处理程序返回了,那么就会在之前被中断的位置继续执行。如果接收者此时被阻塞在内核的系统调用中,那么该中断将会在返回到用户空间时被触发,也就是说并不会打断当前正在进行的系统调用。

嗯,按照我的理解来说,就是一个用户态进程运行的好好的,如果系统中其他进程或者内核认为这个用户态进程需要紧急响应某个事情,就向这个进程发一个“中断”,那么这个进程就会停下来去响应中断,执行响应的中断处理函数。
这个说白了就是用软件方法模拟中断信号,打断用户态进程的正常执行,当中断处理完成后再恢复执行。

linux对于外设的硬件中断,都是在内核态完成处理的。而用户态也有“信号”这种异步通信机制,然而信号并不能直接打断用户态进程,系统中只有几个特定的时机会检查是否有信号处理,因而通过信号机制做通信是存在延迟的。用户态中断弥补的就是这个缺陷。

虽然没看过这个特性在内核里是怎么实现的,但是想了一下,在KAKAOS上实现一下应该不会很复杂,毕竟是单核的cpu,那就实现一下试一下。
实现代码如下:
https://github.com/kaka555/KAKAOS-MINI-LINUX/commit/906ce2280261242bcbc582c316fb871226ba089a
实现方法很简单,在task_struct里面增加一个成员变量user_interrupt_fun fun,固定在task_struct成员的第二位,初始化的时候设置为NULL,当别的进程调用用户态中断注册函数user_interrupt_register是时候,对fun进行赋值,并在需要注入中断的进程的栈中新建一个为用户态中断准备的临时上下文,当该进程被调用的时候,上下文会跳转到中断处理函数,中断处理函数完成后,会销毁这个临时的上下文,并恢复到原先的执行流程上继续执行。
代码不长,就不拿出来抠细节了。

这个方案只不支持进程自己对自己注入中断,因为我理解如果进程知道自己现在需要响应中断,直接调用中断处理函数即可。
另外,由于目前实现的cpu是单核的,所需要考虑的情况就没有那么复杂。如果CPU是多核的,我想可以这么实现:如果被注入中断的进程没有在运行,那么完全可以按照单核的方案实现,如果被注入中断的进程在另一个核运行,那么需要发个IPI中断过去,此时被中断的进程状态相当于也是被挂起的(非running,上下文都被保存了),然后在IPI里继续按照单核类似的方法构造临时上下文即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值