2012-05-05 45 views
29

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í?

+3

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

+0

(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

+0

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

Respuesta

26

Hay una FAQ:

La etiqueta asmlinkage es otra cosa que debemos observar acerca esta función sencilla. Este es un #define para alguna magia gcc que dice al compilador que la función no debe esperar encontrar ninguno de sus argumentos en los registros (una optimización común), sino solo en la pila de la CPU. Recuerde nuestra afirmación anterior de que system_call consume su primer argumento , el número de llamada del sistema, y ​​permite hasta cuatro más argumentos que se transmiten a la llamada al sistema real. system_call logra esta proeza simplemente dejando sus otros argumentos (que fueron pasados ​​a él en los registros) en la pila. Todas las llamadas al sistema están marcadas con con la etiqueta de enlace intermedio, por lo que todas miran a la pila en busca de argumentos. Por supuesto, en el caso de sys_ni_syscall, esto no hace ninguna diferencia, porque sys_ni_syscall no toma ningún argumento, pero es un problema para la mayoría de las demás llamadas al sistema. Y, debido a que verá asmlinkage delante de muchas otras funciones, pensé que debería saber de qué se trataba .

También se utiliza para permitir llamar a una función desde archivos de ensamblaje.

+6

La razón es que de todos modos el núcleo necesita guardar todos los registros en la pila (para restaurar el entorno antes de regresar al espacio de usuario) cuando maneja las solicitudes de llamadas del sistema desde el espacio de usuario, así que después los parámetros están disponibles en la pila. Es decir, no necesita un esfuerzo extra. fuente: http://stackoverflow.com/questions/10060168/is-asmlinkage-required-for-ac-c-function-to-be-llamado-de-montaje – kumar