Вопрос о связывании / загрузке и симуляторе - PullRequest
0 голосов
/ 12 июля 2010

Я разработал симулятор MIPS I с использованием Verilator, который позволяет мне переносить код verilog в c ++. Я пытаюсь запустить программу c ++ на моем процессоре, но у меня возникли некоторые проблемы. Моя цель:

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

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

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

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

Ответы [ 3 ]

1 голос
/ 12 июля 2010

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

0 голосов
/ 13 июля 2010

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 и декодировать серийный номер в симуляции, когда вы можете наблюдать байты на шине.

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

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

удачи.

0 голосов
/ 12 июля 2010

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

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

...