Помещение исходных .data в загрузочное изображение с помощью LMA! = VMA с использованием GNU ld - PullRequest
0 голосов
/ 29 марта 2020

У меня есть система, построенная с использованием инструментов GNU. Я использую U-Boot для загрузки образа из QSPI fla sh в RAM. Поэтому очевидно, что QSPI fla sh не адресуется ЦП как ПЗУ. Я также использую двухъядерный процессор (AMP) и хотел бы, чтобы cpu0 сбрасывал cpu1 без перезагрузки или перезагрузки загрузчика. Это означает, что crt0 в процессоре cpu1 должен повторно инициализировать .data и очистить разделы .bss.

Обычный сценарий компоновщика ld устанавливает LMA = VMA для раздела .data, где загруженный образ по своей природе инициализирует .data.

SECTIONS
{
    .text
    {
        *(.text)
    } > ram

    .rodata
    {
        *(.rodata)
    } > ram

    .data
    {
        *(.data)
    } > ram
}

|-----------|\
| .text     | \
|-----------|  \
| .rodata   |   -- load image
|-----------|  /
| .data     | /
|-----------|/
| .bss      |
|-----------|

Но для моего случая мне нужно, чтобы исходные данные .data были отдельной частью изображения, чтобы crt0 мог (повторно) инициализировать их при сбросе с помощью cpu0.

SECTIONS
{
    .text
    {
        *(.text)
    } > ram

    .rodata
    {
        *(.rodata)
    } > ram

    .data
    {
        *(.data)
    } > ram AT ram
}

|-----------|\
| .text     | \
|-----------|  \
| .rodata   |   -- load image
|-----------|  /
| .initdata | /
|-----------|/
| .data     |
|-----------|
| .bss      |
|-----------|

Вышеприведенный } > ram AT ram не работает, так как по умолчанию LMA = VMA, как если бы AT не было. Я пробовал все виды вещей, но не могу заставить это работать. Есть идеи? Я не думал, что это было бы так необычно.

...