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?
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
(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
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). –