一、RT linux patch
Linux kernel在spinlock、irq上下文方面无法抢占,因此高优先级任务被唤醒到得以执行的时间并不能完全确定。同时,Linux kernel本身也不处理优先级反转。RT-Preempt Patch是在Linux社区kernel的基础上,加上相关的补丁,以使得Linux满足硬实时的需求。
RT-Preempt Patch对Linux kernel的主要改造包括:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//1. spinlock/sem优化,支持抢占
Making in-kernel locking-primitives (using spinlocks) preemptible though reimplementation
with rtmutexes:
Critical sections protected by i.e. spinlock_t and rwlock_t are now preemptible.
The creation of non-preemptible sections (in kernel) is still possible with
raw_spinlock_t (same APIs like spinlock_t)
Implementing priority inheritance for in-kernel spinlocks and semaphores. For more
information on priority inversion and priority inheritance please consult Introduction to
Priority Inversion (http://www.embedded.com/electronics-blogs/beginner-s-corner/4023947/
Introduction-to-Priority-Inversion)
//中断线程化,中断支持抢占
Converting interrupt handlers into preemptible kernel threads: The RT-Preempt patch
treats soft interrupt handlers in kernel thread context, which is represented by a
task_struct like a common userspace process. However it is also possible to register
an IRQ in kernel context.
Converting the old Linux timer API into separate infrastructures for high resolution
kernel timers plus one for timeouts, leading to userspace POSIX timers with high resolution.
原文链接:https://blog.csdn.net/juS3Ve/article/details/79788554
通过Preempt_RT来实现Linux实时性的关键点是减少内核中非抢占性(non-preemptible)的代码量,且要尽量减少对实际的代码的修改量。为了减少内核中非抢占性(non-preemptible)的代码量,需要实现对临界区(critical secitons),中断处理例程(interrupt handlers),中断屏蔽代码段(interrupt-disable code sequences)的可抢占性。为了减少对实际的代码的修改量,Preempt_RT patches充分重用了LInux kernel对SMP的支持能力,从而避免了对Linux kernel的大量重写。
1
原文链接:https://github.com/chyyuu/rt-patch-analysis/blob/master/developers/chy/techreport.md
2 实时抢占补丁研究
2.1 实时补丁现状 实时抢占补丁(RealtimePreemptionPatch,PreemptRT)是由IngoMolnar和ThomasGleixner更新维护,和其他在微内核中通过增加实时抢占方法所不同,它原有的低延迟补丁和抢占补丁的基础上,加入中断线程化、高精度时钟、优先级继承等新特性,将Linux内核修改成完全可抢占式内核,使其具有硬实时能力。
目前,PreemptRT还没有完全加入到标准Linux内核中,但部分抢占支持、高精度时钟、中断线程化等已经加入到最近的内核版本中,如Linux2.6.23内核中加入CompletelyFairScheduler(CFS)、2.6.24版本中加入高精度时钟以及2.6.30版本加入中断线程化特性等。对完全可抢占的支持目前还没有加入内核中,但增加PreemptRT后可实现。因此,随着实时特性不断融入Linux内核中,其实时性会越来越强。
2.2实时抢占补丁分析 本文针对Linux2.6.33内核实时抢占补丁中一些关键的实时特性进行分析。其中包括新型锁机制、中断线程化、优先级继承、高精度时钟。
(1) 新型锁机制提升内核性能 PreemptRT将大内核锁(BKL)和自旋锁(spinlock)全部转化为优先级继承的互斥锁(mutex),持有锁的线程可以被抢占,减少了内核调度延迟,避免了不必要的时间开销;同时该补丁实现了可抢占的RCU(Read-CopyUpdate)锁和串行化读写锁,提高了内核性能。
(2) 中断线程化 中断线程化是实时改造Linux的一个重要步骤。在Linux标准内核中,中断是最高优先级的执行单元,只要有中断事件,系统将立即响应,会使中断非常频繁,实时任务很难有机会运行。为解决这个问题,引入了中断线程化,中断将作为内核线程运行而且被赋予不同的实时优先级,若实时任务比到来的中断线程拥有更高的优先级,实时任务不会被中断线程中断。中断线程化保证了实时性,减小实时抢占延迟。
(3) 优先级继承 自旋锁被互斥锁取代后会产生优先级逆转(rriorityinversion)现象,即优先级高的进程由于优先级低的进程保持了竞争资源被迫等待,而让中间优先级的进程运行。优先级逆转将导致高优先级进程的抢占延迟增大,不能保证实时性。为避免不可预期的优先级反转问题,PreemptRT实现了优先级继承协议,即自旋锁的保持者将继承高优先级的竞争者进程的优先级,从而能先于中间优先级进程运行,尽可能快地释放锁,这样高优先级进程就能很快得到竞争的自旋锁,使抢占延迟更短[7].
(4) 高精度时钟 Linux标准内核通过基于Jiffies周期性时钟滴答计时,而且高精度的时间获取需要依赖特定的平台,为调度短周期任务,需 要设置时钟频率为更小值,意味着时钟中断更加频繁,会造成大量时钟中断处理和资源浪费。为了解决这个问题,实时抢占内 核的时钟系统重新设计,实现了高精度定时器[8]。时钟精度不再依赖jiffies,使POSIX定时器和nanosleep精度由具体硬 件提供的精度决定,从而系统调用gettimeofday能够获得精确的时间值。
1
原文链接:http://www.ecice06.com/CN/article/downloadArticleFile.do?attachType=PDF&id=25958