Адрес загрузки раздела и адрес выполнения в скрипте компоновщика

Я пишу настраиваемый скрипт компоновщика для 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
}

person Étienne    schedule 09.04.2013    source источник


Ответы (2)


Учитывая ваш пример сценария компоновщика, эти два вопроса связаны.

Насколько я понимаю, адрес выполнения используется компоновщиком для разрешения символов всех элементов, не относящихся к ПК, но как насчет адреса загрузки?

Таким же образом, как компоновщик может иметь какое-либо влияние на то, чтобы SDRAM была (rx) или (rw) во время выполнения? Действительно ли это что-то меняет, когда я изменяю эти параметры в областях памяти?

Адрес LOAD полезен, так как все должно быть запрограммировано на FLASH. Вот почему .ram_data должен иметь AT>ROM. Он сообщает компоновщику, что данные будут LOAD из ROM / Flash. Вы должны создать некоторый загрузочный код ассемблера, который в этом случае скопирует его из флэш-памяти в SDRAM.

На второй вопрос можно ответить, указав >ROM вместо раздела .ram_data. Если вы это сделаете, компоновщик будет жаловаться, что доступный для записи раздел помещается в доступную только для чтения память. Рекомендуется пометить MEMORY разделы информацией для чтения / записи, так как это может помочь убедиться, что у вас есть разделы в нужных местах. Т.е. это перекрестная проверка информации, которую вы даете компоновщику.

Ошибка, когда >RAM AT>ROM вместо >ROM делает концепции / вопросы похожими.

person artless noise    schedule 09.04.2013
comment
Хорошо, спасибо! В моем случае имя немного вводит в заблуждение, ПЗУ на самом деле находится в SDRAM, содержимое из флэш-памяти копируется в раздел ПЗУ в SDRAM и выполняется в разделе RAM в SDRAM. Таким образом, компоновщик не знает об адресе флеш-памяти (в моем случае 0xffff0000), а код загрузки, выполняющий копирование, написан с помощью инструкций, относящихся к ПК. - person Étienne; 10.04.2013
comment
@ Этьен, понятно. Что ж, в некоторых ситуациях вы действительно можете выполнять из NOR флеш-памяти (это, вероятно, медленнее для вас с SDRAM). В этом случае .text остается в flash, а .data копируется в SDRAM из flash. Вы можете сделать код загрузчика не относящимся к ПК, указав область памяти FLASH и перечислив в этом разделе объекты загрузчика. Однако, если и ваше ПЗУ, и ОЗУ находятся в SDRAM, использование AT не требуется и тратит память. - person artless noise; 10.04.2013

Насколько я понимаю, адрес выполнения используется компоновщиком для разрешения символов всех элементов, не относящихся к ПК, но как насчет адреса загрузки? В контексте «голого» ARM не существует такой вещи, как загрузчик программ, и нет никакого способа, которым компоновщик может иметь какое-либо влияние на то, где я пишу программу во флэш-памяти, так для чего он на самом деле используется?

Эта информация хранится в исполняемом файле ELF и используется такими инструментами, как objcopy, для определения расположения двоичного файла (например, .bin или .hex). В конечном итоге он сообщает вашему программисту, где разместить программу.

Таким же образом, как компоновщик может иметь какое-либо влияние на то, чтобы SDRAM была (rx) или (rw) во время выполнения? Действительно ли это что-то меняет, когда я изменяю эти параметры в областях памяти?

Я считаю, что в данном конкретном случае эти флаги носят исключительно информационный характер. Они в основном используются для динамически загружаемых программ.

person Community    schedule 09.04.2013
comment
Хорошо, спасибо за ответ! В этом конкретном случае я использую рукописный программист, который не читает двоичную информацию, но хорошо знать, что он используется для этой цели. - person Étienne; 10.04.2013