Я разрабатываю симулятор набора команд на C ++, который состоит из классов для процессора, памяти и самого набора команд. В настоящее время я пытаюсь создать свой класс памяти, который будет состоять из uint32_t
тип данных.
В основном класс памяти должен был бы делать следующее:
На ум приходит то, что мне нужен алгоритм поиска, чтобы найти интересующий меня адрес.
Я уже реализовал простейшую доступную версию, которая была бы линейным поиском в памяти, где рассматриваемый блок памяти был бы просто структурой, *block
со значением и адресом, хранящимся в vector<block*>
, Однако, как вы можете догадаться, это очень дорого для больших случаев.
В общем, я хотел бы реализовать случай, когда память может быть легко найдена (я думаю, бинарный поиск, но я открыт для большего количества предложений), и я также хотел бы, чтобы предложения по организации моего блока памяти *block
, В настоящее время я использую вектор, потому что я не знаю, какой объем памяти мне нужен.
Вы можете создать нечто похожее на то, как настоящая ОС обрабатывает память для процессов. Вы можете иметь страницы памяти из, скажем, 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;
,
Вы пробовали использовать std :: map? Это сделало бы именно то, что вы просите. Адрес будет ключом, а значение будет данными.