2010-07-12 5 views
0

Я разработал симулятор MIPS I с помощью Verilator, который позволяет мне конвертировать Verilog-код в C++. Я пытаюсь запустить программу C++ на моем процессоре, но у меня есть некоторые проблемы. Моя цель состоит в том, чтобы:Вопрос о связи/Загрузка и симулятор

  1. написать тестовую программу в C++
  2. обобщит эту программу с помощью кросс-компилятор G ++ (MIPS-Linux)
  3. берут генерироваться ELF файл и разобрать его с помощью objdump
  4. магазин в весь дамп двоичного объекта в текстовом файле
  5. открыт текстовый файл в моем тренажере
  6. выполнения какой-либо текст манипулирования функции, чтобы изолировать часть HEX дамп objdump
  7. загружает весь массив эльфов в память моего процессора (карта памяти C++, содержащая элементы, побитые их адресом в памяти, как определено файлом ELF.)
  8. запустить программу, установив счетчик программ и отпустив его до выхода программа.

Проблема будет в виде шагов 7 и 8. У меня есть очень рудиментарное понимание формата файлов ELF. Насколько я могу судить (readelf может использоваться для вывода начальной точки программы), программа ounter должна быть установлена ​​первоначально по адресу начала раздела .text. К сожалению, это не приводит к правильной работе программы на моем процессоре.

Я проверил правильное выполнение программы моего процессора, написав программы сборки, загрузив их в симуляторы сборки MIPS и проверив инструкцию по инструкции, что файл регистра и сгенерированная адресация совпадают. Я не понимаю, почему я не могу получить даже программу «helloworld» для запуска путем написания на C++, компиляции и загрузки в «память»? Я не очень хорошо разбираюсь в этой области. Я мог бы использовать некоторую помощь, чтобы понять это.

Я понимаю, что .text и .data содержат все необходимое для запуска моей программы. Это, очевидно, не так, потому что, когда я пересекаю раздел .text, моя программа не выполняется правильно. Есть ли что-то еще, что мне нужно сделать с файлом ELF, прежде чем загружать его в память?

+0

Кроме того, я попытался написать сборку и компиляцию строк для проверки моего процессора, но после компиляции я не могу найти свою программу (я просто повторяю addi $ 0x12ab ...) снова и снова. Затем я ищу 0x12ab в шестнадцатеричном дампе файла elf. Таким образом, я не смог найти свою программу в файле эльфа. –

+0

Итак, глядя на симулятор ZVRBA, кажется, что файл ELF загружается в память очень похоже на Я в основном отрубаю все символы из файла эльфа после того, как HEX сбрасывает его, и я добавляю элемент на карту памяти, используя каждый шестнадцатеричный адрес инструкции/данных в качестве ключа. Затем я получаю доступ с помощью ключа адреса. важными аспектами этого процесса являются загрузка всех элементов на их правильный адрес и установка указателей программы, глобального, стека и рамки в нужные места. Поскольку это то, что я делаю, я думаю, что могу предположить, что t Я должен изменить свой компилятор. –

ответ

1

Я написал полный симулятор MIPS I, который может загружать двоичные файлы ELF. Вы можете получить исходный код here, возможно, вы получите ответы на свои вопросы. Есть также некоторые демо-программы. Ключевым моментом является заставить компилятор генерировать автономный исполняемый файл, который не использует библиотеку времени выполнения, даже библиотеку поддержки gcc.

+0

Я также написал документ, в котором подробно описываются работы симулятора (включая некоторые аспекты ELF). Резюме статьи: http://www.computer.org/portal/web/csdl/doi/10.1109/ARES.2010.47 Отправьте мне электронное письмо, чтобы я мог отправить вам письмо (я не могу опубликовать его в Интернете из-за вопросы авторского права). – zvrba

+0

