Comprendre les appels du système Linux
Les appels système sont des mécanismes dans lesquels les programmes utilisateur demandent des opérations privilégiées via l'interface du noyau. Le workflow est: 1. Les programmes utilisateur appellent les fonctions d'encapsulation; 2. Définissez les numéros d'appel système et les paramètres sur les registres; 3. Exécuter les instructions syscall et tomber dans l'état du noyau; 4. Exécuter les fonctions de traitement correspondantes dans la table de contrôle; 5. Retour à l'état de l'utilisateur après l'exécution. Vous pouvez utiliser Strace Tool pour suivre, appeler directement la fonction SYSCall () ou vérifier le fichier d'en-tête unitd.h pour afficher le numéro d'appel. Vous devez noter que la différence entre les appels système et les fonctions de bibliothèque est de savoir s'ils entrent dans l'état du noyau, et les appels fréquents affecteront les performances. Vous devez optimiser en fusionnant les E / S, en utilisant des méthodes MMAP et EPOLL, et la compréhension des appels système vous aidera à maîtriser le mécanisme de fonctionnement sous-jacent de Linux.
Les appels système Linux (appels système) sont le mécanisme de base des programmes utilisateur pour interagir avec le noyau. Ils fournissent aux applications des interfaces pour accéder aux services matériels et systèmes d'exploitation sous-jacents, tels que les opérations de fichiers, le contrôle des processus, la communication réseau, etc. La compréhension du principe de travail des appels système vous aidera à comprendre profondément le mécanisme de fonctionnement du système Linux et est d'une grande importance à la programmation système, au réglage des performances et au dépannage.

Qu'est-ce qu'un appel système?
Les appels système sont un ensemble d'interfaces fournies par le noyau du système d'exploitation, permettant aux programmes d'espace utilisateur de demander au noyau d'effectuer certaines opérations privilégiées. Étant donné que les programmes utilisateur ne peuvent pas accéder directement au matériel ou à exécuter des instructions sensibles (telles que la modification des unités de gestion de la mémoire, les registres des périphériques de fonctionnement, etc.), ces tâches doivent être "déléguées" au noyau via les appels système.
Les appels système communs comprennent:

-
open()
: ouvrez le fichier -
read()
/write()
: lire ou écrire un fichier ou un appareil -
fork()
/execve()
: créer un processus et exécuter un programme -
exit()
: termine le processus actuel -
socket()
/bind()
/send()
: effectuer une communication réseau -
mmap()
: fichiers mappés de mémoire ou mémoire allouée
Ces fonctions ressemblent à des fonctions de bibliothèque C normales, mais déclenchent en interne un commutateur de l'état de l'utilisateur à l'état du noyau.
Comment fonctionnent les appels système?
L'essence des appels système est que le programme utilisateur-État tombe dans l'état du noyau via des interruptions douces ou des instructions spéciales , et le noyau exécute les fonctions correspondantes avant de revenir à l'état utilisateur.

