Xenomai3基于X86的ipipe机制是如何简述的?

摘要:Xenomai是一个基于linux的硬实时操作系统(RTOS),在标准linux基础上添加一个实时内核Cobalt,与linux内核在内核空间共存,为了使Xenomai能够保持可预测的延迟(硬实时),必须阻止Linux内核直接处理中断,必须
目录1.ipipe介绍2. x86中断处理和xenomai中断管理机制2.1.x86中断机制2.2.xenomai中断管理机制(1)硬件中断(2)虚拟中断3.ipipe domian管理4.ipipe初始化流程5.ipipeline中断传递5.1 head慢速路径中断处理5.2 head快速路径中断处理6.RTDM驱动的中断注册流程7. Dovetail 本文基于x86简单介绍ipipe的工作机制,ipipe是xenomai保证硬实时性的核心,本文是以前分析代码的一些流水记录,未经详细整理,希望对你认识xenomai原理有所帮助。 由于ipipe维护困难,跟不上主线内核的变化,为此xenomai社区2016年开始开发ipipe的替代品dovetail,自linux 5.4版本起,ipipe正式被更易维护的dovetail替代,伴随dovetail开发诞生的测试evl内核成为了今天的xenomai4内核,dovetail和ipipe本质工作没有变化,只是实现的差异,xenomai官方也给dovetail编写了完整的文档,详见https://v4.xenomai.org/dovetail/。 有了dovetail,让我们自己在linux内核开发属于自己的实时调度核成为可能,不仅如此,你完全可以将现有的RTOS诸如RT-Thread、uCOS、FreeRTOS等小型操作系统移植到linux内核来调度处理实时事件。 1.ipipe介绍 Xenomai是一个基于linux的硬实时操作系统(RTOS),在标准linux基础上添加一个实时内核Cobalt,与linux内核在内核空间共存,为了使Xenomai能够保持可预测的延迟(硬实时),必须阻止Linux内核直接处理中断,必须将中断先重定向通过Xenomai Cobalt处理,然后才是Linux内核。为此在底层增加一个微内核来实现。微内核充当虚拟可编程中断控制器,分离Linux和Xenomai Cobalt之间的中断掩码,该微内核称为中断管道(I-Pipe),I-Pipe基于ADEOS(Adaptive Domain Environment for Operating Systems)微内核,但是I-pipe更精简,并且只处理中断。 ipipe主要负责处理: IRQ与高分辨定时器 中断保护 系统事件(event)传播(虚拟中断) 支持是实时线程在linux域运行 共同优先级:当xenomai任务迁移到Linux域时,Linux域继承任务优先级(使用linux的软实时)。 保证程序执行时间的可预测性:当xenomai任务进入Linux域时,不能被Linux域中断抢占。 优先级倒置管理 linux细粒度调度:当xenomai任务进入linux域需要尽快调度 2. x86中断处理和xenomai中断管理机制 2.1.x86中断机制 详见X86 linux异常处理与Ipipe接管中断/异常 X86 系统中有256个vector,用来识别中断或异常的类型,vector 0-31处理器保留,有固定的用途, 从32到255的vector编号被指定为用户定义的中断,不被处理器保留。 这些中断通常分配给外部I / O设备(部分固定为APIC中断),以使这些设备能够将中断发送到处理器,每个vector的处理程序都保存在一个特殊的位置--IDT(中断描述符表),IDT的基地址保存在寄存器IDTR,在64位x86下IDT是一个16字节描述的数组(32位系统为8字节),当中断发生时CPU将vector乘以16(32位系统是乘以8)来找到IDT中的对应条目idt_data,然后根据条目信息跳转到处理入口执行中断和异常处理。 2.2.xenomai中断管理机制 (1)硬件中断 Xenomai是一个RTOS,与linux共存,为了使Xenomai能够保持可预测的延迟(硬实时),必须阻止Linux内核直接处理中断,先将中断重定给Xenomai处理,然后才是Linux内核。为此在底层增加一个微内核来实现。微内核充当虚拟可编程中断控制器,分离Linux和Xenomai之间的中断掩码,该微内核称为中断管道(I-Pipe),中断的分发和实时性由I-Pipe来保障,I-Pipe在系统中的位置如下所示。 Linux和xenomai在I-ipipe上称为domain, I-Pipe将Linux和xenomai系统组织到两个域中,其中xenomai域的优先级高于Linux域。这两个域共享一个地址空间,允许来自xenomai的线程调用 Linux 内核域中的服务。 I-Pipe 以 domain 优先级顺序调度中断。 Xenomai 被设置为最高优先级域,并将首先接收中断。
阅读全文