|
|
  |
Самомодифицирующийся код в экосистеме Cortex-M., есть ли право на жизнь? |
|
|
|
Jun 28 2018, 23:23
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894

|
Цитата(jcxz @ Jun 29 2018, 04:54)  Просто интересно...  Начнём с того что для успешной компиляции такого кода - необходимы пляски с бубном. И бубен тот особенный, очень неудобный в руках. И танец чуть больше чем чумашедший. Информации на эту тему раз/два и обчёлся, и всё такое ветхое - пылью покрытое. Всё дело в том что сама функция изменения физического и логического поведения кода на кортексах работает из коробки. Коробка сея чёрная, на свет не прозрачная, и достаточно уникальная. Создавая собственный свод правил для определений поведения кода в режиме реального времени исполнения - есть огромная вероятность отстрелить себе обе ноги, а так-же другие части тела. Но выход есть всегда. На Си, Си++, и выше - задать точную последовательность применения мнемоник ядра практически невозможно. Однако это можно сделать на асме. Весь проект придётся делить на две части: до и после. Причём компилировать придётся то-же отдельно. Весьма утомительное удовольствие. Если нет задачи защиты информации - этим рукоблудием лучше не заниматься.
|
|
|
|
|
Jun 29 2018, 00:32
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Давайте сначала: Цитата(AVI-crak @ Jun 29 2018, 02:23)  Всё дело в том что сама функция изменения физического и логического поведения кода на кортексах работает из коробки. О какой магической функции речь? И что есть физическое и логическое поведение кода? Цитата(AVI-crak @ Jun 29 2018, 02:23)  Создавая собственный свод правил для определений поведения кода в режиме реального времени исполнения... Свод правил для определений поведения - это как? Цитата(AVI-crak @ Jun 29 2018, 03:11)  Любая перетасовка программного кода - есть алгоритм. Ничего сложного, местами даже интересно, в плюсах вообще всё прозрачно получается. Плюса-то здесь каким боком?
|
|
|
|
|
Jun 29 2018, 03:22
|
Местный
  
Группа: Участник
Сообщений: 297
Регистрация: 20-05-17
Пользователь №: 97 202

|
Цитата(AVI-crak @ Jun 29 2018, 02:23)  Начнём с того что для успешной компиляции такого кода - необходимы пляски с бубном. Это ещё почему? Компилятор вообще по барабану: он не знает, что за программу (какого назначения) он компилит. Цитата(aaarrr @ Jun 29 2018, 02:31)  Ужасы какие. ТС вроде как собирался генерировать часть кода программно с нуля, а не строить новую программу из частей исходной. Термин "самомодифицирующийся", возможно, не самый удачный, но предполагает обычно именно это. Да банально заменить во флеше JMP +10 на JMP +20 в процедуре - вот уже самомодифицирующийся код. Делал так. Зачем так делать? Почему бы не сделать команду условного перехода, которая будет делать переход в зависимости от некоего доп. флажка? Из экономии тактов и битов
|
|
|
|
|
Jun 29 2018, 03:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072

|
Цитата(jcxz @ Jun 29 2018, 01:54)  Есть мысль использовать самомодифицирующийся код для оптимизации решения одной задачи. Никто не запрещает. Если хорошо владеете темой, то единственные грабли - это кэш. Цитата(jcxz @ Jun 29 2018, 01:54)  И вот я что-то не смог вспомнить чтобы здесь на форуме вообще когда-то поднималась эта тема. Нынче памяти много, проще вызывать готовые оптимизированные куски.
|
|
|
|
|
Jun 29 2018, 04:20
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AVI-crak @ Jun 29 2018, 02:23)  Начнём с того что для успешной компиляции такого кода - необходимы пляски с бубном. Какая компиляция? Я же написал: код будет строить моя программа (на этом же Cortex-M). Т.е. - она сразу будет создавать функцию в машинных кодах (если так понятнее). Которая после будет вызываться. Цитата(AVI-crak @ Jun 29 2018, 02:23)  На Си, Си++, и выше - задать точную последовательность применения мнемоник ядра практически невозможно. Не понял - в чём сложность? Алгоритм создания кода вполне себе тривиальный. Цитата(AVI-crak @ Jun 29 2018, 03:11)  Добавление, удаление, модификация известного кода в зависимости от заложенного в него алгоритма. То-есть там появляются команды и данные которых не было в проекте изначально. Да, именно так. Будет функция (написанная и скомпилённая обычным образом), которая в некоем буфере будет "писать" другую функцию прямо в машинных кодах. Цитата(Николай Семёнович @ Jun 29 2018, 06:22)  Из экономии тактов и битов Да. Тактов. Думал и так и эдак - как оптимизировать требуемый алгоритм чтобы он был как можно быстрее. Но классическими методами не получается никак. А потом в голову пришла мысль что это легко делается самомодифицирующимся кодом. Эта функция должна вызываться с довольно большой частотой из ISR. Отсюда и желание оптимизации. Цитата(halfdoom @ Jun 29 2018, 06:29)  Никто не запрещает. Если хорошо владеете темой, то единственные грабли - это кэш. Кеш мы победим. Цитата(halfdoom @ Jun 29 2018, 06:29)  Нынче памяти много, проще вызывать готовые оптимизированные куски. Тогда таких кусков придётся написать 2^64 (это не операция XOR).  Я же говорю - классическими методами не получается придумать оптимального решения.
|
|
|
|
|
Jun 29 2018, 04:47
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894

