Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

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

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

Введение [ править ]

Любую запущенную программу можно представить в виде кортежа , где - текущее состояние программы, а - текущий программный код. Системы динамического обновления программного обеспечения преобразуют запущенную программу в новую версию . Для этого состояние должно быть преобразовано в ожидаемое представление . Для этого требуется функция преобразователя состояний . Таким образом, DSU преобразует программу в формат . Обновление считается действительным , если и только если текущая программа может быть сведена к точке кортежа , который достижим от начальной точки новой версии программы . [1]

Место в программе, где происходит динамическое обновление, называется точкой обновления . Существующие реализации DSU сильно различаются по обработке точек обновления. В некоторых системах, таких как UpStare и PoLUS , обновление может происходить в любой момент во время выполнения. Компилятор Ginseng попытается определить подходящие места для точек обновления, но также может использовать точки обновления, указанные программистом. Kitsune и Ekiden требуют, чтобы разработчики вручную указывали и называли все точки обновления.

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

Системы DSU как инструменты также можно оценить по простоте использования и понятности для разработчиков. Многие системы DSU, такие как Ginseng , требуют программ для прохождения различных статических анализов. Хотя эти анализы подтверждают полезные для DSU свойства программ, они по своей природе сложны и трудны для понимания. Системы DSU, которые не используют статический анализ, могут потребовать использования специализированного компилятора. Некоторые системы DSU не требуют ни статического анализа, ни специальных компиляторов.

Программы, обновляемые системой DSU, называются целевыми программами . Академические публикации систем DSU обычно включают несколько целевых программ в качестве тематических исследований. vsftpd , OpenSSH , PostgreSQL , Tor , Apache , GNU Zebra , memcached и Redis - все они являются объектами динамического обновления для различных систем. Поскольку мало программ написано с учетом поддержки динамического обновления, модернизация существующих программ является ценным средством оценки системы DSU для практического использования.

Связанные поля [ править ]

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

Подобные методы иногда также используются с целью динамического устранения мертвого кода, чтобы удалить условно мертвый или недоступный код при загрузке или во время выполнения и рекомбинировать оставшийся код, чтобы минимизировать его объем памяти или повысить скорость. [2] [3]

История [ править ]

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

Самая ранняя истинная система Обновления динамического программного обеспечения является DYMOS ( Dy NAMIC Mo тельного S ystem). [4] Представленная в 1983 году в докторской диссертации Инсупа Ли, DYMOS была полностью интегрированной системой, которая имела доступ к интерактивному пользовательскому интерфейсу, компилятору и среде исполнения для варианта Modula и исходному коду. Это позволило DYMOS проверить обновления на соответствие существующей программе.

Реализация [ править ]

Системы DSU должны загружать новый код в работающую программу и преобразовывать существующее состояние в формат, понятный для нового кода. Поскольку многие мотивирующие варианты использования DSU критичны по времени (например, развертывание исправления безопасности в работающей и уязвимой системе), системы DSU должны обеспечивать адекватную доступность обновлений . Некоторые системы DSU также пытаются обеспечить безопасность обновлений перед их применением.

Нет единого канонического решения любой из этих проблем. Обычно система DSU, которая хорошо работает в одной проблемной области, делает это в ущерб другим. Например, эмпирическое тестирование динамических обновлений показывает, что увеличение количества точек обновления приводит к увеличению количества небезопасных обновлений. [5]

Преобразование кода [ править ]

Большинство систем DSU используют подпрограммы в качестве единицы кода для обновлений; однако более новые системы DSU реализуют обновления всей программы. [6] [7]

Если целевая программа реализована на языке виртуальной машины, виртуальная машина может использовать существующую инфраструктуру для загрузки нового кода, поскольку современные виртуальные машины поддерживают загрузку среды выполнения для других вариантов использования, помимо DSU (в основном, для отладки ). В HotSpot JVM поддерживает во время выполнения кода загрузки и система DSU , ориентированная на Java (язык программирования) может использовать эту функцию.

