目录
第1章 Linux操作系统
1.1 什么是Linux操作系统
1.2 Linux操作系统架构
1.3 常见Linux操作系统发行版本
第2章 实时Linux操作系统
2.1 实时性要求
2.2 实时性实现技术的基本思想
2.2 常见发行版方案
2.3 Xenomai和PREEMPT-RT比较
第3章 PREEMPT-RT
3.1 概述
3.2 PREEMPT-RT Patch详解
3.2.1. PREEMPT-RT的思想
3.2.2. PREEMPT-RT特性
3.2.3. PREEMPT-RT的主要改动
3.2.3.1临界区抢占
3.2.3.2中断处理线程化
3.2.3.3Spinlock和Semaphore支持优先级继承
3.2.3.4降低延迟的其他措施
第4章 Xenomai
4.1 简介
4.2 双调度器架构
第5章 EtherCAT on RT Linux
第1章 Linux操作系统
1.1 什么是Linux操作系统
Linux操作系统是一种开源的、基于Unix思想的操作系统。
它具有以下特点:
-
开源:Linux的核心代码是公开的,任何人都可以查看、修改和分发它。这使得Linux具有高度的灵活性和可定制性,并且能够以不同的方式满足用户的需求。
-
多用户和多任务:Linux支持多用户同时登录,并能够处理多个任务,使得多个用户可以同时共享同一台计算机的资源。
-
稳定性:Linux被广泛认为是一个非常稳定的操作系统。它能够处理长时间运行的任务,具有较低的系统崩溃率和出错率。
-
安全性:相对于其他操作系统,Linux在安全性方面更有优势。由于其开源特性,许多开发者可以共同发现和修补潜在的安全漏洞,从而提高安全性。
-
可移植性:Linux可以在各种不同的硬件架构上运行,包括个人计算机、服务器、嵌入式设备以及移动设备等。
-
丰富的软件支持:Linux拥有庞大的开源软件生态系统,用户可以免费获取各种应用程序和工具,满足各种需求。
总的来说,Linux是一种灵活、稳定、安全且具有强大功能的操作系统,被广泛应用于服务器、个人计算机、嵌入式设备和科学研究领域等。
1.2 Linux操作系统架构
1.3 常见Linux操作系统发行版本
基于标准的Linux操作系统内核,出现了各种各样的Linux发行版本。
以下是一些常见的Linux操作系统发行版本
-
Ubuntu:Ubuntu是一个基于Debian的开源Linux操作系统,具有良好的用户界面和易于使用的特点。它广泛用于个人计算机和服务器环境。
-
Debian:Debian是一个完全自由的开源Linux发行版,具有稳定性和安全性的特点。它提供了大量的软件包和工具,支持多种硬件架构。
-
CentOS:CentOS是基于Red Hat Enterprise Linux(RHEL)源代码构建的开源克隆版本。它被广泛应用于服务器环境,并提供长期支持和稳定性。
-
Fedora:Fedora是由Red Hat公司赞助的一个社区驱动的Linux操作系统。它注重最新的软件和技术,适用于桌面和服务器环境。
-
openSUSE:openSUSE是一个基于SUSE Linux Enterprise的开源Linux发行版。它提供了易于使用和配置的图形界面和强大的管理工具。
-
Arch Linux:Arch Linux是一个轻量级的、面向技术用户的Linux操作系统,提供了滚动发布和自定义的软件包管理系统。
-
Linux Mint:Linux Mint是一个基于Ubuntu的Linux发行版,注重易用性和用户友好的界面。它提供了Cinnamon、MATE、Xfce和KDE等不同桌面环境的版本。
-
Kali Linux:Kali Linux是一个专门用于网络安全和渗透测试的Linux发行版。它包含了大量用于安全测试的工具。
除了上述列举的Linux操作系统,还有许多其他的Linux发行版,如Gentoo、Manjaro、Elementary OS等。每个Linux发行版都有其独特的特点和目标受众,可以根据个人需求和偏好选择适合的操作系统。
第2章 实时Linux操作系统
2.1 实时性要求
实时Linux是针对实时应用需求进行优化的Linux内核或发行版。
它旨在提供实时性能,以满足对于实时任务的严格要求,包括三大实时性要求:
- 可预测性
- 可靠性
- 低延迟
2.2 实时性实现技术的基本思想
标准的Linux内核中不可中断的系统调用、中断屏蔽等因素,都会导致系统在时间上的不可预测性,对硬实时限制没有保证。
目前,针对 real-time Linux 的修改有两种成功的方案:
(1)单调度器
一是直接修改Linux 内核,使其直接具有 real-time 能力;
(2)双调度器
另一是先运行一个 real-time 核心,然后将Linux 内核作为该 real-time 核心的 idle task来运行。
前者称为 PREEMPT-RT kernel,后者称为 dual kernel(如RTLinux等)。
(3)采用的常见技术包括:
- 优先级调度
- 可抢占调度
- 分时多任务调度
2.2 常见发行版方案
下面是一些常见的实时Linux解决方案:
-
PREEMPT-RT:PREEMPT-RT是一个基于Linux内核的实时补丁,也被称为Real-Time(RT)补丁。它通过增加内核的可抢占性,使得Linux内核能够实现实时性能。PREEMPT-RT补丁提供了可配置的实时选项,可以根据应用程序的需求进行调整。
-
Xenomai:Xenomai提供了一个实时框架,为Linux操作系统添加了实时性能。它支持具有硬实时和软实时要求的应用程序,并通过分时多任务和抢占式调度来提供可预测性。
-
RTAI(Real-Time Application Interface):RTAI是一个开源实时应用程序接口,提供了类似API的接口和实时任务调度。它在Linux内核上运行,并通过插入抢占式调度器来实现实时性能。
-
AdaCore GNAT:AdaCore GNAT是一个Ada语言的开发环境,它提供了Ada编译器和运行时环境,针对实时和嵌入式应用进行了优化。它可以与各种实时Linux解决方案搭配使用。
这些实时Linux解决方案可用于嵌入式系统、工控系统、机器人控制、实时数据采集等需要严格的实时性能的应用领域。
但需要注意的是,实时Linux解决方案的配置和使用需要更高的技术要求和维护成本,以确保系统的稳定性和可靠性。因此,选择合适的实时Linux解决方案时,应根据具体应用需求和技术要求进行评估和选择。
2.3 Xenomai和PREEMPT-RT比较
Xenomai和PREEMPT-RT都是用于将Linux内核转变为实时操作系统的解决方案,并具有类似的目标,但它们在实现方式和功能上有一些区别。
-
实时性能:PREEMPT-RT补丁通过可抢占内核和实时调度器来提供实时性能。它改善了Linux内核的抢占性能,降低了实时任务的延迟(实时性任务可以抢占非实时性任务,快速影响是优先考虑=》最小的延时)。而Xenomai则通过使用分时多任务和针对实时应用程序进行的专用调度算法来提供可预测性和可靠性(可预测性是主要考虑的目标 =》稳定的延时)。
-
架构:PREEMPT-RT补丁是基于标准Linux内核的优化补丁,而Xenomai则是一个与标准Linxu调度程度相互独立的并行的、实时调度框架,需要与Linux内核进行配合。Xenomai通过插入一个称为Cobalt的内核模块来添加实时功能,该模块与PREEMPT-RT兼容。
-
应用程序支持:Xenomai提供了一套丰富的、专用的、实时应用程序接口(API),如native、posix和skin等,为开发者提供了多样化的选择。它还支持多种应用程序编程语言,如C、C++和Ada等。而PREEMPT-RT主要是对Linux内核的优化,没有提供额外的应用程序开发接口。
-
使用复杂性:相对而言,PREEMPT-RT对于配置和使用的要求相对较低,而Xenomai则需要更多的配置和调优。Xenomai的配置和使用可能较为复杂,但它提供了更高度定制化和可预测的实时性能。
选择使用PREEMPT-RT还是Xenomai取决于具体的应用场景和需求。如果对于实时性能要求相对较低,且希望保持较简单的配置和开发过程,PREEMPT-RT可能更合适。而对于对实时性能和可预测性有较高要求,且愿意投入更多配置和调优工作的情况下,Xenomai可能是更好的选择。
第3章 PREEMPT-RT
3.1 概述
PREEMPT-RT(Real-Time)是一个针对Linux内核的实时性能优化补丁。
它的目标是将Linux内核转变为可用于实时应用程序的实时操作系统。
PREEMPT-RT补丁的主要特点包括:
-
可抢占内核:PREEMPT-RT补丁增加了内核的可抢占性,使得在内核执行期间能够更容易地中断并切换到更高优先级的任务。这样可以降低实时任务的延迟,并提高系统响应速度。
-
实时调度器:PREEMPT-RT补丁引入了实时调度器,用于根据任务的优先级和截止时间进行任务调度。它提供了多种调度算法,包括先进先出(FIFO)和循环率达(Rate Monotonic)等。
-
内核锁机制优化:PREEMPT-RT补丁对内核的锁机制进行了优化,以避免锁冲突和死锁。这可以提高多线程应用程序的并发性能,并减少竞争条件。
-
中断处理优化:PREEMPT-RT补丁改进了中断处理机制,减少了中断处理的延迟,并提高了实时任务的响应能力。
使用PREEMPT-RT补丁需要进行一些特定的内核配置和编译。它可以与常见的Linux发行版(如Ubuntu、Debian、Fedora等)一起使用,并为实时应用提供较低的延迟和可预测的性能。
需要注意的是,PREEMPT-RT并非完全硬实时(Hard Real-Time)解决方案,它仍在基于Linux的通用操作系统上运行。对于对于具有非常严格的实时性能要求的应用场景,可能需要使用更专门的实时操作系统。
3.2 PREEMPT-RT Patch详解
3.2.1. PREEMPT-RT的思想
PREEMPT-RTPatch的核心思想是最小化内核中不可抢占部分的代码,同时将为支持抢占性必须要修改的代码量最小化。对临界区、中断处理函数、关中断等代码序列进行抢占改进。
3.2.2. PREEMPT-RT特性
1.临界区可抢占。
2.中断处理函数可抢占。
3."关中断"代码序列可抢占。
4.内核中的spinlock和semaphore支持优先级继承。
5.延迟操作。
6.降低延迟的措施。
3.2.3. PREEMPT-RT的主要改动
PREEMPT-RT把Linux变成一个完全可抢占的内核,改变有以下几点:
1. 通过rt_mutex的重新实现使内核里的锁源语可被抢占。以前被如spinlock_t和rwlock_t保护的临界区现在变得可以被抢占了。
2. 为内核里的自旋锁和信号量实现优先级继承(PI-Priority Inheritance)。
3. 把中断处理器变为可被抢占的内核线程:PREEMPT-RT patch在内核线程上下文中处理软中断处理器。
3.2.3.1临界区抢占
spinlock是Linux内核锁机制的一种,被大量的用在临界区的访问,但传统的spinlock是禁止抢占的,因此会影响系统的实时性。
PREEMPT_RT用支持PI的rt_mutex代替传统的禁用抢占的spin_lock,定义了新的数据类型:spin_lock_t。凡是使用spin_lock_t做参数的spin_lock函数行为有可能引起调度,不会禁用抢占。如果,希望使用传统的spin_lock,则需要使用raw_spin_lock_t类型作为参数。
3.2.3.2中断处理线程化
Linux 硬中断处理时需要关闭中断,无法被抢占,这样会阻塞掉其它的中断请求,PREEMPT-RT会强制透过request_irq()申请的IRQ的顶半部函数在线程中执行,使中断处理函数运行在内核线程上下文中,而不再是中断上下文,可以被抢占。
在PREEMPT_RT环境中几乎所有的中断处理函数都运行在进程上下文中。尽管任何中断都可以被标记为SA_NODELAY使之运行在中断上下文,目前只有fpu_irq、irq0、irq2和lpptest中断设置了SA_NODELAY标记。这些中断中只有irq0(per-CPU定时器中断)是常用的,fpu_irq用于浮点协处理器中断,lpptest用于中断延迟评测。
不要轻易使用SA_NODELAY,它会使得系统的中断和调度延迟大大增加。外,必须非常谨慎地处理标记为SA_NODELAY的中断处理函数,否则将可能导致oops和死锁。
3.2.3.3Spinlock和Semaphore支持优先级继承
在如下的情况下会发生优先级翻转:
* 低优先级的任务A获取到一个资源,比如一个锁(L)。
* 中优先级任务B开始执行,抢占了任务A。
* 高优先级任务C尝试获取资源L。因为中优先级的任务B抢占了任务A,(任务A无法释放锁L)那么高优先级的任务就会阻塞。
优先级翻转是实时系统中必须解决的问题,它可能导致一个高优先级任务被无限期推迟执行。
PREEMPT_RT中使用优先级继承来解决优先级反转,核心思想是:高优先级任务暂时将其优先级赠与拥有临界资源(锁)的低优先级任务,从而快速运行加快A对锁的释放。此处优先级继承是变化的:比如,又有一个优先级更高的任务D也尝试获取锁L,那么任务C和A的优先级都会暂时提升为任务D的优先级。优先级继承的持续时间是非常短暂的。因为一旦低优先级任务A释放了锁,它马上就会失去短暂提升的优先级,然后将锁交给任务C。
PREEMPT_RT在一段时间内仅仅允许一个任务读持有读写锁/semaphore。允许该任务递归获取该锁。尽管丧失一些灵活性,却使得优先级继承变得切实可行。
优先级继承使得高优先级任务可以及时地获取锁和semaphore,即便是锁或semaphore已经被低优先级的任务获取。PREEMPT_RT的优先级继承提供短暂的继承,这是高优先级任务突然要获取低优先级任务的锁所需要的。compat_semaphore和compat_rw_semaphore可以用于不需要semaphore优先级继承的事件类的使用场合
3.2.3.4降低延迟的其他措施
有些PREEMTP_RT的修改的主要原因是降低调度/中断延迟。x86 MMX/SSE硬件就是一个列子。该硬件在内核空间抢占关闭的情况下进行操作。这意味着,直到MMX/SSE指令运行完毕,抢占才能开启。有些MMX/SSE指令没有问题,但是有些指令的执行需要很长时间。对此PREEMPT_RT的解决方案是不使用慢的MMX/SSE指令。另一些修改是:向slab分配器申请per-CPU变量也是对肆意关闭中断的一种解决方案。
第4章 Xenomai
4.1 简介
Xenomai是一个实时应用程序开发框架,旨在将Linux操作系统扩展为实时操作系统。
它提供了强大的实时功能和可预测性,适用于需要高精确性和低延迟的实时应用程序。
以下是关于Xenomai的一些重要特点和功能:
-
双核架构:Xenomai使用双核(或多核)架构,其中一个核心运行Linux内核,而另一个核心运行Xenomai,负责实时任务的调度和执行。这种分离的架构确保了实时任务不会受到Linux内核的影响,提供了更可靠的实时性能。
-
分时多任务调度:Xenomai采用了分时多任务调度算法,可为实时任务提供严格且可预测的时间片分配。这种调度策略确保了实时任务可以按照其优先级和截止时间进行准确地调度,避免了不确定性和不可预测的延迟。
-
实时应用程序接口(API):Xenomai提供了一套丰富的API,使开发者能够以实时方式编写应用程序。这些API包括Native API和POSIX API,分别提供了对底层实时功能和标准POSIX函数的访问。
-
高精确性定时器:Xenomai提供了高精确性的定时器,可用于实现精确的时间控制和事件触发。这对于需要在特定时间点触发操作的应用程序非常关键。
-
支持多种架构和硬件平台:Xenomai支持多种处理器架构和硬件平台,包括x86、ARM、PowerPC等。这使得它适用于各种嵌入式系统和实时应用的开发。
需要注意的是,Xenomai的配置和使用对开发者的要求较高。它通常需要对Linux内核进行一些修改和重新编译,以及对Xenomai进行适当的配置和调优。因此,使用Xenomai开发实时应用程序需要一定的技术知识和经验。
总的来说,Xenomai是一个功能强大且高度定制化的实时应用程序开发框架,适用于需要严格的实时性能和可预测性的应用领域,如:
- 工业自动化
- 机器人控制
- 航空航天