Можно ли сопоставить адрес с результатом функции? - PullRequest
1 голос
/ 20 июня 2010

Я пишу эмулятор NES на C / C ++ для Mac OS (я его уже написал, поэтому знаю основы).Поскольку многие аппаратные регистры отображаются в ячейках памяти, мне было интересно, есть ли какой-нибудь системный вызов, который я мог бы использовать для сопоставления адреса с результатом функции: когда он будет доступен, функция будет вызвана.(Я почти уверен, что не могу, но эй, стоит спросить.)

Вот что я хотел бы сделать:

int getStatusRegisterValue()
{
    return 0xCAFEBABE;
}

// obviously, more parameters than just this would be involved I suppose
int* statusRegister = syscall_to_map_function_to_address(getStatusRegisterValue);

// from here on, doing (*statusRegister) should call getStatusRegisterValue and
// return its value
*statusRegister == 0xCAFEBABE;

Этот проект будетя пытаюсь в LLVM, и моя цель состоит в том, чтобы перекомпилировать ПЗУ в байт-код LLVM.Вот почему было бы удобно, если бы простой доступ к памяти мог вызвать функцию (как на реальном оборудовании NES).Две другие очевидные возможности решения моей проблемы - это либо кэшировать значения регистров и сохранять их в фактической памяти, либо вызывать функцию из перекомпилированного кода, чтобы сопоставить области памяти с тем, чем они действительно являются.

Спасибо!

Ответы [ 5 ]

3 голосов
/ 21 июня 2010

Может быть, вы могли бы попробовать установить обработчик SEGV и проверить ошибочный адрес там. Поскольку я не пользуюсь Mac OS, я больше не могу вам помочь.

1 голос
/ 20 июня 2010

Это звучит почти так же, как обычные указатели функций:

typedef int(*function_type)(void);

function_type = &getStatusRegisterValue; // store
int i = function_type(); // call

Другой синтаксис, та же идея?

1 голос
/ 21 июня 2010

Это не может быть сделано в C (или C ++, но давайте просто для простоты остановимся на C.)

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

1) Вы предполагаете, что она всегда возвращает одно и то же значение.

На самом деле, это все.Тем не менее, это большое предположение, чтобы сделать!

0 голосов
/ 21 июня 2010

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

Это также не зависит от языка программирования,Ваш вопрос скорее нацелен на современные компьютерные платформы в целом.

0 голосов
/ 20 июня 2010

В C ++ вы можете перегрузить операторы * и -> для пользовательских классов.Позволит ли это вам достичь того, чего вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...