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->irqs3.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的irqs3.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中执行,所以中断发生后,会经过一个巧妙和复杂的过程,完成中断的流动。

相关推荐
hoaxxcj11 小时前
多智能体把云可靠性工程自动化:NeurIPS 2025 的 STRATUS 比 SOTA 强 1.5 倍,还顺手定了条“安全规范“
运维·安全·自动化·大模型·ai论文·前沿解读
运维大师11 小时前
【K8S 运维实战】39-etcd脑裂故障复盘
运维·kubernetes·etcd
wsad053211 小时前
CentOS Stream 10 配置静态 IP 完整指南
linux·tcp/ip·centos
Ai拆代码的曹操11 小时前
K8s 实战:CrashLoopBackOff 状态下 kubectl logs 拿不到日志的三层排查方案
linux·docker·kubernetes
tedcloud12312 小时前
Kimi-K3 部署指南:大模型应用开发环境搭建实践
linux·运维·服务器·开源·音视频
深念Y12 小时前
ZTE_UZ901_NVRAM经验总结
linux·服务器·网络·嵌入式硬件·嵌入式·随身wifi
大模型丫丫12 小时前
GitHub Actions 自动化运维实战:从 CI/CD 到云端部署
运维·自动化·github
似水এ᭄往昔12 小时前
【Linux网络编程】--TCP_Socket
linux·网络·tcp/ip
wuminyu12 小时前
JUC包的AQS与JVM的ObjectMonitor机制对比分析
java·linux·c语言·jvm·c++
山海鲸可视化13 小时前
数字孪生技术:创新性破解城市高温难题
大数据·运维·数字孪生·数据可视化·可视化大屏