Обновление программного обеспечения на миллиард миль

Может кто-то здесь пролить свет на то, как НАСА идет о разработке своей архитектуры космического корабля, чтобы гарантировать, что они смогут исправлять ошибки в развернутом коде?

Я никогда не строил никаких систем типа "реального времени", и это вопрос, который пришел на ум после прочтения этой статьи:

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

"Одна из первых важных вещей хорошо когда мы разбудим космический корабль дальше неделя будет загружать почти 20 мелких исправления ошибок и другие улучшения кода к нашей защите от ошибок (или" автопилот "ответ" )".

Ответ 1

Я был разработчиком программного обеспечения для систем телефонной связи общего пользования, которое имеет довольно серьезные ограничения на надежность, доступность, живучесть и производительность, которые подходят для систем космических аппаратов. Я не работал на космических аппаратах (хотя я работал со многими бывшими челночными программистами в то время как в IBM), и я не знаком с VXworks, операционной системой, используемой на многих космических аппаратах (включая марсоходов Rover, которые имеют феноменальную операционную запись).

Одним из основных требований к патчебезопасности является то, что система должна быть сконструирована с нуля для исправления. Это включает в себя структуру модуля, так что новые переменные могут быть добавлены, а методы заменены без нарушения текущих операций. Это часто означает, что старый и новый код для измененного метода будут резидентными, а операция исправления просто обновляет вектор диспетчеризации для класса или модуля.

Обязательно, чтобы программное обеспечение исправления (и исправления) интегрировалось в операционную систему.

Когда я работал над телефонными системами, мы обычно использовали функции исправления и замены модулей в системе для загрузки и тестирования наших новых функций, а также исправлений ошибок задолго до того, как эти изменения были отправлены для сборки. Каждому разработчику должно быть удобно с исправлением и заменой модулей как часть их работы с далями. Он повышает уровень доверия к этим компонентам и гарантирует, что код исправления и замены будет выполняться в обычном режиме.

Тестирование в этих системах гораздо более жесткое, чем все, что вы когда-либо встречали в любом другом проекте. Полные и частичные макеты системы развертывания будут легко доступны. Скорее всего, будут и виртуальные средние машины, где полная загрузка может быть запущена и протестирована. Планы тестирования на всех уровнях выше unit test будут написаны и официально рассмотрены, как и официальные проверки кода (и они также будут рутинными).

Разработка отказоустойчивой системы, включая разработку программного обеспечения, имеет важное значение. Я не знаю конкретно о системах космических аппаратов, но что-то вроде кластеров с высокой доступностью, вероятно, является стандартным, с добавленной возможностью запуска как синхронизированной, так и несинхронизированной и с возможностью передачи информации между сторонами во время перехода на другой ресурс. Дополнительным преимуществом этой системы является то, что вы можете разделить систему (при необходимости), перезагрузить неактивную сторону с новой загрузкой программного обеспечения и протестировать ее в производственной системе, не подключаясь к системной сети или шине. Когда вы удовлетворены тем, что новое программное обеспечение работает правильно, вы можете просто переустановить его.

Как и при патче, каждый разработчик должен знать, как выполнять отказоустойчивость, и должен делать это как во время разработки, так и тестирования. Кроме того, разработчики должны знать каждую проблему обновления программного обеспечения, которая может привести к отказоустойчивости, и должна знать, как писать исправления и замену модулей, которые, когда это возможно, избегают необходимых отказов.

В целом, эти системы разработаны с нуля (аппаратное обеспечение, операционная система, компиляторы и, возможно, язык программирования) для этих сред. Я бы не считал Windows, Mac OSX, Linux или любой вариант unix достаточно надежным. Частью этого являются требования к реальному времени, но весь вопрос о надежности и живучести является столь же критичным.

UPDATE: как еще один интересный объект, здесь блог одним из драйверов Марса. Это даст вам представление о повседневной жизни, связанной с эксплуатацией космического корабля. Аккуратные вещи!

Ответ 2

Я никогда не создавал систему в реальном времени, но в этой системе я подозреваю, что у их системы не будет механизма защиты памяти. Они не нуждаются в нем, так как они сами написали все свое программное обеспечение. Без защиты памяти для программы будет записано место для записи другой программы, и это может быть использовано для горячего исправления запущенной программы (запись самомодифицирующего кода в прошлом была популярной техникой, без защиты памяти те же методы, используемые для самомодифицирующего кода, могут использоваться для изменения другого программного кода).

Linux смог выполнить незначительное исправление ядра без перезагрузки в течение некоторого времени с Ksplice. Это необходимо для использования в ситуациях, когда время простоя может быть катастрофическим. Я никогда не использовал его сам, но я думаю, что техника, которую они используют, в основном такова:

Ksplice может применять исправления для Linux без перезагрузки компьютера. Ksplice принимает в качестве входной единый diff и исходный исходный код ядра, и он обновляет запущенное ядро ​​в Память. Использование Ksplice не требует любая подготовка до того, как система первоначально загружена (работающее ядро не нужно было специально скомпилированный, например). Чтобы генерировать обновление, Ksplice должен определить, какой код в ядре был изменен исходным кодом патч. Ksplice выполняет этот анализ на уровне объектного кода ELF, скорее чем на исходном коде C.

Чтобы применить патч, сначала Ksplice замораживает выполнение компьютера, чтобы он это единственная работающая программа. система проверяет отсутствие процессоров были в середине выполнения функции, которые будут изменены патч. Ksplice изменяет начало измененных функций, чтобы они вместо этого указывайте на новые, обновленные версии этих функций и изменяет данные и структур в памяти, которые необходимо быть изменен. Наконец, Ksplice возобновляет каждый процессор работает там, где он выкл.

(из Википедии)

Ответ 3

Хорошо, я уверен, что у них есть симуляторы для тестирования и механизмы для горячего исправления. Взгляните на связанную статью ниже - там довольно хороший обзор конструкции космического корабля. В разделе 5 обсуждается вычислительная техника.

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

Примечание:

  • Резервные процессоры
  • Переключение команд с помощью карты восходящей линии связи, которая не требует помощи процессора
  • Временные правила

Ответ 4

Я не работал на космических аппаратах, но машины, над которыми я работал, были построены так, чтобы иметь стабильное состояние простоя, где можно коротко отключить машину для исправления прошивки. Системы, в которых размещены "живые" обновления, это те, которые были разбиты на взаимодействующие компоненты, где вы можете сбить один сегмент системы достаточно долго, чтобы обновить ее, а остальные компоненты могут продолжать работать как обычно, поскольку они могут терпеть временный простоя обслуживаемого компонента.

Один из способов сделать это - иметь параллельные (избыточные) возможности, такие как параллельные машины, которые выполняют одну и ту же задачу, так что процесс может быть маршрутизирован вокруг машины под управлением. Преимущество такого подхода заключается в том, что вы можете снизить его на более длительные периоды для более значительного обслуживания, такого как регулярное профилактическое обслуживание оборудования. Как только у вас появится такая возможность, простота простоя для прошивки достаточно проста.

Ответ 5

Одним из подходов, которые использовались в прошлом, является использование LISP.