Comment accéder à l'appel système à partir de l'espace utilisateur?

J'ai lu quelques paragraphes dans LKD1
et j'ai juste ne peut pas comprendre le contenu ci-dessous:

Accéder au Système d'Appel à partir de l'Espace Utilisateur

Généralement, la bibliothèque C fournit un soutien pour les appels-système. Les applications de l'utilisateur peut tirer dans les prototypes de fonction de la norme en-têtes et le lien avec la bibliothèque C d'utilisation de votre système d'appel (ou à la bibliothèque de routine qui, à son tour, utilise votre syscall appel). Si vous venez de l'appel système, cependant, il est douteux que la glibc supporte déjà!

Heureusement, Linux fournit un ensemble de macros pour l'emballage d'accès pour les appels système. Il met en place le contenu d'un registre et enjeux le piège des instructions. Ces macros sont nommés _syscalln()n est entre zéro et six ans. Le nombre correspond au nombre de paramètres passés dans le syscall, car la macro besoins de connaître le nombre de paramètres à attendre et, par conséquent, de pousser dans des registres. Par exemple, considérons le système d'appel open()définie comme

long open(const char *filename, int flags, int mode)

Le syscall macro pour utiliser ce système d'appel sans autorisation explicite de la bibliothèque de support serait

#define __NR_open 5
_syscall3(long, open, const char *, filename, int, flags, int, mode)

Ensuite, l'application peut simplement appeler open().

Pour chaque macro, il y a 2+2×n paramètres. Le premier paramètre correspond au type de retour de la syscall. Le second est le nom de l'appel système. Suit ensuite le type et le nom de chaque paramètre dans l'ordre de l'appel système. Le __NR_open définir est en <asm/unistd.h>; il est le système de numéro d'appel. Le _syscall3 macro se développe dans une fonction C avec inline assemblée; l'assemblée effectue les étapes décrites dans la section précédente pour pousser le système de numéro d'appel et les paramètres dans les registres et la question de l'interruption logicielle de piège dans le noyau. En plaçant cette macro dans une application est tout ce qui est requis pour l'utilisation de la open() appel système.

Nous allons écrire la macro à utiliser notre magnifique nouveau foo() système d'appel et ensuite écrire un peu de code de test pour montrer nos efforts.

#define __NR_foo 283
__syscall0(long, foo)

int main ()
{
        long stack_size;

        stack_size = foo ();
        printf ("The kernel stack size is %ld\n", stack_size);
        return 0;
}

Ce n' l'application peut simplement appeler open() veux dire?

En outre, pour le dernier morceau de code, où est la déclaration de foo()? Et comment puis-je faire de ce morceau de code compilable et exécutable? Quels sont les fichiers d'en-tête j'ai besoin d'inclure?

__________
1 Noyau Linux Développementpar Robert de l'Amour.
Le fichier PDF wordpress.com (aller page 81); Google Livres résultat.

source d'informationauteur injoy