Maison  >  Article  >  développement back-end  >  ## Quand dois-je utiliser Syscall.RawSyscall() ou Syscall.Syscall() dans Go ?

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

Patricia Arquette
Patricia Arquetteoriginal
2024-10-26 09:17:29994parcourir

## 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
  • 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!

Déclaration:
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