stringtranslate.com

Самомодифицирующийся код

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

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

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

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

Модификации могут быть выполнены:

В любом случае модификации могут быть выполнены непосредственно в самих инструкциях машинного кода путем наложения новых инструкций на существующие (например: изменение сравнения и перехода на безусловный переход или, альтернативно, на « NOP »).

В архитектуре IBM System/360 и ее преемниках до z/Architecture инструкция EXECUTE (EX) логически накладывает второй байт целевой инструкции на младшие 8 бит регистра 1. Это обеспечивает эффект самовосстановления. модификация, хотя фактическая инструкция в памяти не изменяется.

Приложение на языках низкого и высокого уровня

Самомодификация может быть выполнена различными способами в зависимости от языка программирования и его поддержки указателей и/или доступа к динамическим компиляторам или интерпретаторам «движков»:

язык ассемблера

Самомодифицирующийся код довольно просто реализовать при использовании языка ассемблера . Инструкции могут динамически создаваться в памяти (или накладываться на существующий код в незащищенном хранилище программ) [1] в последовательности, эквивалентной той, которую стандартный компилятор может генерировать как объектный код . В современных процессорах могут возникнуть непредвиденные побочные эффекты для кэша ЦП , которые необходимо учитывать. Этот метод часто использовался для тестирования условий «первого раза», как в этом хорошо прокомментированном примере ассемблера IBM/360 . Он использует наложение инструкций для уменьшения длины пути инструкции на (N×1)-1, где N — количество записей в файле (-1 — затраты на выполнение наложения).

SUBRTN NOP ОТКРЫТ В ПЕРВЫЙ РАЗ ЗДЕСЬ?* NOP — x'4700'<Адрес_открытого>. OI SUBRTN+1,X'F0' ДА, ИЗМЕНИТЬ NOP НА БЕЗУСЛОВНУЮ ВЕТВЬ (47F0...) ОТКРЫТЬ ВВОД И ОТКРЫТЬ ВХОДНОЙ ФАЙЛ, ПОСКОЛЬКУ ЭТО ПЕРВЫЙ РАЗОТКРЫТО ПОЛУЧИТЬ ВВОД НОРМАЛЬНАЯ ОБРАБОТКА ВОЗОБНОВЛЯЕТСЯ ЗДЕСЬ ...

Альтернативный код может включать в себя проверку «флага» каждый раз. Безусловный переход немного быстрее, чем инструкция сравнения, а также уменьшает общую длину пути. В более поздних операционных системах для программ, находящихся в защищенном хранилище, этот метод нельзя было использовать, поэтому вместо этого использовалось изменение указателя на подпрограмму . Указатель будет находиться в динамической памяти и может быть изменен по желанию после первого прохода, чтобы обойти 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:

 вар f = функция ( x ) { return x + 1 };         // присваиваем f новое определение: f = new Function ( 'x' , 'return x + 2' );     

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

Язык программирования Push — это генетическая система программирования , специально предназначенная для создания самомодифицирующихся программ. Хотя это и не язык высокого уровня, но и не такой низкий уровень, как язык ассемблера. [3]

Сложная модификация

До появления нескольких окон системы командной строки могли предлагать систему меню, включающую модификацию запущенного командного сценария. Предположим, что файл сценария DOS (или «пакетный») MENU.BAT содержит следующее: [4] [nb 1]

 :начинать ШОУМЕНУ.EXE

При запуске MENU.BAT из командной строки SHOWMENU отображает экранное меню с возможной справочной информацией, примерами использования и т. д. В конце концов пользователь делает выбор, который требует выполнения команды SOMENAME : SHOWMENU завершает работу после перезаписи файла MENU.BAT, чтобы он содержал

 :начинать ШОУМЕНУ.EXE ПОЗВОНИТЕ КАКИМ-ТО ИМЯ .BAT ПЕРЕЙТИ к началу

Поскольку интерпретатор команд DOS не компилирует файл сценария и затем не выполняет его, не считывает весь файл в память перед началом выполнения и не полагается на содержимое буфера записи, при выходе из SHOWMENU интерпретатор команд находит новый команду для выполнения (это вызов файла сценария SOMENAME в каталоге и по протоколу, известному SHOWMENU), и после завершения этой команды он возвращается к началу файла сценария и повторно активирует SHOWMENU, готовый к следующему выбору. . Если в меню будет выбран выход, файл будет перезаписан обратно в исходное состояние. Хотя в этом начальном состоянии метка не используется, она или эквивалентный объем текста требуется, поскольку интерпретатор команд DOS запоминает позицию байта следующей команды, когда он должен запустить следующую команду, поэтому файл перезаписывается. должен поддерживать выравнивание, чтобы начальная точка следующей команды действительно была началом следующей команды.

