4.4.5 timer中断流向Linux(从interrupt log回放)

4.4.5 timer中断流向Linux(从interrupt log回放)

按上文所述,timer中断3已经记录到root domain的interrupt log。在《3.4.1.3 IPIPE interrupt log数据结构》中,已经讨论过interrupt log的记录与回放。本小结,讨论什么时机来回放interrupt log中的timer中断3。

从interrupt log中查询出未处理的中断,进行处理,为方便描述简称interrupt log回放。核心函数就是__ipipe_next_irq,它是__ipipe_set_irq_pending的反向操作。从下图的函数调用关系可知,IPIPE总是通过调用__ipipe_sync_stage来完成interrupt log回放。

第一,dispatch_irq_head中进行回放

当dispatch_irq_head中执行head domain已经注册的中断处理程序head->irqs[3].handler(即xnintr_core_clock_handler)返回后,有一个地方会回放root domain的interrupt log。

static void dispatch_irq_head(unsigned int irq) /* hw interrupts off */
{
   ............

    // 调用对应的中断处理程序
    head->irqs[irq].handler(irq, head->irqs[irq].cookie);

............

    // 重新获取当前CPU的头域上下文
    p = ipipe_this_cpu_head_context();
    __clear_bit(IPIPE_STALL_FLAG, &p->status); // 清除IPIPE_STALL_FLAG标志位

    // 检查是否仍然在头域中运行
    if (likely(__ipipe_current_context == p)) {
        // 检查是否是从头域进入的代码
        if (old->domain == head) {
            // 是的,进行立即同步
            if (__ipipe_ipending_p(p))
                __ipipe_sync_stage();
            return;
        }
        // 切换回根域上下文
        __ipipe_set_current_context(ipipe_this_cpu_root_context());
    }

    /*
     * 此时我们一定是在根域中运行,在根域
     * 回放高优先级中断(慢路径)。
     */
    __ipipe_do_sync_pipeline(head);
}

在dispatch_irq_head,如果检测到当前的上下文已经是root domain,说明没有Xenomai实时任务需要调度,此时会调用__ipipe_do_sync_pipeline。经过层层调用,

__ipipe_do_sync_pipeline->__ipipe_sync_stage->__ipipe_do_sync_stage最终会执行root domain的irqs[3].handler,即之前注册的__ipipe_do_IRQ!

走到了__ipipe_do_IRQ之后,会回归到Linux中断子系统,调用__handle_domain_irq,顺着Linux的中断处理流程,最终回到Linux中virq 3对应的中断处理程序arch_timer_handler_virt!

第二,其它情况下进行回放

有很多地方都会进行root domain的中断 3的回放,这里只是贴一下图,暂时不分析。以后分析进程调度的时候,再做详细分析。

对4.4章做一个小结:

timer中断是一个特殊的中断,必须在head domain/Xenomai和root domain/Linux中执行,所以中断发生后,会经过一个巧妙和复杂的过程,完成中断的流动。

相关推荐
工业通讯探索者3 分钟前
信捷PLC转以太网连接电脑方法
linux·服务器·网络
嚯——哈哈5 分钟前
DDoS高防服务器:保障业务安全和稳定的抗攻击利器
服务器·安全·ddos
无限码农8 分钟前
ubuntu安装cuda、cudnn和TensoRT【分步安装】
linux·运维·ubuntu
活老鬼10 分钟前
Ceph分布式存储
linux·运维·服务器·分布式·ceph
啊森要自信31 分钟前
【linux学习指南】VSCode部署Ubantu云服务器,与Xshell进行本地通信文件编写
linux·服务器·ide·vscode·ubuntu
ubuntu180432 分钟前
linux001.在Oracle VM VirtualBox中ubuntu虚拟系统扩容
linux·运维·ubuntu
最后一个bug34 分钟前
分享一些关于 C 函数与 lua 交互的实际项目案例
linux·c语言·嵌入式硬件·lua
皓月盈江36 分钟前
Linux debian系统安装ClamTk开源图形用户界面(GUI)杀毒软件
linux·运维·debian·clamav·clamtk·开源杀毒
ladymorgana39 分钟前
【Nginx从入门到精通】01 、教程简介
运维·nginx
奈斯ing1 小时前
【Oracle篇】掌握SQL Tuning Advisor优化工具:从工具使用到SQL优化的全方位指南(第六篇,总共七篇)
运维·数据库·sql·oracle