以网络为中心的计算基础设施领域面临的一个关键且悬而未决的问题就是病毒,无论是恶意引入,还是错误代码所致(即程序误码),病毒或程序误码都可以通过自身繁衍,或者耗尽系统内存或(和)CPU时间来中断系统服务。对具有Web功能的手持设备来说,与其发生交互作用的服务器、路由器和传送设备等基础设施都可能成为提供病毒发作的温床。从信号处理到数据传输、Java程序,以及客户机或服务器应用程序中的错误代码或别的什么都孕育着病毒发作的机会。
David Kleidermacher
工程总监
Green Hills软件公司
仅就错误代码而言,可以说没有一个稍微复杂一点的程序能消除误码;程序代码越长,误码就越多。在不断缩短的开发周期压力下,新的开发项目往往需要更大的编程团队。而由这些团队生成的代码质量往往取决于该项目中能力最差的程序员。虽然调试程序能检测出一些运行错误(即误码),但不能保证排除所有的错误代码。
流行的嵌入式平台,诸如PowerPC和MIPS处理器,在其内存管理单元中自动带有内存管理功能。但是,要充分享用这种硬件内存保护功能的优势,系统设计人员必须使用具有内存保护的实时操作系统(RTOS)访问和使用处理器资源。
在深入探讨带有内存保护机制的RTOS所能提供的保护功能之前,我们先来对比一下有内存保护机制的RTOS和较为常用的、采用平面存储的操作系统。在平面存储模式中,所有的应用程序和操作系统本身都在同一个地址空间运行。程序可直接存取操作系统内核和数据。显然,系统可靠性有潜在的危险:一段恶意代码或一个不经意而造成的无定义指针就能摧毁系统中的应用程序或内核本身。因此一个可靠系统的最基本也是最首要的要求就是具备内存保护机制的RTOS。
病毒还能用别的方式影响在平面存储RTOS中编写的应用程序吗?假设一个系统由两个应用程序构成,每个程序各执行一项任务,且有相同的CPU优先级。RTOS内核包括一个调度程序,它自动分配任务的CPU占用优先级。
在理想情况下,每个任务分享50%的CPU能力和时间。但是,假如其中一个程序由于恶意或错误出现问题,并衍生出100个额外的“帮凶”任务,现在就是101个坏任务(原来的任务加上它衍生的100个“帮凶”任务),而不是一个任务同那个好程序分享CPU时间了。实际上,病毒就是通过衍生大量“帮凶”任务与好程序抢食CPU的。这样一来,好程序不再能分享50%的CPU时间,而只能占用少于1%的CPU时间。大多数内核调度程序都不能防止这种由衍生任务所导致的对CPU资源的侵吞现象。当一个病毒出现时,它将造成正常任务严重短缺CPU资源。
一个典型的平面存储实时操作系统会有一个约占10KB内存的小内核。相比之下,一个有内存保护机制的操作系统(如Integrity RTOS)的内存占用达70KB。由于无线手持设备需要一些占用较大内存的IP堆栈及其它中间件,为发挥内存保护和保证资源可用的优势,相对于平面存储系统来说增加内存占用量也不算过分。
除了内核提供的安全和可靠性外,一个先进的RTOS也支持高速缓存初始化、板卡内存初始化和设备驱动程序,即所谓的板卡支持包(BSP)。但许多平面存储模式的内核不带这种初始化代码。RTOS提供了数种类型的称为“时空域保护”的资源保护机制。
第一个时域保护机制可为一定优先级的任务或线程提供有确定比例的最小CPU执行时间。系统开发人员为每一个任务分配一个“权重”或百分比。与前述的平面存储操作系统相比较而言,系统开发人员为两个任务各分配50%的权重,并有同样的优先级。如果一个任务又遭到恶意破坏并派生出100个“帮凶”任务,但好任务仍可保留50%的CPU执行时间。有恶意病毒的任务也获得50%的执行时间,而现在这份执行时间被分配在101个任务上(最初的任务加100个帮凶)。采用这种方式划分使用CPU,RTOS就能保持和保护好任务的完整性,而且可将恶意病毒或程序误码隔离开来,以便识别和纠正。
第二个时域保护机制叫做“分隔调度”。分隔这一概念源于航空电子应用领域。出于对安全的考虑,并为了符合Arinc 653的飞行器设计标准,一架飞行器上的CPU所执行的任务必须分隔开,以防止飞行器系统中的一个误码错误危及另一个。例如,这样可阻止飞行器空中娱乐系统中的误码破坏导航系统。
分隔调度程序按地址空间进行分隔,每一分隔区相当于一个地址空间。当一个地址空间运行时,其中的所有线程都可以运行。通过系统开发人员的选择,在某一完整的周期内,每个地址空间都被分配一个或多个执行时间窗。当某一地址空间窗开始运行时,内核只运行该地址空间中的任务。因此,在其执行期间,该地址空间的CPU资源得以保障。在某一应用程序中发作的任何病毒或误码都被限制在其分隔区内。同时使识别问题变得十分容易,而且保证了其它区域不会短缺CPU资源。
许多操作系统都是从一个中心存储区来分发内存的。当某个任务创建了一个新的任务,它就要求额外的内存。在这种处理方式中,任何应用程序都可以创建消息队列、任务、信号标志或发出其它内存请求。所有这些内存请求都必须由那个中心存储区提供,它通常为系统启动后所剩的可用RAM。如果一个病毒或误码开始繁殖,并不断要求越来越多的内存,这些要求很快就会耗尽中心存储区的内存,从而使整个系统崩溃。
内存限额
为了防止这种情况发生,先进的RTOS采用一种叫做“硬通货”的解决方案。根据这一方案,系统设计人员为每个地址空间分配一定限额的内存。那是它在运行期间所能用的全部内存资源。
如果特定地址空间中的某个任务或一组任务编程有误,并超出了系统设计人员所分配的内存份额,那它们就不能继续执行。而且,如果一个病毒或程序误码开始在某一特定地址空间内衍生,内存限额机制会阻止病毒或误码感染其它地址空间。
这种空间域保护机制也适用于动态产品设计。系统设计人员为额外的升级或应用程序留出足够的内存,以便让新的应用程序或升级版获得相应的内存份额。
地址空间的数目仅受制于处理器能力或内存容量,先进的RTOS可处理无穷多个地址空间、应用程序或任务。
在一个未分隔的系统中,对能访问各种系统设备的应用程序没有限制或控制。而在一个具有分隔机制的RTOS中,只有系统设计人员才能定义那些可以存取某一设备(如文件系统)的地址空间。如果一个手持设备的终端用户欲下载含有病毒或误码的数据、应用程序或升级版本,系统设计人员能确保该应用程序不会存取文件系统及重要数据,并能确保只有真正安全的应用程序才能获准存取数据。
即将发布的Integrity RTOS版本可让设计人员在图形化环境中使用图形用户界面(GUI)和拖放图标来创建其地址空间、任务和信号标志的初始状态。
|