Я думаю, что для меня было бы хорошей идеей построить собственный кросс-компилятор (вместо того, чтобы использовать глючный, предоставленный мне). Знаете ли вы о хорошем ресурсе, описывающем этот процесс? В частности, для мицел-эльфа gcc-мишени? –

+0

Я отправил вам электронное письмо. Не уверен, сделал ли это через вашу фильтрацию. –

0

Here - объяснение эльфа, которое мне понравилось, хотя кажется, что вы понимаете проблемы эльфа. Они также объясняют, как g ++ выводит файлы elf, поэтому он может помочь вам разобрать ваш выходной файл (более хорошая информация в part 1).

Надеюсь, что эта информация поможет.

+0

Хорошее объяснение. Легче пройти, чем статью в Википедии. Благодарю. –

0

Возможно, zvrba ударил ноготь по голове, вы не можете/не должны вызывать функции библиотеки C, такие как printf в вашей программе.

Написать простую программу C, чтобы начать с, может быть:

 
const unsigned char hello[]="helloworld"; 

void notmain (void) 
{ 
    unsigned int ra; 

    for(ra=0;hello[ra];ra++) 
    { 
     PUT32(0x1234,hello[ra]); 
    } 
} 

и вызвать notmain из ассемблерных программ, которые вы написали и работать и связать вместе.

PUT32 просто записывает некоторые данные на некоторый адрес, я обычно реализую их в ассемблере, ymmv.

Выберите какой-либо адрес, отличный от 0x1234. Мое предположение заключается в вашей симовой среде, вы можете наблюдать за доступом в адресное местоположение и наблюдать за символами. нет необходимости еще говорить с uart и приходится декодировать серийный номер в симуляции, когда вы можете смотреть байты на шине.

Elf-файлы действительно просты для синтаксического анализа, если вы написали симулятор, чтение файла эльфа не имеет большого значения. Я не беспокоюсь о библиотеках, они просто усложняют работу. Это несколько структур, если вы решили использовать структуры. Я могу предоставить вам код, который поможет вам начать, если хотите. Альтернативой является использование gnu-инструментов для преобразования эльфа в двоичный файл (mips-whatever-objcopy file.elf -O binary file.bin). Если ваши .text и .data не близки друг другу, программа objcopy сделает огромный файл с нулями для заполнения между двумя адресными пространствами. Для встраивания вы все равно хотите что-либо в своем разделе .data, всегда инициализируйте переменные в программе не раньше времени, а таблицы только для чтения создавайте const так, чтобы они находились в .text вместо .data

это проект для веселья или работы или общего общественного потребления? Мне может быть интересно использовать его когда-нибудь мне нравится концепция verilator, но она либо ограничена, либо слишком жестка к стандарту verilog, и так много verilog там не будет работать под ним без работы, поэтому я не смог по-настоящему играть с ним.

удачи.

+0

Основная причина, почему я использовал карту в C++ для представления моей памяти, состоит в том, что подразумеваются все пустые ячейки памяти. Если была установлена ​​пара элементов/ключей, то в памяти есть элемент, если ничто не было выделено в конкретное пространство, когда оно адресовано симулятором, возвращаемое значение по умолчанию равно «0». –

+0

Этот проект предназначен для исследований, но симулятор, который я создаю, на самом деле не является проприетарным. Это просто инструмент, который я буду использовать, чтобы опробовать различные суперкомпьютерные архитектуры, чтобы компенсировать снижение производительности, поскольку напряжение питания падает до уровня ниже порога. Я был бы рад отправить его вам, когда он будет работать. –

+0

Самое большое преимущество Verilator в том, что он очень быстрый. Это связано главным образом с тем, что он только компилирует синтезируемый verilog, который делает ограничение на свободу кодирования, но потому, что вы также можете писать все непосредственно на C++, есть приятное место, где можно использовать как verilog, так и C++. Также основателя Verilator очень легко связаться с вопросами, так что легко понять. –

Смежные вопросы