1.2 I-pipe基本概念

Interrupt Pipeline系列文章大纲-CSDN博客

本章节目前仅来自对ipipe.rst的理解,不代表对代码的解读。

1.2.1 两段式中断流水线Two-stage IRQ pipeline

1.2.1.1 流水线

       中断在流水线中的传递与处理分为2段:Head Stage和Root Stage。

        Head Stage运行在实时内核Cobalt域,即运行在head domain(头域)。在Head Stage中运行的代码,被称为Out-of-band代码。后面基本上用Cobalt来替换实时内核的概念。

        Root Stage运行在Linux域,即运行在root domain(根域)。在Root Stage中运行的代码,被称为In-band代码。

       Head Stage是一个独立的高优先级执行阶段,一旦收到中断,立刻调用out-of-band中断处理程序,丝毫不会被Root Stage中的In-band代码影响。只有当Head Stage让出CPU时,Root stage的In-band中断处理程序才得以执行并处理推迟传递过来的中断。总而言之,中断是从Head Stage流向Root Stage,这两个阶段形成了一个基于优先级进行中断传递的两级流水线。

       Cobalt在头域中,拦截并响应中断,为应用程序提供实时能力。同时,Linux在根域中正常运行,仅仅是延迟处理了中断。

1.2.1.2 虚拟中断标志Virtual interrupt flag

       为了保证头域中的out-of-band代码的实时性,根域中的in-band代码一定不能关闭CPU的物理中断。既要保证头域中的out-of-band中断处理程序随时响应物理中断,又要保证根域中的in-band中断处理程序仅仅在根域能接收中断时执行。

       所以,需要实现一个双重中断控制机制,对物理中断的屏蔽和物理中断的传递进行解耦。为了实现这一目标,引入了虚拟中断标志(也称为IPIPE_STALL_FLAG)。从头域的角度来看,管理和使用CPU的物理中断标志(中断状态寄存器)。从根域的角度来看,管理和使用虚拟中断标志。关闭了虚拟中断标志,代表了根域不能响应中断;打开虚拟中断标志,代表了根域可以响应中断。

       关闭物理中断标志或虚拟中断标志,也称为stall操作(对中断标志位进行置位);相反,打开操作被称为unstall操作(对中断标志位进行清零)。

        当根域中的Linux调用local_irq_save/local_irq_disable/spin_lock_irqsave等函数关闭中断时,实际上是对虚拟中断标志进行关闭操作,并没有真正的关闭物理中断标志。此时,头域中的Cobalt依然能够接收物理中断,保证实时性。

       如果头域中的Cobalt关闭了物理中断标志,那意味着头域和根域都无法接收到中断。

      

1.2.1.3 中断的延迟执行

       当根域的虚拟中断标志处于关闭状态,从头域传递过来的中断会被记录到per-CPU log中。直到根域调用local_irq_enable等函数打开了虚拟中断标志,才会对per-CPU log进行回放,执行对应的in-band中断处理程序。

       当根域的虚拟中断标志处于打开状态,从头域传递过来的中断可以立即被in-band中断处理程序处理。(这句是从ipipe.rst翻译过来的,目前对这个结论存疑。即使虚拟中断标志处于打开状态,从头域传递过来的中断是不是也应该进入per-CPU log进行排队?)

1.2.2 交替调度Alternate scheduling

        I-pipe倡导的理念是,采用“双内核”系统时,应确保Linux内核与Cobalt内核之间的功能重叠保持最小。为了实现这一目标,Cobalt实时线程应仅仅被视为一个具有额外调度能力的Linux任务。

        为了达成这个理念,I-pipe允许内核线程和用户线程在out-of-band执行上下文(即头域)和in-band执行上下文(即根域)中交替运行。由Cobalt内核来负责线程在不同的执行上下文中切换,而I-pipe提供了专门的服务来助力Cobalt内核完成线程切换。

        对于Linux内核线程或用户线程,可以在out-of-band执行上下文中等待需要低延迟处理的事件。

        对于Cobalt线程,有可能需要离开out-of-band上下文,在in-band上下文中执行。例如调用Linix内核负责的系统调用,处理某些CPU异常等。

        Cobalt应该至少实现一个机制:把一个Linux任务转化成一个具备扩展能力的Cobalt实时线程,并绑定在Cobalt上运行。绑定操作一般是由Linux任务调用Cobalt专有的系统调用来完成的。

        对某个任务来说,Cobalt应该具备从Linux接收与此任务相关的通知的能力。通过调用ipipe_enable_notifier来告知Linux具体监听任务的哪个事件。

1.2.3 系统调用

       Cobalt(实时内核)通过I-pipe与Linux内核交互,会引入Cobalt专有的一组系统调用。从Linux内核的角度看,这是一组外来的系统调用,明显区别于原来的系统调用。

       当一个绑定在Cobalt的任务执行了任何的系统调用,如果是Cobalt系统调用,则在out-of-band上下文中进行处理;如果是Linux系统调用,则在in-band上下文中进行处理。

       如果一个Linux任务调用了Cobalt系统调用,Cobalt确实应该允许这种调用。一般来说,这种系统调用就是把Linux任务绑定到Cobalt。

点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客

原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值