Программа «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 был в адресе загружен + (смещение относительно нуля),
Как я могу это сделать? мы можем сказать, что адрес, с которого загружается и запускается изображение, является постоянным
Я пытался записать в файл crt0.S, жестко запрограммированный, чтобы изменить переход на основной адрес:
lui t0, 0xa6b0 / * Предположение, что FW загружен в 0xa6b00000 * /
addiu t0, t0, main
и это сработало, я достиг main (), но позже, когда попытался вызвать fw_reset () из main, адрес fw_reset () снова был относительно 0x0, и я получил исключение памяти
- Я попытался из make-файла добавить, что секция .text в ELF будет начинаться с загруженного адреса, но затем я получаю проблему, в которую загружается мое изображение
(значение, которое я предоставляю) + (фактический адрес загрузки), и поэтому оно также не работает
Я ожидал, что мой код достигнет main () и застрянет в бесконечном цикле while, вместо этого я получаю исключения памяти, поскольку функции относятся к 0x0, а код загружается по другому адресу, отличному от нуля