Динамическое обновление программного обеспечения
В информатике обновлению динамическое обновление программного обеспечения ( 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 ( динамической модификации система это ) . [4] Представленная в 1983 году в докторской диссертации Инсапа Ли, DYMOS представляла собой полностью интегрированную систему, имевшую доступ к интерактивному пользовательскому интерфейсу, компилятору и среде выполнения для варианта Modula , а также исходному коду. Это позволило DYMOS проверять обновления по типу существующей программы.
Выполнение
[ редактировать ]Системы DSU должны загружать новый код в работающую программу и преобразовывать существующее состояние в формат, понятный новому коду. Поскольку многие мотивационные варианты использования DSU критичны ко времени (например, развертывание исправления безопасности в работающей и уязвимой системе), системы DSU должны обеспечивать адекватную доступность обновлений . Некоторые системы DSU также пытаются убедиться в безопасности обновлений перед их применением.
Ни для одной из этих проблем не существует единого канонического решения. Обычно система DSU, которая хорошо работает в одной проблемной области, делает это в ущерб другим. Например, эмпирическое тестирование динамических обновлений показывает, что увеличение количества точек обновления приводит к увеличению количества небезопасных обновлений. [5]
Преобразование кода
[ редактировать ]Большинство систем DSU используют подпрограммы в качестве единицы кода для обновлений; однако более новые системы DSU реализуют обновления всей программы. [6] [7]
Если целевая программа реализована на языке виртуальной машины , виртуальная машина может использовать существующую инфраструктуру для загрузки нового кода, поскольку современные виртуальные машины поддерживают загрузку во время выполнения для других случаев использования, помимо DSU (в основном, отладка ). HotSpot Java JVM поддерживает загрузку кода во время выполнения, и системы DSU, ориентированные на (язык программирования), могут использовать эту функцию.
В родных языках, таких как C или C++ , системы DSU могут использовать специализированные компиляторы, которые вставляют в программу косвенность. Во время обновления это косвенное направление обновляется и указывает на новейшую версию. Если система DSU не использует компилятор для статической вставки этих косвенных указаний, она вставляет их во время выполнения с перезаписью двоичного кода . Двоичная перезапись — это процесс записи низкоуровневого кода в образ памяти работающей собственной программы для перенаправления функций. Хотя это не требует статического анализа программы, оно сильно зависит от платформы.
Ekiden и Kitsune загружают новый программный код, запуская совершенно новую программу либо с помощью fork-exec, либо с помощью динамической загрузки . Существующее состояние программы затем переносится в новое программное пространство. [6] [7]
Преобразование государства
[ редактировать ]Во время обновления состояние программы должно быть преобразовано из исходного представления в представление новой версии. Это называется трансформацией государства . Функция, которая преобразует объект состояния или группу объектов, называется функцией преобразователя или преобразователем состояния .
Системы DSU могут либо попытаться синтезировать функции преобразователя, либо потребовать, чтобы разработчик предоставил их вручную. Некоторые системы смешивают эти подходы, предполагая некоторые элементы преобразователей и требуя участия разработчика в отношении других.
Эти функции преобразования могут либо применяться к состоянию программы лениво, по мере доступа к каждой части состояния старой версии, либо быстро, преобразуя все состояние во время обновления. Ленивое преобразование гарантирует, что обновление завершится за постоянное время, но также приводит к постоянным накладным расходам при доступе к объекту. Стремительное преобразование требует больше затрат во время обновления, требуя от системы остановки мира, пока все трансформеры работают. Однако активное преобразование позволяет компиляторам полностью оптимизировать доступ к состоянию, избегая накладных расходов в устойчивом состоянии, связанных с ленивым преобразованием.
Обновление безопасности
[ редактировать ]Большинство систем DSU пытаются показать некоторые свойства безопасности для обновлений. Наиболее распространенным вариантом проверки безопасности является безопасность типов, при которой обновление считается безопасным, если оно не приводит к тому, что какой-либо новый код работает на старом представлении состояния, или наоборот.
Типовая безопасность обычно проверяется путем демонстрации одного из двух свойств: безопасности активности или безопасности отсутствия минусов . Программа считается безопасной по активности, если в стеке вызовов во время обновления не существует обновленной функции. Это доказывает безопасность, поскольку управление никогда не сможет вернуться к старому коду, который будет иметь доступ к новым представлениям данных.
Cons-Freeness — это еще один способ доказать безопасность типов, когда раздел кода считается безопасным, если он не обращается к состоянию данного типа способом, требующим знания представления типа. Можно сказать, что этот код не имеет доступа к состоянию конкретно , хотя он может обращаться к состоянию абстрактно . Можно доказать или опровергнуть отсутствие минусов для всех типов в любом разделе кода, и система DSU Ginseng использует это для доказательства типовой безопасности. [8] [9] Если доказано, что функция не содержит cons , ее можно обновить, даже если она находится в стеке, поскольку она не вызовет ошибку типа при доступе к состоянию с использованием старого представления.
Эмпирический анализ отсутствия минусов и безопасности активности, проведенный Hayden et al. покажите, что оба метода допускают наиболее правильные обновления и запрещают большинство ошибочных обновлений. Однако выбор точек обновления вручную приводит к отсутствию ошибок обновления и по-прежнему обеспечивает частую доступность обновлений. [5]
Существующие системы
[ редактировать ]ДИМОС
[ редактировать ]DYMOS примечателен тем, что это была самая ранняя предложенная система DSU. DYMOS состоит из полностью интегрированной среды для программ, написанных на производной Modula , предоставляющей системе доступ к интерпретатору команд, исходному коду, компилятору и среде выполнения, аналогичной REPL . В DYMOS обновления инициируются пользователем, выполняющим команду в интерактивной среде. Эта команда включает в себя директивы, определяющие, когда может произойти обновление, называемые условиями-когда . Информация, доступная 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 г. [update]. In an attempt to improve the reliability of kernel's call stacks, a specialized sanity-check Утилита пользовательского пространства stacktool также была разработана с целью проверки объектных файлов времени компиляции ядра и обеспечения постоянного обслуживания стека вызовов; это также открывает возможность для достижения более надежных стеков вызовов как части сообщений ядра oops . [16] [17]
Женьшень
[ редактировать ]Женьшень — это система DSU общего назначения. Это единственная система DSU, использующая технику безопасности отсутствия минусов , позволяющую ей обновлять функции, находящиеся в стеке, до тех пор, пока они не осуществляют конкретный доступ к обновленным типам.
Ginseng реализован как компилятор исходного кода, написанный с использованием фреймворка C Intermediate Language в OCaml . Этот компилятор вставляет косвенность во все вызовы функций и доступ к типам, позволяя Ginseng лениво преобразовывать состояние за счет наложения постоянных затрат времени на все выполнение программы. [9] Компилятор Ginseng доказывает отсутствие минусов всей исходной программы и динамических патчей.
Более поздние версии Ginseng также поддерживают идею безопасности транзакций. Это позволяет разработчикам аннотировать последовательность вызовов функций как логическую единицу, предотвращая нарушение семантики программы обновлениями способами, которые не обнаруживаются ни безопасностью активности, ни безопасностью отсутствия минусов . Например, в двух версиях OpenSSH , исследованных авторами Ginseng, важный код проверки пользователя был перемещен между двумя последовательно вызываемыми функциями. Если первая версия первой функции выполнилась, произошло обновление и была выполнена новая версия второй функции, то проверка никогда не будет выполнена. Пометка этого раздела как транзакции гарантирует, что обновление не помешает проверке. [18]
UpStare
[ редактировать ]UpStare — система DSU, использующая уникальный механизм обновления — реконструкцию стека . Чтобы обновить программу с помощью UpStare, разработчик указывает сопоставление между любыми возможными кадрами стека. UpStare может использовать это сопоставление для немедленного обновления программы в любой момент, с любым количеством потоков и с любыми функциями, находящимися в стеке. [19]
ПОЛЮС
[ редактировать ]PoLUS — это система DSU с двоичной перезаписью C. для Он способен обновлять неизмененные программы на любом этапе их выполнения. Чтобы обновить функции, он переписывает прелюдию к целевой функции для перенаправления на новую функцию, объединяя эти перенаправления в цепочку для нескольких версий. Это позволяет избежать накладных расходов в устойчивом состоянии в функциях, которые не были обновлены. [20]
Катана
[ редактировать ]Katana — это исследовательская система, которая обеспечивает ограниченное динамическое обновление (аналогично Ksplice и его ответвлениям) для двоичных файлов ELF пользовательского режима . Модель исправлений Katana работает на уровне объектов ELF и, таким образом, может быть независимой от языка, пока целью компиляции является ELF.
Кицунэ и Экиден
[ редактировать ]Ekiden и Kitsune — это два варианта единой системы DSU, реализующей стиль DSU с передачей состояний для программ, написанных 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 С++
[ редактировать ]Microsoft использует внутреннюю технологию исправлений для Microsoft Visual C++, которая поддерживает исправление отдельных функций C++, сохраняя при этом функциональную корректность исправлений. В настоящее время известными приложениями являются SQL Server в базе данных SQL Azure. [23]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Гупта, Дипак; Джалоте, Панкадж; Баруа, Гаутам (1996). «Формальная основа для онлайн-изменения версий программного обеспечения» (PDF) . Транзакции IEEE по разработке программного обеспечения . 22 (2): 120–131. дои : 10.1109/32.485222 . Архивировано из оригинала (PDF) 7 апреля 2014 г.
- ^ Пол, Матиас Р.; Фринке, Аксель К. (13 октября 1997 г.) [впервые опубликовано в 1991 г.], FreeKEYB - Enhanced DOS-клавиатура и драйвер консоли (Руководство пользователя) (изд. v6.5) [1] (Примечание. Преемник K3PLUS FreeKEYB является полностью реконфигурируемый драйвер со многими динамически загружаемыми специальными функциями. Он реализует уникальную форму гранулярного мертвого кода динамического устранения и перемещения на уровне байтов во время загрузки , а также самомодифицирующийся код и возможность реконфигурации во время выполнения, чтобы минимизировать объем занимаемой памяти. каноническая форма в зависимости от оборудования, операционной системы, другой среды и конфигурации драйвера, а также выбранного набора функций и локали (около шестидесяти переключателей конфигурации с сотнями опций для практически неограниченного количества возможных комбинаций. В процессе сборки используется макрос) . ассемблер, а также набор инструментов автоматической предварительной и последующей обработки, анализирующих временные двоичные файлы для генерации зависимостей и морфинга кода метаданных , которые будут встроены в результирующий исполняемый файл. наряду с двоичным кодом и самоудаляющимся, расслабляющим и перемещающим загрузчиком для динамического (повторного) объединения, (пере) загрузки, изменения, обновления или выгрузки образа времени выполнения (кода и данных) драйвера по запросу. Вся сложность скрыта в одном автономном файле, так что для пользователя обработка такая же, как и для обычного (полу)монолитного драйвера/ резидентной программы, которая завершает работу и остается .
- ^ Пол, Матиас Р.; Фринке, Аксель К. (16 января 2006 г.), FreeKEYB - Расширенный международный драйвер клавиатуры и консоли для DOS (Руководство пользователя) (предварительная версия v7)
- ^ Перейти обратно: а б Ли, Инсап (1983). Dymos: система динамической модификации (докторская диссертация). Университет Висконсина – Мэдисон. Архивировано из оригинала 16 сентября 2003 г.
- ^ Перейти обратно: а б Хайден, Крис; Смит, Эдвард К.; Хардисти, Эрик; Хикс, Майкл; Фостер, Джеффри (2011). «Оценка безопасности динамических обновлений программного обеспечения с помощью систематического тестирования» (PDF) . Транзакции IEEE по разработке программного обеспечения (99). IEEE. [ постоянная мертвая ссылка ]
- ^ Перейти обратно: а б с Хайден, Крис; Смит, Эдвард К.; Хикс, Майкл; Фостер, Джеффри (2011). «Передача состояния для понятных и эффективных обновлений среды выполнения» (PDF) . Семинары по инженерии данных (ICDEW), 27-я Международная конференция IEEE 2011 г. по . ИИЭР: 179–184.
- ^ Перейти обратно: а б с Хайден, Крис; Смит, Эдвард К.; Денчев, Михаил; Хикс, Майкл; Фостер, Джеффри (2011). «Kitsune: эффективное динамическое обновление программного обеспечения общего назначения для C» (PDF) .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Стойл, Гарет; Хикс, Майкл; Бирман, Гэвин; Сьюэлл, Питер; Нямтиу, Юлиан (2005). «Mutatis mutandis: Безопасное и предсказуемое динамическое обновление программного обеспечения» (PDF) . Материалы конференции ACM по принципам языков программирования .
- ^ Перейти обратно: а б Нямтиу, Юлиан; Хикс, Майкл; Стойл, Гарет; Ориол, Мануэль (2006). «Практическое динамическое обновление программного обеспечения для C» (PDF) . Уведомления ACM SIGPLAN . 41 (6): 72–83. CiteSeerX 10.1.1.625.4663 . дои : 10.1145/1133255.1133991 .
- ^ Арнольд, Джефф; Каашук, М. Франс (2009). «Ksplice: автоматическое обновление ядра без перезагрузки». Материалы 4-й Европейской конференции ACM по компьютерным системам (PDF) . стр. 187–198. дои : 10.1145/1519065.1519085 . hdl : 1721.1/51698 . ISBN 9781605584829 . S2CID 7720018 .
- ^ «Оракул и КСплице» . Проверено 21 июля 2011 г.
- ^ «Начало работы с Oracle Ksplice» . oracle.com . Проверено 2 августа 2014 г.
- ^ Пуамбёф, Джош (1 мая 2014 г.). «kpatch: динамическое исправление ядра» . LWN.net . Проверено 23 июля 2014 г.
- ^ Корбет, Джонатан (30 апреля 2014 г.). «Первоначальное представление kGraft» . LWN.net . Проверено 7 ноября 2014 г.
- ^ «Ядро Linux 4.0, раздел 1.2. Оперативное обновление» . kernelnewbies.org . 26 апреля 2015 г. Проверено 14 мая 2015 г.
- ^ Корбет, Джонатан (30 сентября 2015 г.). «Проверка стека во время компиляции» . LWN.net . Проверено 2 октября 2015 г.
- ^ Пуамбеф, Джош (24 сентября 2015 г.). «Документация ядра Linux: Documentation/stack-validation.txt (из патча v13)» . LWN.net . Проверено 2 октября 2015 г.
- ^ Нямтиу, Юлиан; Хикс, Майкл; Фостер, Джеффри; Пратикакис, Поливиос (2008). «Контекстные эффекты для динамического обновления программного обеспечения с учетом версий и безопасного параллельного программирования». Материалы конференции {ACM} по принципам языков программирования (POPL) : 37–58.
- ^ Макрис, Кристис; Баззи, Рида А. (2009). «Немедленное многопоточное динамическое обновление программного обеспечения с использованием реконструкции стека» (PDF) . Материалы ежегодной технической конференции USENIX 2009 г.
- ^ Чен, Хайбо; Ю, Цзе; Чен, Ронг; Занг, Бинью; Ю, Пен-Чунг (2007). «ПОЛЮС: мощная система оперативного обновления» (PDF) . 29-я Международная конференция по программной инженерии : 271–281. Архивировано из оригинала (PDF) 26 апреля 2012 г. Проверено 18 декабря 2011 г.
- ^ Себастьен Мартинес; Фабьен Дагнат; Жереми Бюиссон (2013). «Прототипирование методов DSU с использованием Python» . Материалы 5-го семинара «Актуальные темы обновления программного обеспечения» (HotSWUp'13) .
- ^ Мартинес, Себастьен (06 марта 2013 г.). «Пимоулт» . Битбакет . Проверено 27 ноября 2014 г.
- ^ «Горячее обновление ядра SQL Server в базе данных SQL Azure» . TECHCOMMUNITY.MICROSOFT.COM . 11 сентября 2019 г. Проверено 15 сентября 2019 г.