2013-08-21 10 views
5

Ho eseguito il codice che utilizza l'attributo _ _ ((sezione ("nome")). Capisco che per il compilatore gcc questo consente di dire al linker di mettere l'oggetto creato in una sezione specifica "nome" (.?., con "nome" indirizzo assoluto dichiarata in un file linker)__attribute __ ((sezione ("nome"))) utilizzo?

Qual è il punto di fare questo invece di utilizzare la sezione .data

+0

È perché questa è la piattaforma del codice su cui sto lavorando. Sono consapevole del fatto che questo ____attribute____ è disponibile solo su determinate piattaforme, quindi ho voluto includerlo per chiarezza. Sto cercando di capire qual è l'intenzione del programmatore quando ha eliminato alcuni oggetti in oggetti di prova, tracciare oggetti, ecc. – tll

+0

Ho rimosso la sezione ARM in modo che sia più chiaro che non sono interessato a ARM in modo specifico, ma solo all'utilizzo. – tll

risposta

5

ci sono molti usi possibili [Modifica per aggiungere nota: questo è solo un esempio di usi che ho visto o considerato, non un elenco completo.]

Il kernel di Linux, ad esempio, segna un po 'di dati e codice sectio ns usato solo durante il bootstrap del kernel. Questi possono essere rilasciati dopo che il kernel è in esecuzione, recuperando lo spazio per altri usi.

È possibile utilizzare questo per contrassegnare il codice oi valori di dati che richiedono il patch su una particolare variante di processore, ad esempio con o senza un coprocessore.

Puoi usarlo per far vivere le cose in spazi di indirizzi "speciali" che verranno masterizzati su PROM o salvati su una EEPROM, piuttosto che nella memoria ordinaria.

È possibile utilizzarlo per raccogliere insieme codice o aree di dati per scopi come l'inizializzazione e la pulizia, come con costruttori e distruttori C++ che vengono eseguiti prima dell'avvio del programma e quando finisce, o per l'utilizzo di modalità di indirizzamento più brevi (io no sapere quanto questo si applicherebbe su ARM poiché non ho scritto alcun codice ARM da solo).

L'utilizzo effettivo dipende dagli script del linker.

+0

Altri usi sono ** hot ** e ** cold ** per * localizzazione cache *. È anche possibile partizionare funzionalità, come la gestione degli interrupt, la pianificazione, ecc. Anche se la routine/funzionalità può trovarsi in un file 'C', il percorso di esecuzione tipico può trarre vantaggio raggruppando * stack di chiamate *. Alcuni codici possono essere eseguiti da * flash * o * ram interna *. Queste risorse possono essere limitate, ecc. –

+0

@torek Sul tuo ultimo punto sulla raccolta di aree di codice/dati per l'inizializzazione/pulizia, questo significa essenzialmente che posso scegliere di includere il codice prima dell'avvio del programma, ma durante l'esecuzione invece del tempo di compilazione? Un po 'come una versione migliore di #ifdef? – tll

+0

Non sono sicuro di quello che stai chiedendo qui. Se hai scritto uno script linker che includeva alcune sezioni e ne hai scartate altre, potresti includere o escludere pezzi al momento * link *. Fare cose a * run * time richiede il coordinamento del tuo script linker e del tuo codice run-time, ed è molto più difficile. – torek

2

Da un punto usecase di vista, ci sono un sacco di diversi tipi di .data, come:

  • dati locali ad una specifica CPU e/o nodo NUMA
  • dati condivisi tra i contesti (come utente/kernelspace, come lo sono le pagine .vdso o vsyscall. Oppure, un altro esempio, bootloader e kernel)
  • dati di sola lettura o altri dati con specifiche modalità di accesso/restrizioni di tipo (ad esempio, cache o cache residency - quest'ultima può essere specificata su alcuni ARM SoC)
  • dati che persistono "transizioni di stato" (ad esempio caricamenti di immagini di sospensione o reinizializzazione del kernel/riavvio rapido)
  • dati con specifiche durate/cicli di vita (utilizzati solo in fasi specifiche durante l'avvio o durante l'operazione, dati in scrittura una sola volta)
  • dati specifici per un particolare sottosistema kernel o particolare modulo del kernel
  • "codice di co-locato" i dati (indirizzamento offset a x64 sono più/meno 2 GB, quindi se volete RIP -relative affrontando, i dati devono essere all'interno di tale intervallo della vostra codice attualmente in esecuzione)
  • dati mappati su un determinato spazio di registro hardware range VA

Così alla fine è spesso circa attributi (la parola qui usato in senso più generico di quello che __attribute__(...) consente di affermare dall'interno gcc codice sorgente. Se un'altra sezione è necessaria e/o utile è ... negli occhi di chi guarda - il progettista del sistema, cioè.

La disponibilità dell'attributo section, pertanto, consente flessibilità e cioè, IMHO, una buona cosa.

Problemi correlati