В собственных языках, таких как C или C ++ , системы DSU могут использовать специализированные компиляторы, которые вставляют косвенные ссылки в программу. Во время обновления это косвенное указание обновляется, чтобы указать на самую новую версию. Если система DSU не использует компилятор для статической вставки этих косвенных ссылок, она вставляет их во время выполнения с двоичной перезаписью . Двоичная перезапись - это процесс записи низкоуровневого кода в образ памяти работающей собственной программы для перенаправления функций. Хотя для этого не требуется статический анализ программы, он сильно зависит от платформы.

Экидна и Кицунэ нагрузка нового программный код , с помощью запуска совершенно новой программы, либо через вилочный Exec или динамическую нагрузку . Затем существующее состояние программы переносится в новое пространство программы. [6] [7]

Преобразование состояния [ править ]

Во время обновления состояние программы должно быть преобразовано из исходного представления в представление новой версии. Это называется преобразованием состояния . Функция, которая преобразует объект состояния или группу объектов, называется функцией преобразователя или преобразователем состояния .

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

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

Обновление безопасности [ править ]

Большинство систем DSU пытаются показать некоторые свойства безопасности для обновлений. Наиболее распространенный вариант проверки безопасности - это безопасность типов, когда обновление считается безопасным, если оно не приводит к появлению какого-либо нового кода, работающего со старым представлением состояния, или наоборот.

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

Cons-Freeness - это еще один способ доказать безопасность типа, когда часть кода считается безопасной, если она не обращается к состоянию данного типа способом, который требует знания представления типа. Можно сказать, что этот код не обращается к состоянию конкретно , хотя он может обращаться к состоянию абстрактно . Можно доказать или опровергнуть конфиденциальность для всех типов в любом разделе кода, и система DSU Ginseng использует это для доказательства безопасности типа. [8] [9] Если функция доказанные минусы свободные , он может быть обновлены , даже если он находится под напряжением в стеке, так как это не приведет к ошибке типа путем доступа состояния с использованием старого представления.

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

Существующие системы [ править ]

ДИМОС [ править ]

DYMOS примечателен тем, что это была самая ранняя предложенная система DSU. DYMOS состоит из полностью интегрированной среды для программ, написанных на производной от Modula , предоставляющей системе доступ к интерпретатору команд, исходному коду, компилятору и среде выполнения, аналогично REPL . В DYMOS обновления инициируются пользователем, выполняющим команду в интерактивной среде. Эта команда включает в себя директивы, указывающие, когда может произойти обновление, называемые when-conditions . Информация, доступная DYMOS, позволяет ему обеспечивать безопасность типов обновлений по отношению к работающей целевой программе. [4]

Ksplice, kpatch и kGraft [ править ]

Ksplice - это система DSU, нацеленная только на ядро Linux , что делает себя одной из специализированных систем DSU, которые поддерживают ядро операционной системы в качестве целевой программы. Ksplice использует источник на уровень посмотреть различие , чтобы определить изменения между текущими и обновленными версиями ядра Linux, а затем использует бинарную перезапись для вставки изменения в работающем ядро. [10] Ksplice поддерживается коммерческим предприятием, основанным его первоначальными авторами, Ksplice Inc., которое было приобретено Oracle Corporation в июле 2011 года. [11] Ksplice используется на коммерческой основе и исключительно в составе дистрибутива Oracle Linux . [12]

SUSE разработала kGraft как альтернативу с открытым исходным кодом для исправления «живого» ядра, и Red Hat сделала то же самое с kpatch . Оба они позволяют применять изменения на уровне функций к работающему ядру Linux, полагаясь при этом на механизмы исправления в реальном времени, установленные ftrace . Основное различие между kGraft и kpatch заключается в том, как они обеспечивают согласованность обновленных разделов кода во время выполнения при применении горячих исправлений . kGraft и kpatch были представлены для включения в основную ветку ядра Linux в апреле 2014 г. и мае 2014 г. соответственно [13] [14]а минималистичные основы для установки исправлений в реальном времени были объединены в основную линию ядра Linux в версии ядра 4.0, выпущенной 12 апреля 2015 г. [15]

