Внешнее значение символа автоматически присваивается концу ОЗУ

Я не понимаю, почему внешний символ равен концу оперативной памяти, который определен в компоновщике.

В частности, я вижу этот случай в коде rtems ниже:

определение внешнего символа "rdb_start" - start.S - строка 155 -157

внешнее использование символа "rdb_start" - bspgetworkarea.c - строка 23-41

Например, когда вы определяете размер ОЗУ 0x800000 в компоновщике и берете адрес входа как 0x40000000, тогда значение rdb_start автоматически соответствует 0x407FFFF0. Если вы определите любой другой символ, похожий на rdb_start, и сделаете его глобальным как rdb_start, вы увидите тот же результат. это значение автоматически присваивается 407FFFF0.

Зачем?

1 ответ

Решение

У меня был похожий вопрос при попытке запустить RTEMS на процессоре LEON3. Спросив Гайслера (людей, которые производят LEON3), я узнал, что rdb_start start означает "запуск удаленного отладчика" и является внешним установленным символом. Это то, что используется для установки указателя стека, когда программа напрямую загружается в ОЗУ через удаленный отладчик (например, GRMON) или когда распаковывается из PROM через ваш загрузчик (например, mkprom).

Указатель стека обычно должен быть установлен в конец памяти - 1 слово. Например, область памяти для процессора LEON3 с 8 МБ ОЗУ обычно находится в диапазоне от 0x40000000 до 0x407FFFFF, а указатель стека установлен на 0x407FFFF0.

Я был в состоянии изменить значение rdb_start передав опцию -stack в mkprom2 и используя команду стека в GRMON, чтобы установить значение нового указателя стека.

Я надеюсь, что это поможет следующему человеку, пытающемуся выяснить, что rdb_start в контексте RTEMS есть!

Другие вопросы по тегам