Я пишу настраиваемый скрипт компоновщика для ARM-приложения без операционной системы. Приложение хранится во флэш-памяти, на данный момент у меня есть код загрузки, копирующий все приложение в SDRAM и продолжающий выполнение в SDRAM для повышения скорости. Я хочу изменить этот сценарий, чтобы запускать весь код напрямую из флэш-памяти, но у меня проблемы с пониманием некоторых элементов.
В приведенном ниже сценарии компоновщика раздел .ram_data
имеет адрес выполнения в RAM
и адрес загрузки в ROM
(оба раздела в SDRAM). Насколько я понимаю, адрес выполнения используется компоновщиком для разрешения символов всех элементов, не относящихся к ПК, но как насчет адреса загрузки? В контексте «голого» ARM не существует такой вещи, как загрузчик программ, и нет никакого способа, которым компоновщик может иметь какое-либо влияние на то, где я пишу программу во флэш-памяти, так для чего он на самом деле используется?
Таким же образом, как компоновщик может иметь какое-либо влияние на то, чтобы SDRAM была (rx) или (rw) во время выполнения? Действительно ли это что-то меняет, когда я изменяю эти параметры в областях памяти?
MEMORY
{
RAM(rw) : ORIGIN = 0x00001000, LENGTH = 12M-4K
ROM(rx) : ORIGIN = 0x007f1000, LENGTH = 60K
}
SECTIONS
{
.startup :
{ ... } > VECTOR
.rom_text :
{ ... } > ROM
.ram_data :
{
_data_start = .;
*(.data*)
_data_end = .;
} > RAM AT>ROM
.ram_bss :
{ ... } > RAM
}