Проектирование эффективной памяти для симулятора набора команд

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

В основном класс памяти должен был бы делать следующее:

  1. Примите значение и адрес и выделите это значение для определенного адреса памяти.
  2. Получить значение по определенному адресу. Если что-то было выделено ранее, получите это значение. В противном случае верните 0.

На ум приходит то, что мне нужен алгоритм поиска, чтобы найти интересующий меня адрес.

Я уже реализовал простейшую доступную версию, которая была бы линейным поиском в памяти, где рассматриваемый блок памяти был бы просто структурой, *block со значением и адресом, хранящимся в vector<block*>, Однако, как вы можете догадаться, это очень дорого для больших случаев.

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

2

Решение

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

Допустим, ваше эмулированное приложение пыталось сохранить byte по адресу 0x05001234,

Это было бы на странице памяти 0x0500 (1280 в десятичном виде). Вы можете просто прочитать первые 16 бит, чтобы получить адрес страницы, и вы получите ровно 64 КБ.

Использовать std::map чтобы ваши страницы памяти были организованы. Что-то вроде std::map<int, char*> pages;, Или массив char *pages[0x00010000]; это должно использовать 256 КБ памяти в 32-битных системах. Не забудьте обнулить это.

Проверьте, есть ли у вас страница памяти 0x0500 в вашем наборе. Вы только должны увидеть это pages[0x0500] не является NULL, Если его там нет, pages[0x0500] = new char[0x00010000]; создать его. Обнулите его, если нужно.

Теперь просто напишите байт, как pages[0x0500][0x1234] = byte;,

5

Другие решения

Вы пробовали использовать std :: map? Это сделало бы именно то, что вы просите. Адрес будет ключом, а значение будет данными.

1