Maison > développement back-end > Golang > le corps du texte

## Quand dois-je utiliser Syscall.RawSyscall() ou Syscall.Syscall() dans Go ?

Patricia Arquette
Libérer: 2024-10-26 09:17:29
original
1009 Les gens l'ont consulté

## When Should I Use Syscall.RawSyscall() vs. Syscall.Syscall() in Go?

Comprendre Syscall.RawSyscall() et Syscall.Syscall() dans Go

Contexte

Le langage Go utilise des appels système pour interagir avec le sous-jacent système opérateur. Le package syscall fournit les fonctionnalités nécessaires pour effectuer des appels système. Deux fonctions importantes de ce package sont Syscall.RawSyscall() et Syscall.Syscall().

Syscall.RawSyscall()

Objectif :
Fournit un moyen pour effectuer des appels système directement, permettant un contrôle précis.

Paramètres :

  • piège : le numéro d'appel système.
  • a1 , a2, a3 : Arguments à transmettre à l'appel système.

Valeurs de retour :

  • r1, r2 : Valeurs de retour de l'appel système .
  • err : un code d'erreur indiquant les problèmes rencontrés.

Syscall.Syscall()

Objectif :
Offre un interface de niveau supérieur pour passer des appels système, gérant certains des détails de niveau inférieur au nom de l'appelant.

Paramètres :
Similaire à Syscall.RawSyscall(), mais aussi accepte un nom d'appel système comme premier paramètre.

Valeurs de retour :

  • r1, r2 : valeurs de retour de l'appel système.
  • err : un code d'erreur indiquant les problèmes rencontrés.

Différences entre Syscall et RawSyscall

La principale différence entre les deux fonctions réside dans leur approche de la gestion de l'exécution des appels système. Syscall.Syscall() utilise une fonction d'assistance dans la bibliothèque d'exécution pour informer le planificateur qu'il entre dans une opération de blocage, permettant au planificateur de céder le contrôle à une autre goroutine ou thread. En revanche, Syscall.RawSyscall() n'effectue pas cette notification, ce qui signifie que la goroutine actuelle se bloquera jusqu'à la fin de l'appel système.

Considérations sur l'assemblage

L'implémentation de Syscall.RawSyscall() dans assembly pour Darwin/amd64 fournit un aperçu des instructions d'assemblage sous-jacentes utilisées pour effectuer les appels système.

61  TEXT ·RawSyscall(SB),7,
62      MOVQ    16(SP), DI
63      MOVQ    24(SP), SI
...
70      SYSCALL
...
76  ok1:
...
80      RET
Copier après la connexion
  • Lignes 61 à 68 : Charger les arguments (numéro d'interruption, arguments) à partir de empiler dans des registres.
  • Ligne 70 : Exécuter l'appel système via l'instruction SYSCALL.
  • Ligne 76 (ok1) : Étiquette de saut conditionnel utilisée pour gérer l'exécution réussie de l'appel système.
  • Lignes 77-80 : Renvoie les résultats (AX) à l'appelant si l'appel système a réussi.

zsyscall et Custom Fonctions Syscall

zsyscall fait référence à un sous-package au sein de syscall qui fournit des wrappers autour des appels système spécifiques au système d'exploitation z/OS.

En ce qui concerne la création de vos propres fonctions syscall, vous utiliserez généralement Syscall.Syscall() et spécifierez le nom de l'appel système et les arguments comme paramètres. Cependant, si vous avez besoin d'un contrôle plus précis ou si vous souhaitez éviter les frais d'exécution, vous pouvez opter pour Syscall.RawSyscall().

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!