He leído que se usa para funciones que implementan llamadas al sistema en Linux. Por ejemplo:¿Para qué sirve el modificador 'asmlinkage'?
asmlinkage long sys_getjiffies(void)
{
return (long)get_jiffies_64();
}
y que le dice al compilador que pasar todos los argumentos de la función en la pila. Pero, ¿no es ese el caso? Los argumentos de función generalmente se pasan presionándolos solo en la pila. ¿O es que nos estamos refiriendo a pasar argumentos de funciones a través de registros aquí?
Tenga en cuenta que los primeros parámetros de las funciones del kernel de Linux se pasan en los registros en x86 de forma predeterminada. En x86-32, los primeros 3 parámetros se pasan en '% eax','% edx' y '% ecx', en ese orden, el resto continúa en la pila. Las funciones con listas de argumentos variables son una excepción, obtienen todos sus argumentos en la pila en x86-32. En x86-64, los primeros 6 parámetros se pasan en '% rdi','% rsi', '% rdx','% rcx', '% r8','% r9' (incluso para las funciones con varargs), en ese orden, el resto - en la pila. Sin embargo, las llamadas al sistema siguen diferentes convenciones. – Eugene
(continuación) Como @dirkgently señaló, 'asmlinkage' es una forma de anular las convenciones predeterminadas sobre el paso de parámetros. Vea también una descripción detallada de varias convenciones de llamadas en [el manual de Agner Fog] (http://www.agner.org/optimize/calling_conventions.pdf). – Eugene
Hay una buena explicación en Quora: [https://www.quora.com/Linux-Kernel/What-does-asmlinkage-mean-in-the-definition-of-system-calls](https://www .quora.com/Linux-Kernel/What-does-asmlinkage-mean-in-the-definition-of-system-calls). –