web-dev-qa-db-fra.com

À quoi sert le modificateur «asmlinkage»?

J'ai lu qu'il est utilisé pour des fonctions qui implémentent des appels système sous Linux. Par exemple:

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

et qu'il indique au compilateur de passer tous les arguments de fonction sur la pile. Mais n'est-ce pas déjà le cas? Les arguments de fonction sont généralement passés en les poussant uniquement sur la pile. Ou est-ce que nous parlons ici de passer des arguments de fonction à travers des registres?

37
gjain

Il y a une FAQ :

La balise asmlinkage est une autre chose que nous devons observer à propos de cette fonction simple. Il s'agit d'une # définition pour une magie gcc qui indique au compilateur que la fonction ne doit pas s'attendre à trouver l'un de ses arguments dans les registres (une optimisation courante), mais uniquement sur la pile du processeur. Rappelons notre affirmation précédente que system_call consomme son premier argument, le numéro d'appel système, et autorise jusqu'à quatre arguments supplémentaires qui sont transmis à l'appel système réel. system_call réalise cet exploit simplement en laissant ses autres arguments (qui lui ont été passés dans les registres) sur la pile. Tous les appels système sont marqués avec la balise asmlinkage, ils recherchent donc tous des arguments dans la pile. Bien sûr, dans le cas de sys_ni_syscall, Cela ne fait aucune différence, car sys_ni_syscall Ne prend aucun argument, mais c'est un problème pour la plupart des autres appels système. Et, parce que vous verrez asmlinkage devant de nombreuses autres fonctions, je pensais que vous devriez savoir de quoi il s'agissait.

Il est également utilisé pour autoriser l'appel d'une fonction à partir de fichiers Assembly.

36
dirkgently