2010-06-20 9 views
31

¿Podría alguien aquí arrojar algo de luz sobre cómo la NASA va a diseñar su arquitectura de nave espacial para asegurarse de que son capaces de parchear errores en el código implementado?Parche de software en mil millones de millas

nunca he construido ningún sistemas de tipo “tiempo real” y esta es una cuestión que ha venido a la mente después de leer este artículo:

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

“Una de las primeras cosas principales que' ll hacer cuando nos despertamos la nave espacial hasta el próximo semana será la posibilidad de subir casi 20 menores correcciones de errores y otras mejoras de código a nuestro software de protección de fallo (o “piloto automático respuesta”) “.

+0

¡Buena pregunta! Llevando el "pensamiento fuera de la caja" al siguiente nivel: abre la última frontera ;-). –

+0

No es una respuesta directa a la pregunta, pero es interesante para la descripción paso a paso de la resolución de problemas: http://spaceflightnow.com/mars/mera/040126spirit.html – starblue

+0

Muchas gracias a todos por sus comentarios. Sin embargo, ¿qué hago? Todas sus respuestas son excelentes y útiles. No sé a quién marcar como la respuesta correcta? Sin mencionar que realmente no hay una respuesta "correcta" a esta pregunta y todos los puntos planteados son válidos. –

Respuesta

14

He sido un desarrollador de software en el teléfono público sistema de conmutación, que tiene limitaciones muy severas sobre la fiabilidad, disponibilidad, capacidad de supervivencia, y el rendimiento que se acercan a lo que necesitan los sistemas de la nave espacial. No he trabajado en naves espaciales (aunque sí trabajé con muchos antiguos programadores de transbordadores mientras estuve en IBM), y no estoy familiarizado con VXworks, el sistema operativo utilizado en muchas naves espaciales (incluyendo los rovers de Marte, que tienen un registro operativo fenomenal)

Uno de los requisitos básicos para patchability es que un sistema debe ser diseñado desde cero para parchear. Esto incluye la estructura del módulo, de modo que se puedan agregar nuevas variables y reemplazar los métodos, sin interrumpir las operaciones actuales. Esto a menudo significa que tanto el código antiguo como el nuevo para un método cambiado serán residentes, y la operación de parchado simplemente actualiza el vector de envío para la clase o módulo.

Es casi obligatorio que el parcheo (y no-aplicación de parches) de software está integrado en el sistema operativo.

Cuando trabajaba en sistemas telefónicos, generalmente utilizábamos funciones de parchado y reemplazo de módulos en el sistema para cargar y probar nuestras nuevas funciones, así como las correcciones de errores, mucho antes de que estos cambios fueran enviados para compilaciones. Todos los desarrolladores deben sentirse cómodos con los parches y el reemplazo de módulos como parte de su trabajo. Desarrolla un nivel de confianza en estos componentes y se asegura de que el código de aplicación y reemplazo se ejerza de manera rutinaria.

Las pruebas son mucho más estrictas en estos sistemas que otra vez has encontrado en ningún otro proyecto. Maquetas completas y parciales del sistema de despliegue estarán disponibles. También es probable que haya entornos de máquinas virtuales, donde la carga completa se puede ejecutar y probar.Los planes de prueba en todos los niveles superiores a la prueba unitaria serán escritos y revisados ​​formalmente, al igual que las inspecciones formales del código (y también serán rutinarias).

El diseño del sistema tolerante a fallas, incluido el diseño del software, es esencial. No sé específicamente sobre los sistemas de naves espaciales, pero algo así como los clústeres de alta disponibilidad es probablemente estándar, con la capacidad adicional de funcionar tanto sincronizados como no sincronizados, y con la capacidad de transferir información entre los lados durante una conmutación por error. Un beneficio adicional de esta estructura de sistema es que puede dividir el sistema (si es necesario), volver a cargar el lado inactivo con una nueva carga de software y probarlo en el sistema de producción sin estar conectado a la red del sistema o al bus. Cuando esté satisfecho de que el nuevo software se está ejecutando correctamente, simplemente puede realizar una conmutación por error.

Al igual que con la aplicación de parches, cada desarrollador debe saber cómo realizar cambios en la conmutación por error, y debe hacerlos durante el desarrollo y las pruebas. Además, los desarrolladores deben conocer cada problema de actualización de software que pueda forzar una conmutación por error, y deben saber cómo escribir parches y reemplazo de módulos que eviten las conmutaciones por error requeridas siempre que sea posible.

