论文部分内容阅读
近年来,因特网取得了突飞猛进的发展,但我国的数据类通信产业还处在方兴未艾的阶段,这也给了中国的产业界一个很好的发展契机。我们要研制具有自主产权的2600系列和3600系列低端路由器正是在这种条件下提出来的。
本文的主要研究是路由器的一个很重要的方面:路由器操作系统。我们所采用的操作系统原型是具有开放源代码的Linux。由于现有的Linux具有与作为路由器操作不相适应的方面,我们需要对其进行有针对性的改造。我们根据以小区为代表的接入应用环境,提出了实时应用与非实时应用并存的操作系统模型。我们认为,作为接入设备,我们的路由器不但应该要提高它的包吞吐率,而且还应该具有一定的接入控制能力。这样,改造后的Linux应该不但应该能支持实时性、解决严重限制了短包转发率的活锁问题,还应该能提供一定的QoS保障。
目前的Linux内核是不可抢占的,不能很好地支持实时性。目前已经存在若干Linux实时变种,其中要以Rtlinux和RTAI的双内核机制做得最好。但是这种机制具有与生俱来的移植性差和执行环境比较脆弱等缺陷,我们决定采用内核完全抢占化的技术。我们采用这种完全抢占化的理论基础是,Linux的SMP版本中被旋转锁保护起来的代码是不可重入的,其余的代码都是可重入的。我们将这种旋转锁改造成为一种仅具有一个信号量的睡眠锁,使得这些不可重入区具有重入性,以此来实现Linux内核的抢占化。为了配合这种改造的完成以及有效地克服活锁问题,我们还对中断处理进行了线程化。
对Linux现有进程调度机制的改造也是支持实时任务和非实时任务一个很重要的方面。目前Linux的调度机制基于时期(epoch)的定期更新优先级的方法,具有多方面的局限性。对于这种情况,我们提出了等级的优先级调度算法,将所有的进程分为中断任务、实时任务和普通任务三个等级,中断任务具有最高的优先级,普通任务具有最低的优先级,每个等级具有自己的调度算法。中断任务等级采用的是基于线程池、优先级相对固定的算法,能有效地克服活锁问题,也能提供一定的QoS保障;实时任务等级采用的是基于固定优先级的RMA算法;普通任务等级则采用基于调度表、以公平性为目的调度算法,能有效克服Linux基于时期(epoch)的调度方法所带来的问题。
死锁问题和优先级倒置的问题是我们在对Linux内核改造中遇到的两个很重要的问题。对于死锁问题,我们采用了相对简单的基于资源顺序使用的方法;对于优先级倒置问题,我们则采用了优先级继承的方法。通过这两种方法,有效地克服了死锁问题和优先级倒置问题。
本文还对Linux基于页面机制的虚拟内存管理机制提出了若干改进,如动态内存申请定时器的设计和实时任务的页面锁定,有效地支持了实时任务对内存的要求。
本文的结尾还采用实验的方法,对已有的Linux实时变种RTAI,标准的Linux内核和我们改造的Linux内核进行了测试和比较,结果表明我们的工作是非常成功的。