2012-05-05 1 views
29

Ho letto che è usato per funzioni che implementano chiamate di sistema in Linux. Ad esempio:Per che cosa si intende il modificatore 'asmlinkage'?

asmlinkage long sys_getjiffies(void) 
{ 
    return (long)get_jiffies_64(); 
} 

e che dice al compilatore di passare tutti gli argomenti delle funzioni in pila. Ma non è già così? Gli argomenti delle funzioni vengono generalmente passati spingendoli solo sullo stack. O è che ci riferiamo al passare gli argomenti di funzione attraverso i registri qui?

+3

Si noti che i primi parametri delle funzioni del kernel di Linux vengono passati in registri su x86 per impostazione predefinita. Su x86-32 i primi 3 parametri vengono passati in '% eax','% edx' e '% ecx', in questo ordine, il resto va in pila. Le funzioni con liste di argomenti variabili sono un'eccezione, ottengono tutti i loro argomenti in pila su x86-32. Su x86-64, i primi 6 parametri vengono passati in '% rdi','% rsi', '% rdx','% rcx', '% r8','% r9' (anche per le funzioni con varargs), in questo ordine, il resto - in pila. Le chiamate di sistema seguono però diverse convenzioni. – Eugene

+0

(seguito) Come notava @dirkgently, 'asmlinkage' è un modo per ignorare le convenzioni di default sul passaggio dei parametri. Vedi anche una descrizione dettagliata delle varie convenzioni di chiamata in [Manuale di Agner Fog] (http://www.agner.org/optimize/calling_conventions.pdf). – Eugene

+0

C'è una buona spiegazione in Quora: [https://www.quora.com/Linux-Kernel/What-does-asmlinkage-mean-in-the-definition-of-system-calls](https://www .quora.com/Linux-kernel/What-fa-asmlinkage-media-in-the-definition-of-system-chiamate). –

risposta

26

C'è un FAQ:

Il tag asmlinkage è una altra cosa che dobbiamo osservare su questa semplice funzione. Questo è un #define per alcuni gcc magic che dice al compilatore che la funzione non dovrebbe aspettarsi di trovare nessuno dei suoi argomenti nei registri (un'ottimizzazione comune), ma solo nello stack della CPU. Ricordiamo la nostra precedente asserzione che system_call consuma il suo primo argomento , il numero di chiamata di sistema, e consente fino a quattro ulteriori argomenti che vengono passati alla chiamata di sistema reale. system_call raggiunge questa impresa semplicemente lasciando gli altri argomenti (che erano passati in registri) nello stack. Tutte le chiamate di sistema sono contrassegnate con con il tag asmlinkage, in modo che tutti guardino allo stack per gli argomenti. Ovviamente, nel caso sys_ni_syscall, questo non fa alcuna differenza, perché sys_ni_syscall non accetta alcun argomento, ma è un problema per la maggior parte delle altre chiamate di sistema. E, visto che vedrai asmlinkage di fronte a molte altre funzioni, ho pensato che dovresti sapere che cos'è .

Viene anche utilizzato per consentire il richiamo di una funzione dai file di assieme.

+6

La ragione è che comunque il kernel ha bisogno di salvare tutti i registri nello stack (per ripristinare l'ambiente prima di tornare allo spazio utente) quando gestiscono le richieste di chiamata di sistema dallo spazio utente, quindi dopo che i parametri sono disponibili sullo stack. Io, non ha bisogno di sforzi extra. fonte: http://stackoverflow.com/questions/10060168/is-asmlinkage-required-for-a-c-function-to-be-called-from-assembly – kumar