Есть ли способ динамически генерировать собственный код x86 и выполнять его из .NET? - PullRequest
0 голосов
/ 04 мая 2019

Я хотел бы динамически генерировать собственный неуправляемый код x86 и затем выполнять его очень быстро из управляемого .NET. Я знаю, что мог бы генерировать некоторый IL-код и выполнять его, но я думаю, что для сброса потребуется слишком много времени, чтобы получить выгоду от любого прироста скорости, который я получу от этого.

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

Я просто не уверен, как вызвать нативный код из .net. помните, что это должно быть на лету в памяти, а не строить dll. Скорость - вот что действительно важно здесь. Это часть проекта генетических вычислений.

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Короткий ответ: вы не можете сделать это с помощью C #.

Вы можете сделать это с C ++ / CLI, создав сборку смешанного режима, которая выполняет ваши «супер быстрые» вычисления в нативном коде. Таким образом, вам не нужно (предположительно) генерировать исполняемый код «на лету».

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

В Windows это делается с помощью функций VirtualAlloc и VirtualProtect . Опять же, выполнение этого из C # потребует взаимодействия P / Invoke, которое, скорее всего, обратит вспять ваш прирост скорости.

0 голосов
/ 04 мая 2019

Язык C является «переносимым ассемблером», и вы можете генерировать коды операций x86 напрямую (лучше писать на ассемблере).Если вы скомпилировали код C в объект, вы можете связать его с .net в виде библиотеки.

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

Однако антивирусное программное обеспечение специально ищет такое поведение и будетидентифицируйте ваш код как вирус более чем вероятным.

Также ваш процессор имеет сегменты памяти «кода» и сегменты памяти «данных».Как правило, вы не можете динамически изменить сегмент кода, не вызывая segfault, и вы не можете выполнить из сегмента данных, не вызывая segfault.

Кроме того, ваш код будет работать только на процессоре SISC (x86), а не наПроцессор RISC.

Здесь есть над чем подумать.

Раньше мы делали это на ассемблере в старые времена в системах SISC.

Приветствия, Дэвид

...