基于Barrelfish的实时libOS设计与实现*

2013-11-24 02:17龙,龙翔,王
网络安全与数据管理 2013年2期
关键词:实时性内核中断

陈 龙,龙 翔,王 雷

(北京航空航天大学 计算机学院,北京100191)

随着当前系统结构中处理器核心数目的增加,传统的微内核和单一内核结构已经无法满足众核结构扩展性要求,因此,业界提出了如 FOS、Barrelfish等满足多核要求的操作系统原型。但是这些系统原型都没有实时性方面的考虑。而今,在国防科技、航空航天、工业控制、电信行业、医疗行业、信息家电等多个领域都同时提出对多核、实时性的需求。

为了满足这种需求,本文基于当前现有多核操作系统和实时操作系统,构建一种同时满足多核和实时性要求的系统框架。

1 系统介绍

1.1 Barrelfish操作系统

Barrelfish的核心思想在于cpu driver的概念,为一部分体系结构相关代码,每个核心上都运行单个cpu driver,它们之间不共享任何状态,不做任何形式的同步,结构上更像是一个分布式系统。与传统操作系统结构相比,Barrelfish系统可以保证很好的扩展性[1]。

Barrelfish采用dispatcher和thread双层调度模型,不支持抢占,使用轮转调度策略。dispatcher相当于进程,每个dispatcher可以有许多thread,这种调度模型奠定了整个系统框架的基础。本文以此操作系统作为底层多核结构的支撑。

1.2 VxWorks以及libOS

libOS是MIT在exokernel操作系统中提出的[1],libOS将一个操作系统作为应用运行在下层kernel上,kernel上可以运行多个libOS,应用开发者可以完全自由地使用它们,甚至可以将它们替换成自己的抽象以达到提高性能的目的。底层的硬件访问允许程序员实现一个自定义的抽象,去掉不需要的,这通常可以大大地提高程序的性能。本文所要构建的系统框架采用了libOS的概念,这也是本文的主要思想之一。

本文采用VxWorks 5.5构建上层libOS。VxWorks5.5与其他版本的系统对比具有系统结构简单、易于裁剪和分析等优势,采用基于抢占的优先级调度,辅以同优先级的时间片轮转调度,具有256个优先级供任务使用,VxWorks5.5不区分用户态和内核态,所以没有状态切换的性能损耗,更有利于分析其实时性能。

2 系统构建过程

本文构建的系统框架如图1所示。

libOS的构建过程主要包括对Barrelfish的结构分析与改造、对VxWorks5.5的结构分析与改造(包括启动过程分析与裁剪、系统内核任务管理以及内存管理代码的移植、内核底层结构相关汇编代码部分的改造)及添加实时任务等。

图1 系统框架

2.1 启动分析及改造

Barrelfish的用户程序为常见的ELF格式,加载后的 ELF以 dispatcher的方式运行,dispatcher可以包含许多thread,在调用用户main函数之前,libbarrelfish完成对dispatcher、thread初始化等操作,如图2所示。其中barrelfish_init_disabled()为libbarrelfish的入口,这里设置dispatcher的入口为run_entry,即dispatcher被调度执行的入口,thread_init_disabled()为线程初始化,这个线程最终会执行用户main()函数。

dispatcher调度是Barrelfish最基本的部分。改造后的dispatcher初始化过程如图3所示。VxWorks启动包括两个方面:BSP启动和VxWorks系统镜像启动。改造VxWorks的启动流程,裁剪掉不相关代码,保留任务管理、存储管理等核心代码,将两个启动阶段合并为一个,改造之后的libOS启动过程如图4所示。

图2 dispatcher初始化

图3 改造后的dispatcher启动

图4 libOS启动

2.2 中断处理

libOS构建过程中需要解决的一个关键问题是libOS如何做中断处理,本文中libOS作为dispather运行在Barrelfish的用户空间,而Barrelfish的中断处理发生在内核态,上层无法接收中断,这将导致移植后的libOS无法保证抢占式调度策略。此外,在接收不到时钟中断的情况下,libOS也无法做任务挂起、定时等一系列基于时钟的操作。

