Короче, мне нужно разместить один раздел за другим. Проблема в том, что разделы должны находиться в разных виртуальных адресных пространствах.
Подробное:
Есть два куска кода. Один раздел (загрузочный) работает с отключенным MMU и должен быть связан так, чтобы виртуальные и физические адреса были одинаковыми. Другой раздел работает, когда MMU включен (приложение), а виртуальный адрес смещен от физического.
Физически обе секции должны располагаться одна за другой.
Это часть скрипта компоновщика, с которым я борюсь
MEMORY {
DDR_MEMORY : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
APP_VMA : ORIGIN = 0xFF002000, LENGTH = 0xFFFFFF
BOOT_LMA : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
}
SECTIONS
{
.boot : {
*(.startup)
} >BOOT_LMA AT>DDR_MEMORY
.app : {
*(.text)
*(.text*)
} >APP_VMA AT>DDR_MEMORY
}
Результат:
Допустим, код запуска является размером 0x5C. Таким образом, загрузочный раздел связан как 0x2000 - 0x205C виртуальный и физический.
Код приложения должен находиться за разделом загрузки, и я хочу, чтобы он был размещен в 0xFF002060 (виртуальный) и 0x2060 (физический). Но APP_VMA
Я получаю 0xFF002000 (без смещения 0x60) с физическим местоположением, равным 0x2060 (это, как и ожидалось).
Итак, вопрос в том, как добавить смещение к APP_VMA, чтобы получить виртуальный адрес, соответствующий физическому (например, 0xFF002060)?
Спасибо.
PS: я использую компоновщик clang, но почти уверен, что это применимо и к gcc.