En general, estos sistemas están diseñados desde cero (hardware, sistema operativo, compiladores y, posiblemente, el lenguaje de programación) para estos entornos. No consideraría Windows, Mac OSX, Linux o cualquier variante de Unix suficientemente robusto. Parte de eso son los requisitos en tiempo real, pero todo el tema de la confiabilidad y la capacidad de supervivencia es tan crítico.

ACTUALIZACIÓN: Como otro punto de interés, aquí hay un blog by one of the Mars rover drivers. Esto te dará una perspectiva de la vida diaria de mantener una nave espacial operativa. ¡Cosas ordenadas!

+1

Esta es la demo original de Erlang, que presenta algunas de estas ideas. http://video.google.com/videoplay?docid=-5830318882717959520# – liori

3

Bueno, estoy seguro de que tienen simuladores para probar y mecanismos para aplicar hot-patching. Echa un vistazo al siguiente artículo vinculado: hay una muy buena descripción general del diseño de la nave espacial. La Sección 5 discute la maquinaria de cálculo.

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

Es de destacar:

  • procesadores redundantes
  • orden de conmutación por la tarjeta de enlace ascendente que no requiere procesador de ayuda
  • reglas de tiempo lag
5

I' nunca construyo un sistema en tiempo real tampoco, pero en ese sistema, sospecho que su sistema m no tendría un mecanismo de protección de memoria. No lo necesitan, ya que ellos mismos escribieron su propio software. Sin protección de memoria, será trivial que un programa escriba la ubicación de la memoria de otro programa y esto se puede usar para aplicar hot-patch a un programa en ejecución (escribir un código de auto modificación era una técnica popular en el pasado, sin protección de memoria las mismas técnicas utilizadas para el código de auto modificación pueden usarse para modificar el código de otro programa).

Linux ha sido capaz de hacer parches de kernel menores sin reiniciando por un tiempo con Ksplice. Esto es necesario para usar en situaciones donde cualquier tiempo de inactividad puede ser catastrófico. Nunca he utilizado yo mismo, pero creo que la técnica que utiliza es básicamente el siguiente:

Ksplice puede aplicar parches al kernel de Linux sin necesidad de reiniciar el ordenador. Ksplice toma como entrada un diff unificado y el código fuente del kernel original, y actualiza el kernel en ejecución en la memoria . El uso de Ksplice no requiere ninguna preparación antes de que el sistema sea originalmente arrancado (el kernel en ejecución no necesita haber sido compilado especialmente , por ejemplo). Con el fin de generar una actualización, Ksplice debe determinar qué código dentro del kernel ha sido cambiado por el código fuente parche. Ksplice realiza este análisis en la capa de código de objeto ELF, más bien que en la capa de código fuente C.

Para aplicar un parche, Ksplice primero congela la ejecución de una computadora para que sea el único programa en ejecución. El sistema verifica que no hay procesadores estaban en el medio de la ejecución de funciones que serán modificados por el parche . Ksplice modifica el comienzo de las funciones modificadas para que apunten a las nuevas versiones actualizadas de esas funciones y modifique los datos y las estructuras en la memoria que necesitan se cambien. Finalmente, Ksplice reanuda cada procesador ejecutándose donde dejó desactivado.

(de Wikipedia)

2

No he trabajado en la nave espacial, pero las máquinas que he trabajado han sido todos construidos para tener un estado de ralentí estable donde es posible apagar la máquina brevemente parchear el firmware. Los sistemas que han acomodado actualizaciones "en vivo" son aquellos que se dividieron en componentes que interactúan, donde puede reducir un segmento del sistema el tiempo suficiente para actualizarlo y los otros componentes pueden continuar funcionando normalmente, ya que pueden tolerar el tiempo de inactividad temporal del componente revisado.

Una forma de hacerlo es tener capacidades paralelas (redundantes), como máquinas paralelas que realizan la misma tarea, para que el proceso pueda enrutarse alrededor de la máquina en servicio. El beneficio de este enfoque es que puede reducirlo por períodos más largos para un servicio más significativo, como el mantenimiento preventivo de hardware regular. Una vez que tenga esta capacidad, es relativamente fácil soportar el tiempo de inactividad para un parche de firmware.

1

Uno de los enfoques que se ha utilizado en el pasado es el uso de LISP.

Cuestiones relacionadas