为了解决这个问题,可以从以下几个方面考虑:(1)dispatcher响应时钟中断;(2)Barrelfish判断中断类型;(3)libOS处理中断流程。

除了由时钟中断处理程序调用dispatch()外,其他情况(如一个dispatcher退出)也可能引起 dispatch()被调用。想要只有时钟中断被libOS感知,就要对这些情况进行区分,在Barrelfish的kernel/dispatch.c中增加一个全局变量:

enum dispatch_type dispatch_type=DISPATCH_TYPE_DEFAULT;

每当开始调度一个dispatcher时,根据调度的理由设置dispatch_type的值。若发生时钟中断,则在Barrelfish的中断处理程序中将其设置为:

dispatch_type=DISPATCH_TYPE_TIMER_INTERRUPT;

libOS_run则是重新定义的libOS的disp_run的c函数入口,其函数原型为:

第二个参数指定了调度libOS的理由,当其值为DISPATCH_TYPE_TIMER_INTERRUPT时,说明是由于在libOS的时间片内发生了时钟中断,可以进行相应的时钟中断处理。整个流程如图5、图6所示。

图5 Barrelfish时钟中断响应

图6 libOS时钟中断处理

2.3 任务切换部分的改造

VxWorks上下文切换分两种情况:同步和异步[4]。VxWorks的这部分代码由汇编指令写成,其中涉及到一部分特权指令,这些指令无法在用户态执行。此外针对原来中断处理的部分也要进行改造,改造后的流程如图7所示。

3 实验

3.1 测试平台

本文的测试平台为qemu模拟器,qemu对 x86平台有很好的支持,通过模拟4个x86核心来启动Barrelfish。

3.2 测试流程

测试主要过程为:将用户程序usr_test()添加到 usr-Root()根任务中启动,使用 taskSpawn()创建 3个不同优先级的任务,任务见表1。

这个流程能够更好地体现系统基于抢占的优先级调度策略。task3优先级最低,被task2抢占,task2被task1抢占,最后task3改变自己的优先级为最高又抢占task1。

图7 任务切换流程

表1 实时任务

3.3 测试结果

将生成的libOS 镜像添加到grub的 menu.lst中,通过module参数指定其目标核的编号,启动Barrelfish后会自动将其加载到目标核上启动。

本文通过将libOS概念应用到对多核系统Barrelfish的实时性改造上,构建一个同时满足多核实时要求的系统框架,并且通过实验验证了这种思路的可行性。本工作保证libOS在其时间片内的实时调度,而底层Barrelfish没有实时性方面的考虑,可以从分析libOS的中断延迟、中断响应时间、任务切换时间等方面着手,与移植之前的相应参数做比较,提出对整个系统框架实时性改进的意见。

[1]BAUMANN A,BARHAM P,HARRIS T.The multikernel:a new OS architecture for scalable multicore systems.Systems Group[C].ETH Zurich,2009.

[2]ENGLER D R.The exokernel operating system architecture[R].MIT USA,1998.

[3]BAUMANN A,PETER S,SINGHANIA A.Your computer is already a distributed system,why isn′t your OS[C].12th Workshop on Hot Topics in Operating Systems,2009.

[4]官赐田.一个高性能操作系统vxworks的移植及其实现[D].上海:上海交通大学,2006.

[5]BAUMANN A,PETER S.Embracing diversity in the Barrelfish manycore operating system[C].Systems Group,ETH Zurich,2008.

猜你喜欢
实时性内核中断
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
Linux内核mmap保护机制研究
基于FPGA的中断控制器设计*
Linux中断线程化分析及中断延时测试
跟踪导练(二)(5)
千里移防,卫勤保障不中断
航空电子AFDX与AVB传输实时性抗干扰对比
计算机控制系统实时性的提高策略