С апреля 2015 года продолжается работа по переносу kpatch и kGraft на общее ядро ​​динамического исправления, предоставляемое основной веткой ядра Linux. Однако реализация механизмов согласованности на уровне функций, необходимых для безопасных переходов между исходной и исправленной версиями функций, была отложена, потому что стеки вызовов, предоставляемые ядром Linux, могут быть ненадежными в ситуациях, связанных с кодом сборки без надлежащих фреймов стека ; в результате работы по переносу продолжаются по состоянию на сентябрь 2015 года . В попытке повысить надежность стеков вызовов ядра также была разработана специальная утилита пользовательского пространства стека проверки работоспособности с целью проверки времени компиляции ядра.объектные файлы и обеспечение постоянного обслуживания стека вызовов; это также открывает возможность для получения более надежных стеков вызовов как части сообщений ядра oops . [16] [17]

Женьшень [ править ]

Женьшень - это универсальная система DSU. Это единственная система DSU, использующая технику безопасности без консистенции , позволяющую обновлять функции, которые находятся в стеке до тех пор, пока они не осуществляют конкретный доступ к обновленным типам.

Ginseng реализован как компилятор от исходного кода к исходному, написанный с использованием среды C Intermediate Language в OCaml . Этот компилятор вставляет косвенное указание во все вызовы функций и обращения к типам, позволяя Ginseng лениво преобразовывать состояние за счет наложения постоянных накладных расходов на все выполнение программы. [9] Компилятор Ginseng доказывает неприкосновенность всей исходной программы и динамических патчей.

Более поздние версии Ginseng также поддерживают идею безопасности транзакций. Это позволяет разработчикам аннотировать последовательность вызовов функций как логическую единицу, не позволяя обновлениям нарушать семантику программы способами, которые не могут быть обнаружены ни безопасностью активности, ни безопасностью консистенции . Например, в двух версиях OpenSSH, исследованных авторами Ginseng, важный код проверки пользователя перемещался между двумя последовательно вызываемыми функциями. Если была выполнена первая версия первой функции, произошло обновление и была выполнена новая версия второй функции, то проверка никогда не была бы выполнена. Отметка этого раздела как транзакции гарантирует, что обновление не помешает выполнению проверки. [18]

UpStare [ править ]

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

ПОЛЮС [ править ]

Полюс является двоичным переписывания системы ДС для C . Он может обновлять неизмененные программы в любой момент их выполнения. Чтобы обновить функции, он переписывает прелюдию к целевой функции для перенаправления на новую функцию, связывая эти перенаправления с несколькими версиями. Это позволяет избежать постоянных накладных расходов в функциях, которые не были обновлены. [20]

Катана [ править ]

Katana - это исследовательская система, которая обеспечивает ограниченное динамическое обновление (подобно Ksplice и его форкам) для двоичных файлов ELF пользовательского режима . Модель исправлений Katana работает на уровне объектов ELF и, таким образом, может не зависеть от языка, пока целью компиляции является ELF.

Кицунэ и Экиден [ править ]

Экидна и Kitsune два варианта единой системы ДГА, реализующее состояние переноса стиль ДГА для программ , написанных на C . Вместо того, чтобы обновлять функции в рамках одной программы, Ekiden и Kitsune выполняют обновления для всей программы, передавая необходимое состояние между двумя выполнениями. В то время как Ekiden выполняет это путем запуска новой программы с использованием идиомы UNIX fork-exec , сериализации состояния целевой программы и его передачи, Kitsune использует динамическое связывание для выполнения передачи состояния «на месте». Kitsune является производным от кодовой базы Ekiden и может считаться более поздней версией Ekiden.

Ekiden и Kitsune также примечательны тем, что они реализованы в основном как библиотеки уровня приложения, а не специализированные среды выполнения или компиляторы. Таким образом, чтобы использовать Ekiden или Kitsune, разработчик приложения должен вручную отметить состояние, которое должно быть передано, и вручную выбрать точки в программе, где может произойти обновление. Чтобы упростить этот процесс, Kitsune включает в себя специализированный компилятор, который реализует предметно-ориентированный язык для написания преобразователей состояния. [6] [7]

Эрланг [ править ]

Erlang поддерживает динамическое обновление программного обеспечения, хотя это обычно называется « загрузкой горячего кода ». Erlang не требует гарантий безопасности обновлений, но культура Erlang предполагает, что разработчики пишут в защитном стиле, который будет корректно обрабатывать ошибки типа, возникающие при обновлении. [ необходима цитата ]

