Доступ к сверхоперативной памяти блокнотного типа от C

Это могло бы быть немного экзотической проблемой, но я надеюсь, что кто-то может все еще выручить меня немного ;). Я хотел бы выполнить стандарт C программа, однако, в какой-то момент во время выполнения программы, я хотел бы это определенное число инструкций, которые хранятся в локальной RAM временной памяти, выполняются. Память временной памяти доступна для всех процессов. Позволяет предполагают, что эта локальная память запускается в адресе 0x80000000, и я интегрировался бы, это в следующем C кодирует fragement

int main {
int a=1;
int b=2;
int c=3;    

c = a + b;

%goto address 0x80000000 and execute three instructions before continuing
%program execution here 

return(0);

}

Счетчик команд прошел бы следующие этапы, принятие основного загружается в 0x40000000

0x40000000    a=5; 
0x40000004    b=2; 
0x40000008    c=1;  
0x4000000C    c=a+b;
0x80000000    first instruction in the local scratch pad
0x80000004    second instruction in the local scratch pad
0x80000008    third instruction in the local scratch pad  
0x40000010    return(0);

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

Большое спасибо, Andi

5
задан starblue 15 July 2010 в 21:07
поделиться

4 ответа

Предполагая, что инструкции ведут себя как обычная функция, вы можете:

#include <stdio.h>

void (*scratchpad_func)(void) = (void(*)(void))0x80000000;

int main()
{
    printf("before\n");
    scratchpad_func();
    printf("after\n");
    return 0;
}

Очевидно, вам придется использовать операционную систему в реальном режиме или перепрыгивать через любые ограничения вашей ОС / Комбинация процессоров требует прямого доступа к этому адресному пространству.

(На некоторых архитектурах «вести себя как обычная функция» так же просто, как «перейти к $ ra» в конце, если вы не касаетесь регистров, сохраненных вызываемым пользователем. Например, MIPS.)

6
ответ дан 14 December 2019 в 08:40
поделиться

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

Если вы хотите, чтобы эта область памяти была доступна для процессов, отличных от вашей программы, вам придется использовать примитивы разделяемой памяти вашей операционной системы (Windows / Linux / OS X) для отображения фрагмента памяти на выбранный вами адрес.

Звучит как безумная идея, но ее можно заставить работать. Удачи!

0
ответ дан 14 December 2019 в 08:40
поделиться

Ни преобразование адреса в указатель функции, ни встроенный ассемблер не нормализованы, поэтому ничего из этого не будет переносимым; -)

Отображение фиксированного адреса, как упоминает Карл, возможно с POSIX, но опять же, чтобы выполнить это, нет простого способа.

Ни один из предыдущих постов не ответил, как вернуться назад после ровно трех инструкций ...

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

1
ответ дан 14 December 2019 в 08:40
поделиться

Ну и пара подсказок.

  1. Вам нужно убедиться, что память в "блокноте" является адресуемой и исполняемой.
  2. Убедитесь, что последовательность инструкций в ячейке памяти заканчивается инструкцией ret
  3. call кода, а не переходом к нему.
0
ответ дан 14 December 2019 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: