Maison  >  Article  >  Tutoriel système  >  Présentation du processus d'appel système sous Linux

Présentation du processus d'appel système sous Linux

WBOY
WBOYavant
2024-04-11 09:43:01828parcourir
Processus :

Regardons d’abord une image pour avoir une idée générale.

Présentation du processus dappel système sous Linux

Tout d'abord, ce que l'application peut appeler directement, c'est l'API fournie par le système, ce qui peut être fait en mode utilisateur (Ring3).

Ensuite, l'API correspondante enregistrera le numéro d'appel système correspondant dans le registre eax (cette étape est implémentée via l'assemblage en ligne), puis utilisera int 0x80 pour déclencher l'interruption (assemblage en ligne) et entrera dans la fonction de traitement des interruptions (cette fonction est complètement écrit en code assembleur), il entre cette fois dans l'état du noyau (Ring0).

Dans la fonction de gestion des interruptions, l'appel système correspondant au numéro d'appel système sera appelé. Dans cette fonction, les deux registres ds et es seront définis pour pointer vers l'espace noyau. De cette façon, nous ne pouvons pas transférer de données du mode utilisateur au mode noyau (comme en open(const char * filename, int flag, ...), l'adresse de la chaîne pointée par le pointeur de nom de fichier est dans l'espace utilisateur, si vous la récupérez à l'endroit correspondant dans l'espace noyau, la chaîne n'existera pas du tout), que devez-vous faire ? Le registre fs dans le gestionnaire d'interruption est configuré pour pointer vers l'espace utilisateur, le problème est donc résolu.

Dans les appels système, les opérations correspondantes sont effectuées, telles que l'ouverture de fichiers, l'écriture de fichiers, etc.

Après le traitement, il reviendra à la fonction de traitement des interruptions et la valeur de retour est stockée dans le registre eax.

Lors du retour à l'API depuis la fonction de gestion des interruptions, la valeur de retour est toujours enregistrée dans le registre eax. À ce stade, il est restauré du mode noyau au mode utilisateur.

Obtenez la valeur de eax dans l'API, faites les jugements correspondants et renvoyez différentes valeurs pour indiquer l'achèvement de l'opération.

Pourquoi tant d'appels système peuvent-ils être appelés à l'aide d'une interruption int 0x80 ?

En mode protégé, il y a diverses interruptions et l'appel système est voué à interrompre le numéro 0x80. Lorsqu'un appel système doit être appelé, int 0x80 est déclenché et la fonction de gestion des interruptions utilise eax pour savoir quel appel système elle souhaite appeler. La raison en est qu'il y a trop d'appels système et qu'il n'y aura pas suffisamment de numéros d'interruption, un seul est donc utilisé pour la gestion centralisée.

Il existe un tableau dans le système d'exploitation qui est utilisé pour enregistrer les adresses de diverses fonctions d'appel système. Ce tableau est un tableau, donc les adresses des différentes fonctions sont accessibles via des indices. Par conséquent, un numéro d'interruption + différents numéros d'appel système peuvent être utilisés pour gérer plusieurs appels système.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:Principes DHCP sous LinuxArticle suivant:Principes DHCP sous Linux