Maison > Article > Opération et maintenance > Qu'est-ce que l'appel système sous Linux
Sous Linux, l'appel système fait référence à un ensemble d'interfaces spéciales fournies par le système d'exploitation que les programmes utilisateur peuvent appeler. Les programmes utilisateur peuvent obtenir des services du noyau du système d'exploitation en fonction de cet ensemble d'appels système qui spécifient l'emplacement spécifique où se trouvent les programmes utilisateur. le processus utilisateur tombe dans le noyau, ou On dit que le chemin permettant aux utilisateurs d'accéder au noyau est planifié et que le noyau ne peut être accédé qu'à partir d'un emplacement fixe.
L'environnement d'exploitation de ce tutoriel : système linux7.3, ordinateur Dell G3.
1. Qu'est-ce qu'un appel système
L'appel système fait référence à un ensemble d'interfaces spéciales fournies par le système d'exploitation pour que les programmes utilisateur puissent obtenir le noyau du système d'exploitation. basé sur cet ensemble de services d’interfaces. Il stipule l'emplacement spécifique où le processus utilisateur tombe dans le noyau, ou planifie le chemin permettant à l'utilisateur d'accéder au noyau, et ne peut accéder au noyau qu'à partir d'un emplacement fixe.
2. Appels système Linux
Pour les systèmes d'exploitation modernes, les appels système sont un moyen de communication courant entre l'espace utilisateur et le noyau, et Linux ne fait pas exception. Selon les domaines fonctionnels, les appels système Linux sont grossièrement divisés en contrôle de processus, accès aux fichiers, contrôle du système, gestion du stockage, gestion du réseau, communication de processus, etc. Pour une description détaillée, vous pouvez consulter la description de la page de manuel via la commande man 2 syscalls.
L'appel système soumet uniquement une requête au noyau via le mécanisme d'interruption logicielle et entre dans le service correspondant de l'appel système. L'interface de programmation utilisateur fournie par Linux suit la norme POSIX En plus de définir certaines fonctions C standard, cet ensemble de normes fournit également un ensemble de routines d'encapsulation pour encapsuler les appels système pour la programmation utilisateur. Cependant, l'encapsulation n'est pas nécessaire. Si vous souhaitez appeler directement, le noyau Linux fournit également une fonction syscall() pour implémenter l'appel. Découvrez la différence entre les appels de bibliothèque C et les appels directs grâce à l'exemple suivant.
/* ** file: demo.c ** author: eric.xu ** date: 2016-02-25 */ #include <syscall.h> #include <unistd.h> #include <sys/types.h> #include <stdio.h> int main(void) { long id1, id2; /* system call no 20, __NR_getpid equal to SYS_getpid */ id1 = syscall(__NR_getpid); printf("sys_call getpid %ldn", id1); /* libc getpid */ id2 = getpid(); printf("libc getpid %ldn", id2); return 0; }
Compilez et exécutez, vous pouvez voir que les résultats sont cohérents.
sys_call getpid 2899 libc getpid 2899
3. Implémentation de l'appel système Linux
Lorsqu'un processus en mode utilisateur appelle un appel système, le processeur passe en mode noyau et commence à exécuter les fonctions du noyau. Étant donné que chaque appel système dans le noyau possède une étiquette unique, les appels en mode utilisateur doivent transmettre un paramètre de numéro d'appel système pour déterminer la fonction d'appel système spécifique. Toutes les fonctions d'appel système sont des entiers. Dans le noyau, les entiers et 0 indiquent que l'appel système se termine avec succès, et les nombres négatifs indiquent des conditions d'erreur. Cette valeur d'erreur sera stockée dans la variable errno et renvoyée à l'application sous forme de code d'erreur.
Les appels système Linux sont implémentés à l'aide d'interruptions logicielles. Dans l'architecture x86, l'instruction d'assemblage int $0x80 est appelée. Cette instruction générera une exception avec un vecteur de 128. Dans l'architecture arm, l'instruction SWI est utilisée pour entrer dans l'espace du noyau. Regardons le format de cette instruction :
SWI {cond} immed24;其中immed24表示24位立即数
Le gestionnaire d'interruption d'exception SWI doit obtenir le numéro immédiat de 24 bits en lisant l'instruction SWI qui a provoqué l'erreur. interruption logicielle. Les étapes de base consistent à accéder au registre SPSR pour déterminer si l'instruction est une instruction ARM ou une instruction Thumb après la génération de l'exception SWI, puis à obtenir l'adresse complète de l'instruction en accédant au registre LR, puis à obtenir l'instruction et à obtenir le données immédiates de 24 bits les plus basses.
Recommandations associées : "Tutoriel vidéo Linux"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!