Каковы методы обеспечения безопасного обновления программного обеспечения во встроенных системах

Обновление программного обеспечения для встроенных устройств часто имеет возможность "обманывать" устройство, например. если власть должна произойти с ошибкой, в то время как в середине написания программного обеспечения FLASH. Два вопроса:

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

Ответ 1

Все зависит от того, насколько критично приложение. Два базовых подхода (резервная копия и загрузчик) также иногда объединяются.

Во многих системах есть только загрузочный загрузчик (например redboot), а затем два банка флэш-памяти (на одном чипе, большинство довольно часто). Затем у загрузчика есть флаг для выбора банка, из которого он загружается. Затем флаг изменится на основе таких событий, как обновления (неудачные или успешные) и т.д.

Итак, при обновлении работающая версия копирует новую нагрузку в резервный банк, проверяет контрольную сумму, переключает флаг загрузки и перезагружает устройство. Устройство перезагрузится в новом банке с новой нагрузкой. После перезагрузки новая загрузка может скопировать себя в резервный банк.

Часто есть также сторожевой таймер с аппаратным обеспечением reset. Таким образом, если прошивка сойдет с ума, он не сможет запустить сторожевой таймер, аппаратное обеспечение reset перезагрузит устройство, а загрузчик будет искать работоспособную нагрузку.

Проект Open Mesh является хорошим примером такого подхода.

Ответ 2

Подробнее...

Загрузите сменное изображение в область памяти, не перезаписывая ЛЮБОЙ из текущего пространства программ. Подождите, пока загрузка не будет завершена, THEN вычислить и сравнить CRC.

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

Если вы - на самом деле - пятно... вы можете сделать одно обновление записи для FLASH, чтобы направить устройство на загрузку с нового местоположения кода. Это будет пинг/понг между двумя полностью отдельными разделами кода. Это самый безопасный способ сделать это:

  • ВСЕГДА имеет невосстанавливаемый загрузочный загрузчик (Nano-loader), который может быть передан для загрузки нового кода, если все пойдет не так.
  • Два отдельных программных пространства
  • Каждое программное пространство имеет поле "CRC", "номер записи" (выше, чем номер другой кодовой страницы) и "неверное" слово (все Fs - не требуют удаления для обновления "недействительного" слова) маркер)
  • После завершения загрузки проверьте CRC. Если это хорошо, запишите "недействительный" маркер в программном пространстве старой версии.
  • Нано-загрузчик проверяет маркер "недействительный", чтобы узнать, для чего загружаться. В случае, если они оба действительны, выполните проверку CRC. Если они все еще действительны, введите более высокий номер записи ожога

О, и когда люди говорят, что контрольная сумма... не "проверяйте сумму"... Сделайте правильный CRC.

Ответ 3

контрольные суммы на внутренней вспышке с резервной копией по умолчанию, если CRC/Checksum не работает. Таким образом, если устройство получает некорректную контрольную сумму, то известно, что обновление было неполным и может reset по умолчанию/предыдущей прошивке, сохраненной на другом устройстве.

Для проверки контрольной суммы требуется предварительная загрузка (возможно, в загрузчик). Статический бит кода.

изменить. В дополнение к комментариям в другом месте. Если вы хотите проверить неправильную прошивку, а не только поврежденную прошивку, ваши checsum/checkdata также могут инкапсулировать информацию о версии (и проверку этого заголовка). Я думаю, что маршрутизаторы Linksys делают это, что может помешать им перепрограммировать с помощью прошивки.

Ответ 4

Контрольные суммы

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

Ответ 5

  • Храните загрузочный загрузчик только для чтения в памяти независимо от того, что
  • В загрузчике разрешите отказоустойчивый метод (например, удерживая кнопку X во время перезагрузки) перезаряжать новую память программ из доступного источника ввода (SD-карта, RS232, что угодно).

Ответ 6

Чтобы ответить на оба вопроса и независимо от каких-либо конкретных аппаратных ресурсов:

  • Убедитесь, что перед запуском любого кода приложения (при запуске или после завершения загрузки) загрузчик выполняет проверку CRC в приложении. Если это неверно, загрузчик не запускает код.

  • Если загрузчик решил, что он не может запустить код приложения, он должен иметь возможность сообщить об этом пользователю и начать загрузку снова.

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

В этих случаях для загружаемого файла имеет смысл иметь небольшой заголовок, который позволяет загрузчику определить, что файл подходит для системы. Этот заголовок также может иметь CRC. Если заголовок действителен для этой системы, а CRC правильный, тогда загрузчик может стереть флеш (но не сам!) И продолжить загрузку. Если нет, он прерывается, не касаясь существующего кода приложения.

Ответ 7

по моему опыту сводится к тому, какова ваша стоимость, если вы можете позволить себе вдвое больше пространства кода/данных на устройстве, сколько вам нужно, и можете перезагрузиться, просто, сохраните новую версию во всем своем дополнительном пространстве, сделайте правильную проверку контрольной суммы на новом представлении, и я также рекомендую глубже проверить новый образ прошивки, поскольку он может быть подделан, если вы этого не сделаете, например, какой-то зашифрованный ключ, гарантирующий происхождение нового воображения. Вы можете сделать это и с внешними воспоминаниями, например, в одном проекте с использованием PIC. У меня была внешняя EEPROM для нового образа прошивки и флаг, который, если бы при загрузке загрузил новое представление из EEPROM.

если вам не повезло, то есть вы не можете позволить себе это пространство, тогда жизнь становится более интересной, и, вероятно, нет гарантированного способа полностью избежать шанса выхода из строя во время обновления. Во всех случаях загрузчик должен находиться в защищенной от записи части памяти, и если вы можете позволить себе пространство, должен иметь базовую форму внешнего подключения, я сделал системы с очень простыми USB-драйверами в загрузчике и системами с ДЕЙСТВИТЕЛЬНО простым UDP только сетевые стеки. Любой из них позволит вам, по крайней мере, представить себе новое устройство, если во время обновления произошел сбой. В этих случаях я настоятельно рекомендую поместить загрузчик в область памяти только для чтения, вы теряете возможность обновлять его, но обновление haywire также не оставит вас с полностью кирпичным устройством. В этом случае загрузчик достаточно мал, чтобы вы могли быть уверены в его правильности.

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

Ответ 8

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

Базовый план - всегда иметь план резервного копирования, который не может не работать.

  • имеют PIC или другой микроконтроллер, который может программировать реальную память процессора. Вы делаете это с помощью контрольной суммы на блоке данных и связываете ее через последовательный порт, USB или даже Ethernet (не смейтесь, это не так сложно). Это устройство НЕ МОЖЕТ быть перепрограммировано в поле (или, возможно, даже КОГДА-ЛИБО), чтобы вы всегда имели план резервного копирования. PIC может запускать веб-серверы по протоколу PPP/SLIP или ehternet, поэтому взаимодействие с ним НЕ обязательно неудобно. Google TCP-Lean. Старайтесь не дрожать. (Сайт подходит для работы). Поместите прогружающий порт в другое место. Безопасность не обеспечивается.

  • Программа работает на основном процессоре и запускает собственный загрузчик. У вас есть три программы: загрузчик, программа обслуживания и настоящая программа.

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

Таким образом, у вас есть обновляемое встроенное приложение, обновляемый загрузчик и обновляемый режим обслуживания. И резервный режим, который не может завершиться неудачей.

Надеюсь, никто не должен найти это полезным.

Ответ 9

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

В некоторых пользовательских платах, которые использовались в некоторых моих проектах, были сменные ПЗУ. Это привет, но менее удобно.