Самомодифицирующийся код
Эта статья нуждается в дополнительных цитатах для проверки . ( апрель 2009 г. ) |
В информатике , самомодифицирующийся код ( SMC или SMoC ) — это код который изменяет свои собственные инструкции во время выполнения — обычно для уменьшения длины пути инструкции и повышения производительности или просто для сокращения повторяющегося аналогичного кода , тем самым упрощая обслуживание . Этот термин обычно применяется только к коду, в котором самомодификация является преднамеренной, а не в ситуациях, когда код случайно изменяет себя из-за ошибки, такой как переполнение буфера .
Самомодифицирующийся код может включать перезапись существующих инструкций или создание нового кода во время выполнения и передачу управления этому коду.
Самомодификация может использоваться как альтернатива методу «установки флагов» и условному ветвлению программы, используемому в первую очередь для уменьшения количества проверок условия.
Этот метод часто используется для условного вызова кода тестирования/отладки без необходимости дополнительных вычислительных затрат для каждого цикла ввода/вывода .
Модификации могут быть выполнены:
- только при инициализации – на основе входных параметров (когда процесс чаще описывается как программная « конфигурация » и в чем-то аналогичен, в аппаратном отношении, установке перемычек на печатных платах ). Изменение указателей входа в программу — это эквивалентный косвенный метод самомодификации, но требующий сосуществования одного или нескольких альтернативных путей команд, увеличивающих размер программы .
- на протяжении всего выполнения («на лету») – на основе определенных состояний программы, достигнутых во время выполнения.
В любом случае модификации могут быть выполнены непосредственно в машинного кода самих инструкциях путем наложения новых инструкций на существующие (например: изменение сравнения и перехода на безусловный переход или, альтернативно, на « NOP »).
В архитектуре IBM System/360 и ее преемниках до z/Architecture инструкция EXECUTE (EX) логически накладывает второй байт целевой инструкции на младшие 8 бит регистра 1. Это обеспечивает эффект самовосстановления. модификация, хотя фактическая инструкция в памяти не изменяется.
Приложение на языках низкого и высокого уровня
[ редактировать ]Самомодификация может быть выполнена различными способами в зависимости от языка программирования и его поддержки указателей и/или доступа к динамическим «движкам» компилятора или интерпретатора:
- наложение существующих инструкций (или частей инструкций, таких как код операции, регистр, флаги или адреса) или
- прямое создание целых инструкций или последовательностей инструкций в памяти
- создание или изменение исходного кода операторов с последующей «мини-компиляцией» или динамической интерпретацией (см. оператор eval )
- динамическое создание всей программы и последующее ее выполнение
Язык ассемблера
[ редактировать ]Самомодифицирующийся код довольно просто реализовать при использовании языка ассемблера . Инструкции могут динамически создаваться в памяти (или накладываться на существующий код в незащищенном хранилище программ). [1] в последовательности, эквивалентной той, которую стандартный компилятор может сгенерировать в виде объектного кода . В современных процессорах могут возникнуть непредвиденные побочные эффекты для кэша ЦП , которые необходимо учитывать. Этот метод часто использовался для тестирования условий «первого раза», как в этом хорошо прокомментированном IBM/360 примере ассемблера . Он использует наложение инструкций для уменьшения длины пути инструкции на (N×1)-1, где N — количество записей в файле (-1 — затраты на выполнение наложения).
SUBRTN NOP OPENED FIRST TIME HERE? * The NOP is x'4700'<Address_of_opened> OI SUBRTN+1,X'F0' YES, CHANGE NOP TO UNCONDITIONAL BRANCH (47F0...) OPEN INPUT AND OPEN THE INPUT FILE SINCE IT'S THE FIRST TIME THRU OPENED GET INPUT NORMAL PROCESSING RESUMES HERE ...
Альтернативный код может включать в себя проверку «флага» каждый раз. Безусловный переход немного быстрее, чем инструкция сравнения, а также уменьшает общую длину пути. В более поздних операционных системах для программ, находящихся в защищенном хранилище, изменение указателя на подпрограмму этот метод нельзя было использовать, поэтому вместо этого использовалось . Указатель будет находиться в динамической памяти и может быть изменен по желанию после первого прохода, чтобы обойти OPEN (необходимость сначала загрузить указатель вместо прямой ветви и ссылки на подпрограмму добавит N инструкций к длине пути, но это приведет к увеличению длины пути). будет соответствующим сокращением N для безусловного перехода, который больше не потребуется).
Ниже приведен пример на Zilog Z80 языке ассемблера . Код увеличивает регистр «B» в диапазоне [0,5]. Инструкция сравнения «CP» модифицируется в каждом цикле.
;==========
ORG 0H
CALL FUNC00
HALT
;==========
FUNC00:
LD A,6
LD HL,label01+1
LD B,(HL)
label00:
INC B
LD (HL),B
label01:
CP $0
JP NZ,label00
RET
;==========
Самомодифицирующийся код иногда используется для преодоления ограничений в наборе команд машины. Например, в наборе команд Intel 8080 невозможно ввести байт из входного порта, указанного в регистре. Входной порт статически закодирован в самой инструкции как второй байт двухбайтовой инструкции. Используя самомодифицирующийся код, можно сохранить содержимое регистра во втором байте инструкции, а затем выполнить измененную команду для достижения желаемого эффекта.
Языки высокого уровня
[ редактировать ]Некоторые компилируемые языки явно допускают самомодифицирующийся код. Например, команда ALTER в COBOL может быть реализована как инструкция ветвления, которая модифицируется во время выполнения. [2] Некоторые методы пакетного программирования предполагают использование самомодифицирующегося кода. Clipper и SPITBOL также предоставляют возможности для явного самомодификации. Компилятор Algol в системах B6700 предлагал интерфейс с операционной системой, посредством которого исполняемый код мог передавать текстовую строку или именованный файл диска компилятору Algol, а затем иметь возможность вызвать новую версию процедуры.
В интерпретируемых языках «машинный код» представляет собой исходный текст и может быть доступен для редактирования «на лету»: в SNOBOL выполняемые исходные операторы являются элементами текстового массива. Другие языки, такие как Perl и Python , позволяют программам создавать новый код во время выполнения и выполнять его с помощью функции оценки , но не позволяют изменять существующий код. Иллюзия модификации (хотя на самом деле машинный код не перезаписывается) достигается за счет изменения указателей функций, как в этом примере JavaScript:
var f = function (x) {return x + 1};
// assign a new definition to f:
f = new Function('x', 'return x + 2');
Макросы Lisp также позволяют генерировать код во время выполнения без анализа строки, содержащей программный код.
Язык программирования Push — это генетическая система программирования , специально предназначенная для создания самомодифицирующихся программ. Хотя это и не язык высокого уровня, но и не такой низкий уровень, как язык ассемблера. [3]
Сложная модификация
[ редактировать ]До появления нескольких окон системы командной строки могли предлагать систему меню, включающую модификацию запущенного командного сценария. Предположим, что файл сценария DOS (или «пакетный») MENU.BAT содержит следующее: [4] [номер 1]
:start SHOWMENU.EXE
При запуске MENU.BAT из командной строки SHOWMENU отображает экранное меню с возможной справочной информацией, примерами использования и т. д. В конце концов пользователь делает выбор, требующий команды SOMENAME выполнения : SHOWMENU завершает работу после перезаписи файла MENU.BAT, чтобы он содержал
:start SHOWMENU.EXE CALL SOMENAME.BAT GOTO start
Поскольку интерпретатор команд DOS не компилирует файл сценария и затем не выполняет его, не считывает весь файл в память перед началом выполнения и не полагается на содержимое буфера записи, при выходе из SHOWMENU интерпретатор команд находит новый команду для выполнения (это вызов файла сценария SOMENAME в каталоге и через протокол, известный SHOWMENU), и после завершения этой команды он возвращается к началу файла сценария и повторно активирует SHOWMENU, готовый к следующему выбору. . Если в меню будет выбран выход, файл будет перезаписан обратно в исходное состояние. Хотя в этом начальном состоянии метка не используется, она или эквивалентный объем текста требуется, поскольку интерпретатор команд DOS запоминает позицию байта следующей команды, когда он должен запустить следующую команду, поэтому файл перезаписывается. должен поддерживать выравнивание, чтобы начальная точка следующей команды действительно была началом следующей команды.
Помимо удобства системы меню (и возможных вспомогательных функций), эта схема означает, что система SHOWMENU.EXE не находится в памяти при активации выбранной команды, что является значительным преимуществом, когда память ограничена. [4] [5]
Контрольные таблицы
[ редактировать ]управляющих таблиц Интерпретаторы можно считать, в каком-то смысле, «самомодифицирующими» значениями данных, извлеченными из записей таблицы (а не специально закодированными вручную в условных операторах формы «IF inputx = 'yyy'»).
Канальные программы
[ редактировать ]IBM В некоторых методах доступа традиционно использовались самомодифицирующиеся канальные программы , где значение, например адрес диска, считывается в область, на которую ссылается канальная программа, где оно используется более поздней командой канала для доступа к диску.
История
[ редактировать ]IBM SSEC , продемонстрированный в январе 1948 года, имел возможность изменять свои инструкции или иным образом обращаться с ними точно так же, как с данными. Однако на практике эта возможность использовалась редко. [6] На заре появления компьютеров самомодифицирующийся код часто использовался для уменьшения использования ограниченной памяти или повышения производительности, или того и другого. Его также иногда использовали для реализации вызовов подпрограмм и возвратов, когда набор команд предусматривал только простые инструкции ветвления или пропуска для изменения потока управления . [7] [8] Такое использование по-прежнему актуально в некоторых ультра- RISC -архитектурах, по крайней мере теоретически; см., например, компьютер с набором одной команды . Кнута Дональда Архитектура MIX также использовала самомодифицирующийся код для реализации вызовов подпрограмм. [9]
Использование
[ редактировать ]Самомодифицирующийся код можно использовать для различных целей:
- Полуавтоматическая оптимизация цикла, зависящего от состояния.
- Динамическая оптимизация кода на месте для повышения скорости в зависимости от среды загрузки. [10] [11] [номер 2]
- Генерация кода во время выполнения или специализация алгоритма во время выполнения или во время загрузки (что популярно, например, в области графики в реальном времени), например, утилита общей сортировки – подготовка кода для выполнения сравнения ключей, описанного в конкретном призыв.
- Изменение встроенного состояния объекта . или имитация высокоуровневой замыканий конструкции
- Исправление вызова адреса подпрограммы ( указателя ), обычно выполняемое во время загрузки/инициализации динамических библиотек или же при каждом вызове, исправление внутренних ссылок подпрограммы на ее параметры, чтобы использовать их фактические адреса (т.е. косвенная самомодификация).
- Эволюционные вычислительные системы, такие как нейроэволюция , генетическое программирование и другие эволюционные алгоритмы .
- Сокрытие кода для предотвращения обратного проектирования (с помощью дизассемблера или отладчика ) или для уклонения от обнаружения программным обеспечением для сканирования на вирусы/шпионы и т.п.
- Заполнение 100% памяти (в некоторых архитектурах) повторяющимся шаблоном повторяющихся кодов операций для удаления всех программ и данных или для записи оборудования или выполнения тестов ОЗУ . [12]
- Сжатие кода для распаковки и выполнения во время выполнения, например, когда память или дисковое пространство ограничены. [10] [11]
- Некоторые очень ограниченные наборы команд не оставляют другого выбора, кроме как использовать самомодифицирующийся код для выполнения определенных функций. Например, компьютер с одним набором команд (OISC), использующий только «инструкцию вычитания и перехода в случае отрицательного результата», не может выполнять косвенное копирование (что-то вроде эквивалента «*a = **b» в язык C ) без использования самомодифицирующегося кода.
- Загрузка . Ранние микрокомпьютеры часто использовали самомодифицирующийся код в своих загрузчиках. Поскольку загрузчик вводился через переднюю панель при каждом включении питания, не имело значения, ли загрузчик изменялся . Однако даже сегодня многие загрузчики самоперемещаются , а некоторые даже самомодифицируются. [номер 3]
- Изменение инструкций по отказоустойчивости. [13]
Оптимизация цикла, зависящего от состояния
[ редактировать ]repeat N times { if STATE is 1 increase A by one else decrease A by one do something with A }
Самомодифицирующийся код в этом случае будет просто переписывать цикл следующим образом:
repeat N times { increase A by one do something with A when STATE has to switch { replace the opcode "increase" above with the opcode to decrease, or vice versa } }
в двух состояниях Обратите внимание, что замену кода операции можно легко записать как «xor var по адресу со значением «opcodeOf(Inc) xor opcodeOf(dec)».
Выбор этого решения должен зависеть от значения N и частоты изменения состояния.
Специализация
[ редактировать ]Предположим, для некоторого большого набора данных необходимо рассчитать набор статистических данных, таких как среднее значение, экстремумы, расположение экстремумов, стандартное отклонение и т. д. В общей ситуации может существовать возможность связывания весов с данными, поэтому каждый x i связан с aw i , и вместо проверки наличия весов для каждого значения индекса могут быть две версии расчета: одна для использования с гирями и без, с одним испытанием в начале. Теперь рассмотрим еще один вариант: с каждым значением может быть связано логическое значение, указывающее, следует ли это значение пропускать или нет. Это можно решить, создав четыре пакета кода, по одному для каждой перестановки и результатов раздувания кода. В качестве альтернативы, массивы веса и пропуска можно объединить во временный массив (с нулевыми весами для пропущенных значений) за счет затрат на обработку, но все равно будет раздуваться. Однако при модификации кода к шаблону расчета статистики можно было бы при необходимости добавить код пропуска нежелательных значений и применения весов. Не будет повторного тестирования опций, и доступ к массиву данных будет осуществляться один раз, как и к массивам весов и пропусков, если они задействованы.
Использовать как камуфляж
[ редактировать ]Самомодифицирующийся код сложнее анализировать, чем стандартный код, и поэтому его можно использовать в качестве защиты от обратного проектирования и взлома программного обеспечения . Самомодифицирующийся код использовался для сокрытия инструкций по защите от копирования в дисковых программах 1980-х годов для таких систем, как IBM PC-совместимые и Apple II . Например, на IBM PC гибких дисков инструкция доступа к дисководу int 0x13
не будет отображаться в образе исполняемой программы, но будет записан в образ памяти исполняемого файла после того, как программа начнет выполняться.
Самомодифицирующийся код также иногда используется программами, которые не хотят раскрывать свое присутствие, например компьютерными вирусами и некоторыми шеллкодами . Вирусы и шеллкоды, использующие самомодифицирующийся код, чаще всего делают это в сочетании с полиморфным кодом . Модификация фрагмента работающего кода также используется в некоторых атаках, таких как переполнение буфера .
Самореферентные системы машинного обучения
[ редактировать ]Традиционные системы машинного обучения имеют фиксированный, заранее запрограммированный алгоритм обучения для корректировки своих параметров . Однако с 1980-х годов Юрген Шмидхубер опубликовал несколько самомодифицирующихся систем с возможностью изменения собственного алгоритма обучения. Они избегают опасности катастрофических самоперезаписей, гарантируя, что самомодификации выживут только в том случае, если они будут полезны в соответствии с заданной пользователем функцией приспособленности , ошибки или вознаграждения . [14]
Операционные системы
[ редактировать ]Ядро Linux, в частности, широко использует самомодифицирующийся код; это делается для того, чтобы иметь возможность распространять один двоичный образ для каждой основной архитектуры (например, IA-32 , x86-64 , 32-битный ARM , ARM64 ...), одновременно адаптируя код ядра в памяти во время загрузки в зависимости от конкретного процессора. обнаружена модель, например, чтобы иметь возможность воспользоваться новыми инструкциями ЦП или обойти аппаратные ошибки. [15] [16] В меньшей степени ядро DR-DOS также оптимизирует критичные к скорости разделы себя во время загрузки в зависимости от базового поколения процессора. [10] [11] [номер 2]
Несмотря на это, на метауровне программы все равно могут изменять свое поведение, изменяя данные, хранящиеся где-то еще (см. Метапрограммирование ), или используя полиморфизм .
Ядро Синтеза Массалина
[ редактировать ]Synthesis Ядро представлено в Алексии Массалин . докторской диссертации диссертация [17] [18] представляет собой крошечное ядро Unix , использующее структурированный или даже объектно -ориентированный подход к самомодифицирующемуся коду, где код создается для отдельных объектов , таких как дескрипторы файлов. Генерация кода для конкретных задач позволяет ядру Synthesis (как это может делать JIT-интерпретатор) применять ряд оптимизаций, таких как свертывание констант или исключение общих подвыражений .
Ядро Synthesis было очень быстрым, но было полностью написано на ассемблере. В результате отсутствие переносимости не позволило идеям оптимизации Массалина быть внедрены в любое производственное ядро. Однако структура методов предполагает, что их можно охватить языком более высокого уровня , хотя и более сложным, чем существующие языки среднего уровня. Такой язык и компилятор могли бы позволить разрабатывать более быстрые операционные системы и приложения.
Пол Хэберли и Брюс Карш возражали против «маргинализации» самомодифицирующегося кода и оптимизации в целом в пользу снижения затрат на разработку. [19]
Взаимодействие кэша и самомодифицирующегося кода
[ редактировать ]В архитектурах без связанного кеша данных и инструкций (например, некоторые ядра SPARC , ARM и MIPS ) синхронизация кеша должна выполняться явно модифицирующим кодом (очистить кеш данных и сделать недействительным кеш инструкций для измененной области памяти).
В некоторых случаях короткие участки самомодифицирующегося кода на современных процессорах выполняются медленнее. Это связано с тем, что современный процессор обычно пытается хранить блоки кода в своей кэш-памяти. Каждый раз, когда программа перезаписывает часть себя, переписанная часть должна быть снова загружена в кеш, что приводит к небольшой задержке, если модифицированный кодлет использует одну и ту же строку кэша с модифицирующим кодом, как в случае, когда измененная память Адрес находится в пределах нескольких байтов от адреса модифицирующего кода.
Проблема недействительности кэша на современных процессорах обычно означает, что самомодифицирующийся код будет работать быстрее только тогда, когда модификация будет происходить редко, например, в случае переключения состояния внутри внутреннего цикла. [ нужна ссылка ]
Большинство современных процессоров загружают машинный код перед его выполнением, а это означает, что если будет изменена инструкция, находящаяся слишком близко к указателю инструкции , процессор не заметит этого, а вместо этого выполнит код так, как он был до изменения. См. очередь ввода предварительной выборки (PIQ). Процессоры ПК должны правильно обрабатывать самомодифицирующийся код по соображениям обратной совместимости, но они далеко не эффективны в этом. [ нужна ссылка ]
Проблемы безопасности
[ редактировать ]Из-за последствий самомодифицирующегося кода для безопасности все основные операционные системы стараются удалять такие уязвимости по мере их появления. Проблема обычно не в том, что программы намеренно изменяют себя, а в том, что они могут быть злонамеренно изменены с помощью эксплойта .
Одним из механизмов предотвращения вредоносной модификации кода является функция операционной системы под названием W^X (что означает «записать или выполнить»). Этот механизм запрещает программе делать любую страницу памяти доступной для записи и выполнения. Некоторые системы предотвращают изменение страницы, доступной для записи, на исполняемую, даже если разрешение на запись удалено. [ нужна ссылка ] Другие системы предоставляют своего рода « черный ход », позволяющий нескольким сопоставлениям страниц памяти иметь разные разрешения. Относительно портативный способ обойти W^X — создать файл со всеми разрешениями, а затем дважды сопоставить его с памятью. В Linux можно использовать недокументированный флаг общей памяти SysV, чтобы получить исполняемую общую память без необходимости создания файла. [ нужна ссылка ]
Преимущества
[ редактировать ]- быстрые пути Для выполнения программы можно установить , сокращая количество повторяющихся условных переходов .
- Самомодифицирующийся код может повысить эффективность алгоритмов .
Недостатки
[ редактировать ]Самомодифицирующийся код труднее читать и поддерживать, поскольку инструкции в листинге исходной программы не обязательно являются инструкциями, которые будут выполняться. Самомодификация, заключающаяся в замене указателей функций, может быть не такой загадочной, если ясно, что имена вызываемых функций являются заполнителями для функций, которые будут идентифицированы позже.
Самомодифицирующийся код можно переписать как код, который проверяет флаг и переходит к альтернативным последовательностям в зависимости от результата теста, но самомодифицирующийся код обычно работает быстрее.
Самомодифицирующийся код конфликтует с аутентификацией кода и может потребовать исключений из политик, требующих, чтобы весь код, работающий в системе, был подписан.
Модифицированный код должен храниться отдельно от его исходной формы, что противоречит решениям по управлению памятью, которые обычно удаляют код из ОЗУ и при необходимости перезагружают его из исполняемого файла.
На современных процессорах с конвейером инструкций код, который часто изменяет себя, может работать медленнее, если он изменяет инструкции, которые процессор уже прочитал из памяти в конвейер. На некоторых таких процессорах единственный способ гарантировать правильное выполнение измененных инструкций — это очистить конвейер и перечитать множество инструкций.
Самомодифицирующийся код вообще нельзя использовать в некоторых средах, например в следующих:
- Прикладное программное обеспечение, работающее под операционной системой со строгой безопасностью W^X, не может выполнять инструкции на страницах, на которые ему разрешено писать — только операционной системе разрешено как записывать инструкции в память, так и позднее выполнять эти инструкции.
- Многие с гарвардской архитектурой микроконтроллеры не могут выполнять инструкции в памяти чтения-записи, а только инструкции в памяти, в которую он не может записывать, ПЗУ или несамопрограммируемой флэш-памяти .
- Многопоточное приложение может иметь несколько потоков, выполняющих один и тот же раздел самомодифицирующегося кода, что может приводить к ошибкам вычислений и сбоям приложения.
См. также
[ редактировать ]- Перекрывающийся код
- Полиморфный код
- Полиморфный движок
- Постоянная структура данных
- код ПРИРОДА
- Алгоритмическая эффективность
- Данные как код
- оценочный оператор
- IBM 1130 (пример)
- Компиляция «точно в срок» : этот метод часто может дать пользователям многие преимущества самомодифицирующегося кода (за исключением размера памяти) без недостатков.
- Динамическое устранение мертвого кода
- Гомоконичность
- ПКАСТЛ
- Куайн (вычисления)
- Самовоспроизведение
- Рефлексивное программирование
- Патч Monkey : модификация кода времени выполнения, не затрагивающая исходный исходный код программы.
- Расширяемое программирование : парадигма программирования, в которой язык программирования может изменять свой собственный синтаксис.
- Самомодифицирующийся компьютерный вирус
- Самостоятельный хостинг
- Синтетическое программирование
- Загрузка компилятора
- Модифицируемый микрокод
Примечания
[ редактировать ]- ^ В более поздних версиях DOS (начиная с версии 6.0) появилась внешняя команда CHOICE (в DR-DOS также внутренняя команда и CONFIG.SYS директива SWITCH ), поэтому для этого конкретного примера применения системы меню больше не было необходимости относятся к самомодифицирующимся пакетным заданиям, однако для других приложений это по-прежнему остается жизнеспособным решением.
- ^ Jump up to: а б Например, при работе на процессорах 386 или более поздних версиях Novell DOS 7 , а также DR-DOS 7.02 и более поздних версиях будут динамически заменяться некоторые 16-битные последовательности по умолчанию.
REP MOVSW
(«копировать слова») инструкции в образе времени выполнения ядра на 32-битной версии.REP MOVSD
инструкции («копировать двойные слова») при копировании данных из одной ячейки памяти в другую (и вдвое меньше необходимых повторений), чтобы ускорить передачу данных на диске. Пограничные случаи, такие как нечетное количество, учтены. [10] [11] - ^ Например, DR-DOS MBR и загрузочные секторы (которые также содержат таблицу разделов и блок параметров BIOS , оставляя для кода менее 446 или 423 байта) традиционно могли найти загрузочный файл в FAT12 или FAT16 файле . системы сами по себе и загружают ее в память целиком, в отличие от своих аналогов MS-DOS / PC DOS , которые вместо этого полагались на то, что системные файлы занимали первые две записи каталога файловой системы и первые три сектора IBMBIO. COM должен храниться в начале области данных в смежных секторах, содержащих вторичный загрузчик для загрузки оставшейся части файла в память (требуется, чтобы SYS позаботился обо всех этих условиях). Когда FAT32 и LBA была добавлена поддержка , Microsoft даже перешла на требование 386 инструкций и разделила загрузочный код на два сектора из соображений размера, что не было вариантом для DR-DOS, поскольку это привело бы к нарушению обратной совместимости и кросс-совместимости с другими операционными системами. системах в сценариях мультизагрузки и цепной загрузки , а также со старыми ПК . Вместо этого загрузочные сектора DR-DOS 7.07 прибегали к самомодифицирующемуся коду, программированию на уровне кода операции на машинном языке , контролируемому использованию (документированных) побочных эффектов , многоуровневому перекрытию данных/кода и методам алгоритмического свертывания , чтобы по-прежнему уместить все в единое целое. физический сектор размером всего 512 байт, не отказываясь при этом от своей расширенной функциональности.
Ссылки
[ редактировать ]- ^ «ХП 9100А/Б» . MoHPC — Музей калькуляторов HP . 1998. Перекрывающиеся данные и память программ / Самомодифицирующийся код. Архивировано из оригинала 23 сентября 2023 г. Проверено 23 сентября 2023 г.
- ^ «Заявление ALTER». Справочник по языку COBOL . Микро Фокус .
- ^ Спектор, Ли. «Эволюционные вычисления с помощью Push: Push, PushGP и Pushpop» . Проверено 25 апреля 2023 г.
- ^ Jump up to: а б Фосдал, Ларс (2001). «Самоизменяющийся пакетный файл» . Архивировано из оригинала 21 апреля 2008 г.
- ^ Пол, Матиас Р. (13 октября 1996 г.) [21 августа 1996 г., 1994]. Концепции поддержки задач администрирования в сетях ПК и их реализация для конкретной среды локальной сети Novell с использованием пакетного языка DOS . 3.11 (на немецком языке). Ахен, Германия: Председатель кафедры коммуникационных сетей ( ComNets ) и Института переработки пластмасс (IKV), RWTH. стр. 51, 71–72. (110+3 страницы, дискета) (Примечание. Проектирование и реализация централизованно управляемой модульной распределенной системы управления для автоматической настройки клиентов и развертывания программного обеспечения с механизмом самовосстанавливающегося обновления в средах локальных сетей на основе самовоспроизводящихся и косвенно самомодифицирующихся пакетных заданий с нулевым потреблением памяти вместо необходимости использования программного обеспечения для постоянного управления на клиентах.)
- ^ Баше, Чарльз Дж.; Бухгольц, Вернер ; Хокинс, Джордж В.; Ингрэм, Дж. Джеймс; Рочестер, Натаниэль (сентябрь 1981 г.). «Архитектура первых компьютеров IBM» (PDF) . Журнал исследований и разработок IBM . 25 (5): 363–376. CiteSeerX 10.1.1.93.8952 . дои : 10.1147/rd.255.0363 . ISSN 0018-8646 . Проверено 25 апреля 2023 г. п. 365:
SSEC был первым действующим компьютером, способным обрабатывать собственные хранимые инструкции точно так же, как данные, модифицировать их и действовать в соответствии с результатом.
- ^ Миллер, Бартон П. (30 октября 2006 г.). «Исправление двоичного кода: древнее искусство, усовершенствованное для 21 века» . Серия выдающихся лекторов по информатике Triangle - семинары 2006–2007 гг. Государственный университет Северной Каролины , факультет компьютерных наук . Проверено 25 апреля 2023 г.
- ^ Венцль, Матиас; Мерздовник, Георг; Ульрих, Йоханна; Вейппль, Эдгар Р. (июнь 2019 г.) [февраль 2019 г., ноябрь 2018 г., май 2018 г.]. «От взлома к сложной технике — обзор бинарной перезаписи» (PDF) . Обзоры вычислительной техники ACM . 52 (3). Вена, Австрия: 49:1–49:36 [49:1]. дои : 10.1145/3316415 . S2CID 195357367 . Статья 49. Архивировано (PDF) из оригинала 15 января 2021 г. Проверено 28 ноября 2021 г. п. 49:1:
[…] Первоначально двоичная перезапись была мотивирована необходимостью изменять части программы во время выполнения (например, исправление во время выполнения PDP-1 в 1960-х годах) […]
(36 страниц) - ^ Кнут, Дональд Эрвин (2009) [1997]. «MMIX 2009 — RISC-компьютер третьего тысячелетия» . Архивировано из оригинала 27 ноября 2021 г. Проверено 28 ноября 2021 г.
- ^ Jump up to: а б с д «Набор машиночитаемого исходного кода Caldera OpenDOS (MRS) 7.01» . Кальдера, Инк ., 1 мая 1997 г. Архивировано из оригинала 07 августа 2021 г. Проверено 02 января 2022 г. [1]
- ^ Jump up to: а б с д Пол, Матиас Р. (2 октября 1997 г.). «Обновление Caldera OpenDOS 7.01/7.02 Alpha 3 IBMBIO.COM README.TXT» . Архивировано из оригинала 4 октября 2003 г. Проверено 29 марта 2009 г. [2]
- ^ Уилкинсон, Уильям «Билл» Альберт (2003) [1996, 1984]. «Червь H89: тестирование памяти H89» . Страница компании Билла Уилкинсона Heath . Архивировано из оригинала 13 декабря 2021 г. Проверено 13 декабря 2021 г.
[…] Помимо получения инструкции, Z80 использует половину цикла для обновления динамического ОЗУ . […] поскольку Z80 должен тратить половину каждого цикла выборки инструкций на выполнение других задач, у него не так много времени для выборки байта инструкции , как для байта данных. Если одна из микросхем ОЗУ в той области памяти, к которой осуществляется доступ, работает немного медленно, Z80 может получить неверную битовую комбинацию при получении инструкции, но получить правильную при чтении данных. […] встроенный тест памяти не выявляет проблемы такого типа […] это строго тест чтения/записи данных. Во время теста все инструкции извлекаются из ПЗУ , а не из ОЗУ […], в результате чего H89 проходит тест памяти, но все еще работает хаотично в некоторых программах. […] Это программа, которая проверяет память, перемещаясь по ОЗУ. При этом ЦП печатает текущий адрес программы на CRT , а затем извлекает инструкцию по этому адресу. Если микросхемы ОЗУ по этому адресу в порядке, ЦП перемещает тестовую программу в следующую ячейку памяти, печатает новый адрес и повторяет процедуру. Но если одна из микросхем ОЗУ достаточно медленная, чтобы возвращать неверную битовую комбинацию, ЦП неправильно интерпретирует инструкцию и ведет себя непредсказуемо. Однако вполне вероятно, что дисплей заблокируется, показывая адрес неисправной микросхемы. Это сужает проблему до восьми микросхем, что является улучшением по сравнению с необходимостью проверять целых 32. […] Программа […] выполнит проверку на наличие червей, отправив инструкцию RST 7 (RESTART 7) из нижнего конца памяти. до последнего рабочего адреса. Остальная часть программы остается неподвижной и занимается отображением текущего местоположения команды RST 7 и ее перемещением . Кстати, программа называется тестом на червяков , потому что по мере продвижения инструкции RST 7 по памяти она оставляет после себя след NOP скользкий (НЕТ ОПЕРАЦИИ). […]
- ^ Ортис, Карлос Энрике (29 августа 2015 г.) [18 августа 2007 г.]. «О самомодифицирующемся коде и ОС космического корабля» . Проверено 25 апреля 2023 г.
- ^ Юргена Шмидхубера Публикации о самомодифицирующемся коде для самореферентных систем машинного обучения.
- ^ Пальцев, Евгений (30 января 2020 г.). «Самомодифицирующийся код в ядре Linux — что, где и как» . Проверено 27 ноября 2022 г.
- ^ Вечоркевич, Павел. «Альтернативы ядра Linux» . Проверено 27 ноября 2022 г.
- ^ Пу, Калтон ; Массалин, Генри ; Иоаннидис, Джон (1992). Синтез: эффективная реализация фундаментальных служб операционной системы (PDF) (кандидатская диссертация). Нью-Йорк, США: Департамент компьютерных наук Колумбийского университета . Номер заказа UMI GAX92-32050 . Проверено 25 апреля 2023 г. [3]
- ^ Хенсон, Валери (20 февраля 2008 г.). «KHB: Синтез: эффективная реализация фундаментальных сервисов операционных систем» . LWN.net . Архивировано из оригинала 17 августа 2021 г. Проверено 19 мая 2022 г.
- ^ Хэберли, Пол ; Карш, Брюс (3 февраля 1994 г.). «Ио Ной Боччони - История футуристического программирования» . Графика-обскура . Проверено 25 апреля 2023 г.
Дальнейшее чтение
[ редактировать ]- Окессон, Линус (31 марта 2013 г.). «Декодирование GCR на лету» . Архивировано из оригинала 21 марта 2017 г. Проверено 21 марта 2017 г.
- Бюркерт, Кристиан Феликс (20 марта 2012 г.). Библиотека для PDF самомодификации во время выполнения на Java ( ) (Диссертация) (на немецком языке). Саарский университет , Факультет науки и технологий I, факультет компьютерных наук. Архивировано (PDF) из оригинала 18 августа 2023 г. Проверено 18 августа 2023 г. (80 страниц)