Пимолт [ править ]

Pymoult - это платформа для создания прототипов динамического обновления, написанная на Python. Он объединяет многие методы из других систем, позволяя их комбинировать и настраивать. Цель этой платформы - позволить разработчикам выбирать методы обновления, которые они считают более подходящими для своих нужд. Например, можно комбинировать ленивое обновление состояния, как в Ginseng, с изменением всего кода приложения, как в Kitsune или Ekiden. [21] [22]

Microsoft Visual C ++ [ править ]

Microsoft использует внутреннюю технологию исправления для Microsoft Visual C ++, которая поддерживает исправление отдельных функций C ++ при сохранении функциональной корректности исправлений. В настоящее время известными приложениями является SQL Server в базе данных SQL Azure. [23]

См. Также [ править ]

  • Горячая замена § Программное обеспечение
  • Настойчивость (информатика)
  • Проверка во время выполнения

Ссылки [ править ]

  1. ^ Гупта, Дипак; Джалоте, Панкадж; Баруа, Гаутам (1996). «Формальная основа для изменения версии программного обеспечения в режиме онлайн» (PDF) . IEEE Transactions по разработке программного обеспечения . 22 (2): 120–131. DOI : 10.1109 / 32.485222 . Архивировано из оригинального (PDF) 07.04.2014.
  2. ^ Пол, Маттиас R .; Фринке, Аксель К. (1997-10-13) [впервые опубликовано в 1991 году], FreeKEYB - Enhanced DOS keyboard and console driver (User Manual) (v6.5 ed.) [1] (NB. Преемник K3PLUS FreeKEYB - это полностью реконфигурируемый драйвер со многими динамически загружаемыми специальными функциями. Он реализует уникальную форму детализированного динамического удаления мертвого кода и методов перемещения во время загрузки, а также самомодифицирующийся код. и реконфигурируемость во время выполнения, чтобы минимизировать объем памяти, близкий к канонической форме, в зависимости от оборудования, операционной системы, другой среды и конфигурации драйвера, а также от выбранного набора функций и локали (около шестидесяти переключателей конфигурации с сотнями вариантов для почти неограниченное количество возможных комбинаций). В процессе сборки используется макроассемблер.а также структура автоматических инструментов предварительной и постобработки, анализирующих временные двоичные файлы для генерации зависимостей и преобразования кода метаданных, которые должны быть встроены в полученный исполняемый файл вместе с двоичным кодом и самоуничтожающимся, расслабляющим и перемещающим загрузчик в динамически (повторно) комбинировать, (пере) загружать, изменять, обновлять или выгружать образ времени выполнения (код и данные) драйвера по запросу. Сложность скрыта в одном автономном файле, поэтому для пользователя обработка такая же, как для обычного (полу) монолитного драйвера / TSR .
  3. ^ Пол, Маттиас R .; Фринке, Аксель К. (16 января 2006 г. ), FreeKEYB - Расширенный международный драйвер клавиатуры и консоли DOS (Руководство пользователя) (предварительная редакция версии 7 ).
  4. ^ а б Ли, Insup (1983). Dymos: система динамической модификации (докторская диссертация). Университет Висконсина - Мэдисон. Архивировано 16 сентября 2003 года.
  5. ^ а б Хайден, Крис; Смит, Эдвард К .; Хардисты, Эрик; Хикс, Майкл; Фостер, Джеффри (2011). «Оценка безопасности динамического обновления программного обеспечения с помощью систематического тестирования» (PDF) . IEEE Transactions по разработке программного обеспечения . IEEE (99). [ постоянная мертвая ссылка ]
  6. ^ a b c Хайден, Крис; Смит, Эдвард К .; Хикс, Майкл; Фостер, Джеффри (2011). «Перенос состояния для четкого и эффективного обновления среды выполнения» (PDF) . Данные инженерно Мастерские (ICDEW), 2011 IEEE 27 -я Международная конференция по . IEEE: 179–184.
  7. ^ a b c Хайден, Крис; Смит, Эдвард К .; Денчев, Михаил; Хикс, Майкл; Фостер, Джеффри (2011). «Kitsune: эффективное универсальное динамическое обновление программного обеспечения для C» (PDF) . Цитировать журнал требует |journal=( помощь )
  8. ^ Стойл, Гарет; Хикс, Майкл; Бирман, Гэвин; Сьюэлл, Питер; Neamtiu, Юлиан (2005). «Mutatis mutandis: безопасное и предсказуемое динамическое обновление программного обеспечения» (PDF) . Труды конференции ACM по принципам языков программирования .
  9. ^ a b Neamtiu, Юлиан; Хикс, Майкл; Стойл, Гарет; Ориоль, Мануэль (2006). «Практическое динамическое обновление программного обеспечения для C» (PDF) . Уведомления ACM SIGPLAN . 41 (6): 72–83. CiteSeerX 10.1.1.625.4663 . DOI : 10.1145 / 1133255.1133991 .  
  10. ^ Арнольд, Джефф; Каашук, М. Франс (2009). Ksplice: автоматические обновления ядра без перезагрузки (PDF) . Материалы 4-й Европейской конференции ACM по компьютерным системам . п. 187. DOI : 10,1145 / 1519065,1519085 . ISBN  9781605584829.
  11. ^ "Оракул и Ксплице" . Проверено 21 июля 2011 .
  12. ^ «Начало работы с Oracle Ksplice» . oracle.com . Проверено 2 августа 2014 .
  13. ^ Poimboeuf, Джош (2014-05-01). «kpatch: динамическое исправление ядра» . LWN.net . Проверено 23 июля 2014 .
  14. ^ Корбет, Джонатан (2014-04-30). «Первоначальная подача kGraft» . LWN.net . Проверено 7 ноября 2014 .
  15. ^ «Ядро Linux 4.0, Раздел 1.2. Исправления в реальном времени» . kernelnewbies.org . 2015-04-26 . Проверено 14 мая 2015 .
  16. ^ Корбет, Джонатан (2015-09-30). «Проверка стека во время компиляции» . LWN.net . Проверено 2 октября 2015 .
  17. ^ Poimboeuf, Джош (2015-09-24). «Документация ядра Linux: Documentation / stack-validation.txt (из патча v13)» . LWN.net . Проверено 2 октября 2015 .
  18. ^ Neamtiu, Юлиан; Хикс, Майкл; Фостер, Джеффри; Pratikakis, Polyvios (2008). «Контекстные эффекты для согласованного с версией динамического обновления программного обеспечения и безопасного параллельного программирования». Материалы конференции {ACM} по принципам языков программирования (POPL) : 37–58.
  19. ^ Макрис, Кристис; Бацци, Рида А. (2009). «Немедленное многопоточное динамическое обновление программного обеспечения с использованием реконструкции стека» (PDF) . Материалы конференции 2009 г. по Ежегодной технической конференции USENIX .
  20. ^ Чен, Хайбо; Ю, Джи; Чен, Ронг; Занг, Бинью; Ю, Пен-Чунг (2007). «ПОЛЮС: мощная система оперативного обновления» (PDF) . 29-я Международная конференция по программной инженерии : 271–281. Архивировано из оригинального (PDF) 26 апреля 2012 года . Проверено 18 декабря 2011 .
  21. ^ Себастьен Мартинес; Фабьен Дагна; Жереми Бюиссон (2013). «Прототипирование методов DSU с использованием Python» . Труды 5-го семинара по актуальным темам обновления программного обеспечения (HotSWUp'13) .
  22. ^ Мартинес, Себастьен (2013-03-06). «Пимолт» . Bitbucket . Проверено 27 ноября 2014 .
  23. ^ «Горячие исправления SQL Server Engine в базе данных SQL Azure» . TECHCOMMUNITY.MICROSOFT.COM . 2019-09-11 . Проверено 15 сентября 2019 .

Внешние ссылки [ править ]

  • Домашняя страница Ksplice
  • Исходный код Ksplice
  • Страница проекта Ginseng и исходный код / ​​UpStare Paper / PoLUS paper
  • Домашняя страница Erlang
  • Катана домашняя страница
  • Сообщение в блоге Whitepaper по исправлению Visual C ++