У меня есть система, построенная с использованием инструментов 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
не было. Я пробовал все виды вещей, но не могу заставить это работать. Есть идеи? Я не думал, что это было бы так необычно.