Скрипт компоновщика; добавить смещение в область памяти; - PullRequest
0 голосов
/ 24 января 2019

Короче, мне нужно разместить один раздел за другим. Проблема в том, что разделы должны находиться в разных виртуальных адресных пространствах.

Подробное: Есть два куска кода. Один раздел (загрузочный) работает с отключенным 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.

1 Ответ

0 голосов
/ 29 января 2019

Короче, решение состоит в том, чтобы добавить секцию phony для увеличения счетчиков компоновщика APP_VMA и DDR_MEMORY.

Я добавил новый раздел размером с раздел «boot», который увеличивает счетчики компоновщика и заставляет компоновщик размещать «app» в правильном виртуальном адресном пространстве и физически за разделом boot.

MEMORY {
    DDR_MEMORY  : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
    APP_VMA     : ORIGIN = 0xFF002000, LENGTH = 0xFFFFFF
    BOOT_LMA    : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
}

PHDRS
{
    mmu_on      PT_LOAD;
    no_mmu      PT_LOAD;
}

SECTIONS
{
    .boot : {
        *(.startup)
        _boot_sizeof = SIZEOF(.boot);
    } >BOOT_LMA : no_mmu

    .boot_phony : {
        . += _boot_sizeof ;
        /* Reserve a space to adjust counters APP_VMA and DDR_MEMORY */
    } >APP_VMA AT>DDR_MEMORY :no_mmu

    .app : {
        *(.text)
        *(.text*)
    } >APP_VMA AT>DDR_MEMORY : mmu_on
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...