Внешнее значение символа автоматически присваивается концу ОЗУ
Я не понимаю, почему внешний символ равен концу оперативной памяти, который определен в компоновщике.
В частности, я вижу этот случай в коде 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 есть!