|
Цитата(aaarrr @ Jun 29 2018, 06:32)  О какой магической функции речь? И что есть физическое и логическое поведение кода? Cortex, да и почти все arm чипы - используют внеочередное исполнение кода. Он может загружать адреса для двух функций одновременно. Просчитывать данные которые будут применяться где-то внутри функции до её реального вызова. Размазывать циклы на всю портянку. Обращать переменные в другое значение чем было назначено в пользовательской программе -без потери целостности алгоритма, и ещё много много чего. Это их главная фишка. Фактически код в отладчике выполняется по строкам программы, а в реальности прыгает как бешеный сайгак. Попытка воткнуть модификацию кода без предварительной изоляции всего куска - обычно приводит быстрому и окончательному сбою. Свод правил - прикольная вещь. Кусок кода предварительно компилируется в асму, с сохранением всех имён, названий функций и так далее. На весь этот кусок кода накладывается структура - с достаточно детальным описанием, прежде всего для себя (запутаться проще простого). И только после этого компилятор поймёт - чего от него хотят. Код который будет модифицировать этот кусок асмы - будет автоматически подстраиваться под имеющиеся логический цикл. Это означает что компилятор не воткнёт команды предварительного чтения на модифицированный код, корректно сделает переход, и корректно обработает замену кода и данных на которые он будет ссылаться. Есно остальной код без модификаций - если он уже вызывал некоторые функции из этого блока - то потеряет адреса. Не просто так - а сработают заглушки по внешнему флагу. В плюсах такие модификации кода происходят автоматически при сборке функции. Когда код выполняется из памяти - там вообще трудно чего понять. (по крайней мере мне). Цитата(Николай Семёнович @ Jun 29 2018, 09:22)  Компилятор вообще по барабану: он не знает, что за программу (какого назначения) он компилит. Естественно. Но если нужно модифицировать код - то требования повышаются. Компилятору нужно будет объяснить - где и чего менять, и как это скажется на его дальнейшей работе. Цитата(jcxz @ Jun 29 2018, 10:20)  Какая компиляция? Я же написал: код будет строить моя программа (на этом же Cortex-M). Т.е. - она сразу будет создавать функцию в машинных кодах (если так понятнее). Которая после будет вызываться. Кхм, это наверное слишком глупо, но всё-же. Флешка - это именно та флешка что вставляется в разъём компьютера?
|
|
|
|
|
Jun 29 2018, 04:51
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AVI-crak @ Jun 29 2018, 07:36)  Cortex, да и почти все arm чипы - используют внеочередное исполнение кода. Он может загружать адреса для двух функций одновременно. Просчитывать данные которые будут применяться где-то внутри функции до её реального вызова. Размазывать циклы на всю портянку. Обращать переменные в другое значение чем было назначено в пользовательской программе -без потери целостности алгоритма, и ещё много много чего. Это их главная фишка. Тем не менее - количество чтений/записей из/в память которые нужно выполнить всё равно не уменьшится, менее чем требующееся по алгоритму, при любом оптимизаторе. А перевод на самомодифицирующийся код сокращает это количество многократно. Уж что-что, а ассемблер для Cortex-M я знаю неплохо. И пока не сделали такой оптимизатор, который напишет код лучше меня.  Цитата(AVI-crak @ Jun 29 2018, 07:47)  Флешка - это именно та флешка что вставляется в разъём компьютера? Вы о чём?
|
|
|
|
|
Jun 29 2018, 06:56
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AlexandrY @ Jun 29 2018, 08:47)  Или самомодифицирующийся - это код который вот именно сам себя модифицирует, т.е. инструкция STR вот прямо по своему адресу что-то и пишет и сама себя таким образом затирает. Я уже выше написал: будет функция, которая по некоторым условиям пишет другую функцию. По командам. В маш.кодах. Команды записываемые в тело создаваемой функции (и их последовательность) зависят от аргументов первой функции. PS: Вот уже сколько откликов получил, а на собственно единственный вопрос, поставленный в первом сообщении, так никто и не ответил. И видимо забыли все в чём был вопрос..... Вопрос был собственно в том: использовал кто-нить из здесь присутствующих самомодифицирующийся код (именно такой код, который или сам своё тело правит или строит другой код (а не просто копирует из одного места в другое))? Именно на платформе ARM в embedded? И, если использовали, то для какой задачи?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|