Программа «HelloWorld» на MIPS не работает при загрузке ядра Linux в другое ядро - PullRequest
1 голос
/ 24 июня 2019

Программа «HelloWorld», запущенная на Mips Interaptive core0 VPE1, включая файлы crt0.S (которые я написал), main.c, создает файл ELF, в котором символы относятся к 0x0: 0x0 - _core_reset (это часть crt0.S) ... 0x460 - fw_reset (это вызывается из основного) ... 0x484 - основной (это основная функция)

(-) мой ELF подвергается разделению разделов для создания только двоичного файла инструкций, начиная с _core_reset (-) двоичный образ с последнего шага загружается на виртуальный адрес 0xADB00000, который является физическим 0x2DB00000 (-) первая проблема в том, что в _core_reset мы делаем:

la t0,main

mtc0 t0, C0_ERRPC // сохранить его как адрес возврата но main имеет адрес относительно 0x0, что вызывает исключение памяти, что мне нужно, чтобы main был в адресе загружен + (смещение относительно нуля), Как я могу это сделать? мы можем сказать, что адрес, с которого загружается и запускается изображение, является постоянным

  1. Я пытался записать в файл crt0.S, жестко запрограммированный, чтобы изменить переход на основной адрес:

    lui t0, 0xa6b0 / * Предположение, что FW загружен в 0xa6b00000 * / addiu t0, t0, main

и это сработало, я достиг main (), но позже, когда попытался вызвать fw_reset () из main, адрес fw_reset () снова был относительно 0x0, и я получил исключение памяти

  1. Я попытался из make-файла добавить, что секция .text в ELF будет начинаться с загруженного адреса, но затем я получаю проблему, в которую загружается мое изображение (значение, которое я предоставляю) + (фактический адрес загрузки), и поэтому оно также не работает

Я ожидал, что мой код достигнет main () и застрянет в бесконечном цикле while, вместо этого я получаю исключения памяти, поскольку функции относятся к 0x0, а код загружается по другому адресу, отличному от нуля

...