微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 改善Linux内核实时性方法的研究与实现

改善Linux内核实时性方法的研究与实现

时间:08-14 来源:互联网 点击:

量使用了spinlock,存在大量的内核不可抢占的临界区,这将严重影响系统的实时性,我们使用新的实时互斥锁rt_mutex来替换spinlock,即让临界区内内核可抢占。其结构体如下:

类型raw_spinlock_t就是原来的spinlock_t。新的自旋锁还是使用spinlock_t来标记。在结构struct rt_mutex中的wait_list字段就是优先级化的等待队列。Owner字段为拥有该锁的进程的环境信息。mutex比spinlock优越的地方有这么几点:(1)当遇到一个锁住的临界区时,任务被挂起到锁的优先级等待队列wait_list中,临界区解锁时等待任务被激活。(2)内核将一个锁住的临界区和一个任务关联,当获得互斥锁时将任务的标识存入锁中。(3)临界区可以在被保护的同时不禁止抢占。(4)在被锁住的临界区中可以实现优先级继承。

2.2 实时互斥锁的操作

并不是所有内核中的自旋锁都可以转换为互斥锁的,一些底层的临界区必须是不可抢占的,所以必须由不可抢占的自旋锁保护,比如:保护硬件寄存器的锁、调度器的运行队列锁、和其它不可抢占自旋锁嵌套的锁。实时内核中,不可抢占的自旋锁与RT互斥锁共存,不可抢占的自旋锁被重命为 raw_spinlock_t。spin_lock函数利用gcc的内嵌技术根据锁的类型通过预处理选择具体的锁执行函数。预处理器使用 __builtin_types_compatible函数,由宏TYPE_EQUAL调用:

#define TYPE_EQUAL(lock, type)

__builtin_types_compatible_p(typeof(lock), type *)

函数映射结构PICK_OP是允许两种锁共存的机制,PICK_OP在编译阶段将锁操作转化为合适的种类(mutex或者spinlock):

根据宏处理的结果,如果类型为spinlock_t,将运行函数_spin_lock,而如果类型为raw_spinlock_t,将运行函数 _raw_spin_lock。对于实时rt_mutex获取,当前任务由于优先级高如果可以抢占该锁,则把锁的先前拥有者添加到该锁的等待队列中并且在新的锁拥有者的task_struct中标记等待该锁的所有任务;而如果不能获得锁,则把当前任务放到锁的优先级等待队列中,直到锁的拥有者释放该锁,唤醒等待队列中最高优先级的任务进入临界区。为了防止优先级反转,可以改变锁的当前拥有者的优先级为锁的等待队列中任务的最高优先级。

实时互斥锁的应用使得高优先级的任务通过抢占锁可以进入临界区,这样内核的不可抢占区的数量和范围都大大缩小,内核可抢占性有了很大的提高,充分减小了实时高优先级任务的抢占延迟。

3 改进后的内核实时性能测试

对Linux进行了实时化改造后,需要对其进行测试来确定系统是否符合实际应用的需要。实时性能测试主要包括测试内核的最大中断延迟和任务调度时间延迟两个重要的指标。

中断延迟反映的是中断信号发生到内核对中断做出响应所需要的时间,通过利用并口的7号中断,短路并口的9-10脚,其中10脚为中断引脚,9口为并口数据口的高位,往IO口0X378写8就可以引发中断,然后在中断服务程序里往0x378写0就会重新拉低中断引脚电平。用高精度示波器测量这个脉冲的宽度来测得中断延迟时间。对于赛扬650MHz,内存128M的工控平台,负载为拷贝CF卡情况下,标准Linux2.6内核最长中断延迟为 240us,而改进后的实时内核最长中断延迟为16us。

采用开源软件LMbench3.0测试系统调度延迟时间。测试机器配置为:CPU ,Intel P4 2.8GHz,内存512M,负载情况为拷贝硬盘、访问网络。标准Linux2.6内核调度延迟为1038us,而改进后的内核的调度延迟为140us。

可见改进后的内核的最长中断延迟和调度延迟比标准内核要短很多,内核的实时性能有了很大的提高。

4 结束语

针对标准Linux2.6内核由于中断关闭时间过长、内核临界不可抢占区过大而多,明显存在实时性能方面的不足,提出了改进其实时性的方法,实现了实时Linux内核的中断线程化以及新的内核同步自旋锁,使其具有更短的中断延迟和调度延迟。

本文作者的创新点:在标准的Linux2.6可抢占内核上对其中断处理机制进行线程化改造,大大的减小了中断响应时间。另外对内核同步机制采用新的自旋锁使得内核可抢占性能更加优异,改进后的内核可以适用于对Linux内核实时性要求更高的场合。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top