Дык всё равно к линкеру же: /* Specify the memory areas */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K
CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
}
и тут же
/* MEMORY_bank1 section, code must be located here explicitly */
/* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
.memory_b1_text :
{
*(.mb1text) /* .mb1text sections (code) */
*(.mb1text*) /* .mb1text* sections (code) */
*(.mb1rodata) /* read-only data (constants) */
*(.mb1rodata*)
} >MEMORY_B1
Прямо с примером. Файл линкера у меня имеет расширение *.ld
Дальше - дело техники: как уже написали подвинуть область памяти, а на освободившемся пространстве сделать свой сегмент
с преферансом и куртизанками и использовать как душе угодно. Если STM32, то загляните SPL ещё в файлы statup_*.s и обратите внимание на функцию void SystemInit (void). В частности, там есть фрагмент
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
Замороченно, конечно, но ничего сверхсложного.