Perché è necessario l'aliasing della memoria?
Sono confuso con questa architettura progettata da ST Microelectronics. Prendiamo ad esempio STM32F407VG. Il programma viene caricato in flash all'indirizzo 0x08000000. Tale indirizzo viene mappato all'indirizzo 0x00000000 perché dopo il ripristino il processore guarda prima 0x00000000. Perché non fare in modo che il primo indirizzo flash sia 0x00000000. Qual è il vantaggio dell'aliasing della memoria?
Risposte
Il core del processore sta esaminando l'indirizzo 0x00000000 per il puntatore dello stack e 0x00000004 per il vettore di ripristino (e attraverso altri vettori). Quindi, dal punto di vista dei core, vuoi che l'applicazione risponda. Ma questi prodotti contengono un bootloader programmato in fabbrica, oltre alla tua applicazione che aggiungi in seguito, quindi come fai ad avviare due programmi con un indirizzo? Un modo è rispecchiarli in quell'indirizzo. E se volessi aggiungere anche la funzione di consentire l'avvio del processore da sram, devi mappare anche quello.
Quindi non tutti tranne alcuni chip risolvono il problema in questo modo specchiandosi in base a perni di cinghia o bit di registro non volatili, ecc.
Le parti STM32 mapperanno solo una percentuale a 0x00000000, quindi vuoi davvero creare l'applicazione per 0x08000000 (o qualche altro indirizzo come 0x02000000 per un piccolo sottoinsieme delle loro parti, leggi i documenti!). In modo che, ad esempio, la tabella vettoriale abbia il seguente aspetto:
0x20001000
0x08000031
...
Il core del processore legge 0x00000004 ottiene il valore 0x08000031, il che significa che inizia l'esecuzione delle istruzioni all'indirizzo 0x08000030 per il gestore di ripristino. E da lì il programma esaurisce lo spazio degli indirizzi 0x08000000 e non 0x00000000.
Non tutti lo fanno in questo modo, ma alcuni lo fanno, non limitato a ST (STM32).
Non tutti hanno un bootloader programmato su chip, e alcuni di questi non hanno motivo di multiplexare quello spazio di indirizzi e non lo faranno.
Insieme alla risposta di old_timer che copre molto, per altre parti come la gamma STM32F0 basata su Cortex M0 non esiste un SCB->VTORregistro di offset della tabella vettoriale, per aggirare questo è possibile mappare diverse aree (RAM o flash) su 0x00000000 per consentire di avere un tabella vettoriale modificabile in tempo di esecuzione.