Я разработал симулятор MIPS I с помощью Verilator, который позволяет мне переносить код Verilog в C ++. Я пытаюсь запустить программу на C ++ на своем процессоре, но у меня возникли проблемы. Моя цель:
- написать тестовую программу на c ++
- скомпилируйте эту программу с помощью кросс-компилятора g ++ (mips-linux)
- возьмите сгенерированный файл ELF и разберите его с помощью objdump
- хранить весь дамп двоичного объекта в текстовом файле
- открыть текстовый файл в моем симуляторе
- запустить некоторые функции манипулирования текстом, чтобы изолировать HEX-часть дампа objdump
- загрузить весь шестнадцатеричный дамп эльфа в память моего процессора (карта памяти C ++, содержащая элементы, привязанные к их адресам в памяти, как определено файлом ELF.)
- запустите программу, установив счетчик программ и отпустив его до выхода из системного вызова программы.
Проблема будет в шагах 7 и 8. У меня очень элементарное представление о формате файла ELF. Насколько я могу судить (readelf можно использовать для вывода начальной точки программы), счетчик программы должен быть изначально установлен по адресу начала раздела .text. К сожалению, это не приводит к правильному запуску программы на моем процессоре.
Я проверил правильность выполнения программы на моем процессоре, написав ассемблерные программы, загрузив их в симуляторы сборки MIPS и проверив, инструкция за инструкцией, что регистровый файл и сгенерированная адресация совпадают. Я не понимаю, почему я не могу запустить даже программу helloworld, написав на C ++, скомпилировав и загрузив в мою «память»? Я не особо разбираюсь в этой области. Мне действительно нужна помощь, чтобы разобраться в этом.
Насколько я понимаю, .text и .data содержат все необходимое для запуска моей программы. Очевидно, это не так, потому что, когда я просматриваю раздел .text, моя программа не выполняется правильно. Есть ли что-то еще, что мне нужно сделать с файлом ELF перед его загрузкой в память?