Помимо удобства системы меню (и возможных вспомогательных функций), эта схема означает, что система SHOWMENU.EXE не находится в памяти при активации выбранной команды, что является значительным преимуществом, когда память ограничена. [4] [5]

Контрольные таблицы

Интерпретаторы управляющих таблиц можно считать, в каком-то смысле, «самомодифицирующими» значениями данных, извлеченными из записей таблицы (а не специально закодированными вручную в условных операторах формы «IF inputx = 'yyy'»).

Канальные программы

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

История

IBM SSEC , продемонстрированный в январе 1948 года, имел возможность изменять свои инструкции или иным образом обращаться с ними точно так же, как с данными. Однако на практике эта возможность использовалась редко. [6] На заре появления компьютеров самомодифицирующийся код часто использовался для уменьшения использования ограниченной памяти или повышения производительности, или того и другого. Иногда его также использовали для реализации вызовов подпрограмм и возвратов, когда набор инструкций предусматривал только простые инструкции ветвления или пропуска для изменения потока управления . [7] [8] Такое использование по-прежнему актуально в некоторых ультра- RISC- архитектурах, по крайней мере теоретически; см., например , компьютер с набором одной команды . Архитектура MIX Дональда Кнута также использовала самомодифицирующийся код для реализации вызовов подпрограмм. [9]

Применение

Самомодифицирующийся код можно использовать для различных целей:

Оптимизация цикла, зависящего от состояния

Пример псевдокода :

повторить N раз { если СОСТОЯНИЕ равно 1 увеличить А на единицу еще уменьшить А на единицу сделай что-нибудь с А}

Самомодифицирующийся код в этом случае будет просто переписывать цикл следующим образом:

повторить N раз { увеличить A на единицу сделай что-нибудь с А когда STATE должен переключиться { замените код операции «увеличение» выше кодом операции для уменьшения или наоборот }}

Обратите внимание, что замену кода операции в двух состояниях можно легко записать как «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 представлено в докторской диссертации Алексии Массалин. Thesis [17] [18] представляет собой крошечное ядро ​​Unix , использующее структурированный или даже объектно-ориентированный подход к самомодифицирующемуся коду, где код создается для отдельных объектов , таких как дескрипторы файлов. Генерация кода для конкретных задач позволяет ядру Synthesis (как мог бы JIT-интерпретатор) применять ряд оптимизаций , таких как свертывание констант или исключение общих подвыражений .

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

Пол Хэберли и Брюс Карш возражали против «маргинализации» самомодифицирующегося кода и оптимизации в целом в пользу снижения затрат на разработку. [19]

Взаимодействие кэша и самомодифицирующегося кода

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

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

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

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

Проблемы с безопасностью

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

Одним из механизмов предотвращения вредоносной модификации кода является функция операционной системы под названием W^X (что означает «записать или выполнить»). Этот механизм запрещает программе делать любую страницу памяти доступной для записи и выполнения. Некоторые системы предотвращают изменение страницы, доступной для записи, на исполняемую, даже если разрешение на запись удалено. [ нужна цитация ] Другие системы предоставляют своего рода « черный ход », позволяющий нескольким сопоставлениям страниц памяти иметь разные разрешения. Относительно портативный способ обойти W^X — создать файл со всеми разрешениями, а затем дважды сопоставить его с памятью. В Linux можно использовать недокументированный флаг общей памяти SysV, чтобы получить исполняемую общую память без необходимости создания файла. [ нужна цитата ]

Преимущества

Недостатки

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

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

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

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

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

Самомодифицирующийся код вообще нельзя использовать в некоторых средах, например в следующих:

Смотрите также

