gazzetta - modificatore difesa fantapazz



Per cosa è destinato il modificatore 'asmlinkage'? (1)

Ho letto che è usato per funzioni che implementano chiamate di sistema in Linux. Per esempio:

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

e che dice al compilatore di passare tutti gli argomenti della funzione nello stack. 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?

https://src-bin.com


Answer #1

C'è una FAQ :

Il tag asmlinkage è un'altra cosa che dovremmo osservare su questa semplice funzione. Questo è un #define per alcuni magic gcc 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 affermazione che system_call consuma il suo primo argomento, il numero di chiamata di sistema, e consente fino a quattro ulteriori argomenti che vengono passati insieme alla chiamata di sistema reale. system_call raggiunge questa abilità semplicemente lasciando gli altri argomenti (che sono stati passati in registri) nello stack. Tutte le chiamate di sistema sono contrassegnate con il tag asmlinkage, in modo che tutti guardino allo stack per gli argomenti. Naturalmente, nel caso di sys_ni_syscall , questo non fa alcuna differenza, perché sys_ni_syscall non sys_ni_syscall argomenti, ma è un problema per la maggior parte delle altre chiamate di sistema. E, poiché vedrai asmlinkage di asmlinkage a molte altre funzioni, ho pensato che dovresti sapere di cosa si trattava.

Viene anche utilizzato per consentire la chiamata di una funzione da file di assembly.





linux-kernel