软件修补十亿英里

时间:2010-06-20 06:09:41

标签: debugging real-time

有人可以在这里阐明NASA如何设计他们的航天器架构以确保他们能够修补部署的代码中的错误吗?

我从未构建任何“实时”类型系统,这是在阅读本文后想到的一个问题:

http://pluto.jhuapl.edu/overview/piPerspective.php?page=piPerspective_05_21_2010

  

“我们要做的第一件重要事情之一   当我们下次唤醒宇宙飞船时   本周将上传近20个未成年人   错误修复和其他代码增强功能   我们的故障保护(或“自动驾驶仪   响应“)软件。”

5 个答案:

答案 0 :(得分:14)

我一直是公用电话交换系统软件的开发人员,该软件对可靠性,可用性,生存性和性能都有严格的限制,可以满足航天器系统的需求。我没有参与航天器工作(虽然我曾在IBM工作过许多前飞梭程序员),而且我不熟悉VXworks,这是许多航天器上使用的操作系统(包括具有惊人操作记录的火星探测器) )。

可修补性的核心要求之一是应该从头开始设计系统以进行修补。这包括模块结构,以便可以添加新变量并替换方法,而不会中断当前操作。这通常意味着更改方法的旧代码和新代码都将驻留,并且修补操作只是更新类或模块的调度向量。

将修补(和取消修补)软件集成到操作系统中是非常必要的。

当我在电话系统上工作时,我们通常在系统中使用修补和模块替换功能来加载和测试我们的新功能以及错误修复,早在这些更改提交给构建之前。每个开发人员都需要熟悉修补和更换模块作为他们的工作的一部分。它在这些组件中建立了一定程度的信任,并确保定期执行修补和替换代码。

这些系统的测试比任何其他任何项目都要严格得多。部署系统的完整和部分模型将随时可用。也可能存在虚拟机环境,可以运行和测试完整的负载。单元测试以上各级的测试计划将被编写并正式审查,就像正式的代码检查一样(这些也将是常规的)。

容错系统设计(包括软件设计)至关重要。我并不特别了解航天器系统,但高可用性集群之类的东西可能是标准的,增加了同步和非同步运行的能力,并且能够在故障转移期间在两侧之间传输信息。此系统结构的另一个好处是,您可以拆分系统(如有必要),使用新的软件负载重新加载非活动端,并在生产系统中对其进行测试,而无需连接到系统网络或总线。当您对新软件正常运行感到满意时,您可以简单地故障转移到它。

与修补一样,每个开发人员都应该知道如何进行故障转移,并且应该在开发和测试期间执行这些操作。此外,开发人员应该知道可以强制进行故障转移的每个软件更新问题,并且应该知道如何编写补丁和模块替换,以尽可能避免所需的故障转移。

通常,这些系统是针对这些环境从头开始设计的(硬件,操作系统,编译器和可能的编程语言)。我不认为Windows,Mac OSX,Linux或任何unix变体足够强大。其中一部分是实时要求,但可靠性和生存性的整个问题同样重要。

更新:作为另一个兴趣点,这里是blog by one of the Mars rover drivers。这将使您了解维护航天器的日常生活。整洁的东西!

答案 1 :(得分:5)

我也从未构建过实时系统,但在那些系统中,我怀疑他们的系统没有内存保护机制。他们不需要它,因为他们自己编写了自己的软件。没有内存保护,程序编写另一个程序的内存位置将是微不足道的,这可以用来对正在运行的程序进行热补丁(编写自修改代码是过去流行的技术,没有内存保护用于自修改代码的相同技术可用于修改另一个程序的代码。

Linux已经能够在没有重启的情况下使用Ksplice进行微内核修补一段时间了。这对于在任何停机都可能是灾难性的情况下使用是必要的。我自己从未使用它,但我认为他们使用的技术基本上是这样的:

  

Ksplice可以将补丁应用到Linux   内核无需重启计算机。   Ksplice将统一差异作为输入   和原始内核源代码,   它会更新正在运行的内核   记忆。使用Ksplice不需要   系统之前的任何准备工作   最初启动(正在运行的内核   不需要特别的   例如编译)。为了   生成更新,Ksplice必须   确定内核中的代码   已被源代码更改   补丁。 Ksplice执行此分析   而是在ELF对象代码层   而不是在C源代码层。

     

首先应用补丁Ksplice   冻结计算机的执行所以它   是唯一运行的程序。该   系统验证没有处理器   正在执行中   将被修改的函数   补丁。 Ksplice修改了开头   改变了功能,使他们   而是指向新的更新版本   这些功能,并修改数据   和内存中需要的结构   改变了。最后,Ksplice恢复了   每个处理器在它离开的地方运行   关闭。

     

(来自维基百科)

答案 2 :(得分:3)

嗯,我确信他们有模拟器进行测试和热修补机制。看一下下面的链接文章 - 这里有很好的航天器设计概述。第5节讨论了计算机制。

http://www.boulder.swri.edu/pkb/ssr/ssr-fountain.pdf

值得注意的是:

  • 冗余处理器
  • 上传卡的命令切换,不需要处理器帮助
  • 时间滞后的规则

答案 3 :(得分:2)

我还没有参与航天器工作,但我所研究的机器都是为了拥有一个稳定的空闲状态,可以短暂关闭机器以修补固件。容纳“实时”更新的系统是那些被分解为交互组件的系统,您可以将系统的一个段落下来足够长时间来更新它,其他组件可以继续正常运行,因为它们可以容忍临时停机时间服务组件。

您可以这样做的一种方法是拥有并行(冗余)功能,例如所有执行相同任务的并行计算机,以便可以在服务机器周围路由该进程。这种方法的好处是,您可以将其关闭更长时间以获得更重要的服务,例如定期硬件预防性维护。一旦拥有此功能,支持固件补丁的停机时间就相当容易。

答案 4 :(得分:1)

过去使用的方法之一是使用LISP。