Примечания

  1. ^ В более поздних версиях DOS (начиная с версии 6.0) появилась внешняя команда CHOICEDR-DOS также внутренняя команда и директива CONFIG.SYS SWITCH ), поэтому для этого конкретного примера применения системы меню больше не было необходимости относятся к самомодифицирующимся пакетным заданиям, однако для других приложений это продолжает оставаться жизнеспособным решением.
  2. ^ ab Например, при работе на процессорах 386 или выше более поздние обновления Novell DOS 7 , а также DR-DOS 7.02 и выше будут динамически заменять некоторые последовательности 16-битных REP MOVSWинструкций по умолчанию («копировать слова») в рабочем образе ядра на 32-битные REP MOVSDинструкции («копирование двойных слов») при копировании данных из одной ячейки памяти в другую (и вдвое меньше необходимых повторений) для ускорения передачи данных на диске. Пограничные случаи , такие как нечетное количество, учтены. [10] [11]
  3. ^ Например, MBR и загрузочные секторы DR-DOS (которые также содержат таблицу разделов и блок параметров BIOS , оставляя для кода менее 446 или 423 байта соответственно) традиционно могли найти загрузочный файл в файле FAT12 или FAT16 . системы сами по себе и загружают ее в память целиком, в отличие от своих аналогов MS-DOS / PC DOS , которые вместо этого полагались на то, что системные файлы занимали первые две записи каталога файловой системы и первые три сектора IBMBIO. COM должен храниться в начале области данных в смежных секторах, содержащих вторичный загрузчик для загрузки оставшейся части файла в память (требуется, чтобы SYS позаботился обо всех этих условиях). Когда была добавлена ​​поддержка FAT32 и LBA , Microsoft даже перешла на требование 386 инструкций и разделила загрузочный код на два сектора из соображений размера, что не было вариантом для DR-DOS, поскольку это привело бы к нарушению обратной совместимости и кросс-совместимости с другими операционными системами. системах в сценариях мультизагрузки и цепной загрузки , а также на старых ПК . Вместо этого загрузочные сектора DR-DOS 7.07 прибегали к самомодифицирующемуся коду, программированию на уровне кода операции на машинном языке , контролируемому использованию (документированных) побочных эффектов , многоуровневому перекрытию данных/кода и методам алгоритмического свертывания , чтобы по-прежнему уместить все в единое целое. физический сектор размером всего 512 байт, не отказываясь при этом от какой-либо расширенной функциональности.