Le processus de base est le suivant:
Fonction d'incapsulation des appels de programme
Par exemple, si vous appelezwrite(fd, buf, len)
dans la bibliothèque C, cette fonction n'est qu'un wrapper.Définir le numéro d'appel système et les paramètres
Mettez le numéro d'appel système (tel que__NR_write
) dans un registre spécifique (tel querax
), et placez les paramètres dansrdi
,rsi
,rdx
, etc.Déclencher des instructions pour rester coincé dans le noyau
Utilisez la directivesyscall
(x86-64) ouint 0x80
(ancienne méthode) pour entrer l'état du noyau.Recherche et exécuter les fonctions de traitement des appels système
Le noyau trouve la fonction correspondante dans la table d'appel système (sys_call_table
) en fonction du numéro d'appel système, tel quesys_write()
.Retour à l'état de l'utilisateur après l'exécution
Le résultat est renvoyé via le registre (généralementrax
) lors de la restauration du contexte de l'état utilisateur.
⚠️ Remarque: les programmes utilisateur ne peuvent pas appeler directement les fonctions du noyau telles que
sys_write
et doivent être redirigées à travers l'instructionsyscall
.
Comment afficher les appels système?
Dans le développement ou le débogage réel, il existe de nombreuses façons d'observer le comportement des appels du système:
1. Utilisez l'outil strace
strace
est l'outil de suivi des appels système le plus couramment utilisé, qui peut afficher tous les appels système, leurs paramètres et leurs valeurs de retour pendant l'exécution du programme.
Strace LS
Exemple de sortie:
execve ("/ bin / ls", ["ls"], 0x7ff5a5b5b30) = 0 brk (null) = 0x55a3b7c5b000 mmap (null, 8192, prot_read | prot_write, map_private | map_anonymous, -1, 0) = 0x7f9d2b3ed000 openAt (at_fdcwd, "/etc/ld.so.cache", o_rdonly | o_cloexec) = 3
Cela peut vous aider à comprendre la véritable opération derrière une commande.
2. Utilisez directement syscall()
dans le programme
Bien qu'il soit généralement suffisant d'utiliser GLIBC pour encapsuler les fonctions, vous pouvez également appeler syscall()
directement:
#include <sys / syscall.h> #include <unistd.h> int main () { syscall (sys_write, 1, "Hello \ n", 6); retour 0; }
Ceci équivaut à write(1, "Hello\n", 6);
, mais contourne l'encapsulation de la bibliothèque C.
3. Voir /usr/include/asm/unistd.h
ou documentation en ligne
Les numéros d'appel système de différentes architectures sont définis dans le fichier d'en-tête. Par exemple, le numéro d'appel de x86-64 peut être trouvé dans asm/unistd_64.h
.
Appels système vs fonctions de bibliothèque
Les débutants confondent souvent les appels système et les fonctions de bibliothèque. La principale différence est:
Points de différence | Appels système | Fonctions de la bibliothèque (comme GLIBC) |
---|---|---|
Niveau d'exécution | Entrez dans l'état du noyau | Généralement exécuté en mode utilisateur |
Performance Overhead | Élevé (la commutation de contexte implique) | Faible |
S'il est fourni directement par le noyau | Oui | Non (implémenté par la bibliothèque C) |
Exemple | read , write , open
|
printf , malloc , strlen
|
✅ Remarque:
printf
n'est pas un appel système, il appellera éventuellementwrite()
pour déclencher l'appel système.
Conseils: Impact des performances des appels système
Les appels système fréquents affectent les performances du programme car le contexte est commuté à chaque fois. Les suggestions d'optimisation incluent:
- Fusionner les petits appels
write()
et utiliser la sortie de lot tamponnée - Utilisez
mmap
au lieu deread/write
pour traiter les fichiers volumineux - Utiliser des mécanismes tels que
epoll
pour réduire le nombre d'appels système pour les E / S de réseau
Dans les services haute performance, la réduction du nombre d'appels système est souvent un point d'optimisation clé.
Fondamentalement, c'est tout. Les appels système sont la «fondation» des programmes Linux. Bien que la plupart d'entre eux soient encapsulés par des API avancées dans le développement quotidien, ils sont un concept de base qui ne peut pas être évité lors de la programmation système approfondie. Le comprendre vous rendra plus clair sur ce qui arrive au programme en bas.
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT
Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



Utilisez (tableau) pour convertir des objets simples en tableaux. S'ils contiennent des propriétés privées ou protégées, les noms de clés auront des caractères spéciaux; Pour les objets imbriqués, les fonctions récursives doivent être utilisées pour traverser la conversion pour garantir que tous les objets hiérarchiques deviennent des tableaux associatifs.

Utilisez la bibliothèque GD de PHP pour ajouter des filigranes aux images. Chargez d'abord l'image d'origine et le filigrane (texte ou image), puis utilisez ImageCopy () ou ImageTtfText () pour fusionner et enfin enregistrer la sortie. Prise en charge des formats JPEG, PNG et d'autres formats, faites attention à la gestion des chemins de transparence et de police, et assurez-vous que l'extension GD est activée.

EmpêcherxssyescapingOutputwithhtmlSpecialChars () orjson_encode (), validerInputUsingFilter_var (), appliquercspheaders, andusingSecureFrameWorkslikeLaravel.

UseGettenv () toreAnvironmentVariblesandvlucas / phpdotenvtoload.envfilesIndevelopment; storessisivedatalikeysoutsoudecode, neverCommit.envtoversionControl, et utiliseActualenvironmentVariableSinproductionForsecurity.

Initializecurlwithcurl_init (), setOptions likeurl, méthode etheaders, sendDatausingPostorCustomThods, HandleResponseViacurl_exec (), checkerrorswithcurl_error (), rétrogradestatususingcurl_getinfo (), décodejsonresponse, etclosewithcurl_close ().

Utilisez le tableau hyperglobal $ _POST pour obtenir des données de post, lisez la valeur via l'attribut de nom de formulaire et utilisez une boucle FOREACH lors du traitement de l'entrée du tableau, afin que les données doivent être vérifiées et filtrées pour empêcher les XS.

Staticproperties andmethodsbelongtotheclass, nominstances, permingshareddataandutilityfunctions.ullestatickeywordand :: operatorforaccess.example: compter :: incrément () a augmentée $ count.insideclass, usel

Oui, en configurant PHP pour réécrire l'ID de session à l'aide de l'URL (tels que l'activation de session.use_trans_sid), de passer manuellement session_id dans la demande, ou de créer un système de session basé sur des jetons personnalisés (comme l'utilisation d'un jeton aléatoire de base de données), vous pouvez gérer des séances dans un environnement sans cookie, mais vous devez empêcher les fuites et les attaques fixes. Il est recommandé de coopérer avec HTTPS et de rafraîchir le jeton après s'être connecté.