Рекомендации

  1. ^ "HP 9100A/B" . MoHPC — Музей калькуляторов HP . 1998. Перекрывающиеся данные и память программ / Самомодифицирующийся код. Архивировано из оригинала 23 сентября 2023 г. Проверено 23 сентября 2023 г.
  2. ^ "Заявление ALTER" . Справочник по языку COBOL. Микро Фокус .
  3. ^ Спектор, Ли. «Эволюционные вычисления с помощью Push: Push, PushGP и Pushpop» . Проверено 25 апреля 2023 г.
  4. ^ аб Фосдал, Ларс (2001). «Самомодифицирующийся пакетный файл». Архивировано из оригинала 21 апреля 2008 г.
  5. ^ Пол, Матиас Р. (13 октября 1996 г.) [21 августа 1996 г., 1994]. Konzepte zur Unterstützung Administrationr Aufgaben в PC-Netzen и deren Realisierung für eine konkrete Novell-LAN-Umgebung unter Benutzung der Batchsprache von DOS . 3.11 (на немецком языке). Ахен, Германия: Lehrstuhl für Kommunikationsnetze ( ComNets ) и Institut für Kunststoffverarbeitung (IKV), RWTH. стр. 51, 71–72.(110+3 страницы, дискета) (Примечание. Проектирование и внедрение централизованно управляемой модульной распределенной системы управления для автоматической настройки клиентов и развертывания программного обеспечения с механизмом самовосстанавливающегося обновления в средах локальных сетей на основе самовоспроизводящихся и косвенно самомодифицирующихся пакетных заданий с нулевое потребление памяти вместо необходимости использования программного обеспечения для постоянного управления на клиентах.)
  6. ^ Баше, Чарльз Дж.; Бухгольц, Вернер ; Хокинс, Джордж В.; Ингрэм, Дж. Джеймс; Рочестер, Натаниэль (сентябрь 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 был первым действующим компьютером, способным обрабатывать собственные хранимые инструкции точно так же, как данные, модифицировать их и действовать в зависимости от результата. 
  7. ^ Миллер, Бартон П. (30 октября 2006 г.). «Исправление двоичного кода: древнее искусство, усовершенствованное для 21 века». Серия выдающихся лекторов по информатике Triangle - семинары 2006–2007 гг. Государственный университет Северной Каролины , факультет компьютерных наук . Проверено 25 апреля 2023 г.
  8. ^ Венцль, Матиас; Мерздовник, Георг; Ульрих, Йоханна; Вейппль, Эдгар Р. (июнь 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 страниц)
  9. ^ Кнут, Дональд Эрвин (2009) [1997]. «MMIX 2009 — RISC-компьютер третьего тысячелетия». Архивировано из оригинала 27 ноября 2021 г. Проверено 28 ноября 2021 г.
  10. ^ abcd «Набор машиночитаемого исходного кода Caldera OpenDOS (MRS) 7.01» . Кальдера, Inc., 1 мая 1997 г. Архивировано из оригинала 07 августа 2021 г. Проверено 02 января 2022 г.[1]
  11. ^ abcd Пол, Матиас Р. (2 октября 1997). «Обновление Caldera OpenDOS 7.01/7.02 Alpha 3 IBMBIO.COM README.TXT». Архивировано из оригинала 4 октября 2003 г. Проверено 29 марта 2009 г.[2]
  12. ^ Уилкинсон, Уильям «Билл» Альберт (2003) [1996, 1984]. «Червь H89: тестирование памяти H89». Страница компании Билла Уилкинсона Heath . Архивировано из оригинала 13 декабря 2021 г. Проверено 13 декабря 2021 г. […] Помимо получения инструкции, Z80 использует половину цикла для обновления динамического ОЗУ . […] поскольку Z80 должен тратить половину каждого цикла выборки инструкций на выполнение других задач, у него не так много времени для выборки байта инструкции , как для байта данных. Если одна из микросхем ОЗУ в той области памяти, к которой осуществляется доступ, работает немного медленно, Z80 может получить неверную битовую комбинацию при получении инструкции, но получить правильную при чтении данных. […] встроенный тест памяти не выявляет проблемы такого типа […] это строго тест чтения/записи данных. Во время теста все инструкции извлекаются из ПЗУ , а не из ОЗУ […], в результате чего H89 проходит тест памяти, но все еще работает хаотично в некоторых программах. […] Это программа, которая проверяет память, перемещаясь по ОЗУ. При этом ЦП печатает текущий адрес программы на ЭЛТ , а затем извлекает инструкцию по этому адресу. Если микросхемы ОЗУ по этому адресу в порядке, ЦП перемещает тестовую программу в следующую ячейку памяти, печатает новый адрес и повторяет процедуру. Но если одна из микросхем ОЗУ достаточно медленная, чтобы возвращать неверную битовую комбинацию, ЦП неправильно интерпретирует инструкцию и ведет себя непредсказуемо. Однако вполне вероятно, что дисплей заблокируется, показывая адрес неисправной микросхемы. Это сужает проблему до восьми микросхем, что является улучшением по сравнению с необходимостью проверять целых 32. […] Программа […] выполнит проверку на наличие червей, отправив инструкцию RST 7 (RESTART 7) из нижнего конца памяти. до последнего рабочего адреса. Остальная часть программы остается неподвижной и занимается отображением текущего местоположения команды RST 7 и ее перемещением . Кстати, программа называется тестом на червяков , потому что по мере продвижения инструкции RST 7 по памяти она оставляет после себя скользкий след NOP ( НЕТ ОПЕРАЦИИ). […]
  13. ^ Ортис, Карлос Энрике (29 августа 2015 г.) [18 августа 2007 г.]. «О самомодифицирующемся коде и ОС космического корабля» . Проверено 25 апреля 2023 г.
  14. ^ Публикации Юргена Шмидхубера о самомодифицирующемся коде для самореферентных систем машинного обучения.
  15. ^ Пальцев, Евгений (30 января 2020 г.). «Самомодифицирующийся код в ядре Linux — что, где и как» . Проверено 27 ноября 2022 г.
  16. ^ Вечоркевич, Павел. «Альтернативы ядра Linux» . Проверено 27 ноября 2022 г.
  17. ^ Пу, Калтон ; Массалин, Генри ; Иоаннидис, Джон (1992). Синтез: эффективная реализация фундаментальных служб операционной системы (PDF) (кандидатская диссертация). Нью-Йорк, США: Департамент компьютерных наук Колумбийского университета . Номер заказа UMI GAX92-32050 . Проверено 25 апреля 2023 г.[3]
  18. ^ Хенсон, Валери (20 февраля 2008 г.). «KHB: Синтез: эффективная реализация основных служб операционных систем». LWN.net . Архивировано из оригинала 17 августа 2021 г. Проверено 19 мая 2022 г.
  19. ^ Хэберли, Пол ; Карш, Брюс (3 февраля 1994 г.). «Ио Ной Боччони - История футуристического программирования». Графика Обскура . Проверено 25 апреля 2023 г.

дальнейшее чтение

Внешние ссылки