ホームページ  >  記事  >  バックエンド開発  >  ## Go では `syscall.RawSyscall()` と `syscall.Syscall()` はどのように異なりますか? それぞれをいつ使用する必要がありますか?

## Go では `syscall.RawSyscall()` と `syscall.Syscall()` はどのように異なりますか? それぞれをいつ使用する必要がありますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-26 07:24:30735ブラウズ

## How do `syscall.RawSyscall()` and `syscall.Syscall()` differ in Go, and when should you use each?

Go の Syscall.RawSyscall() と Syscall.Syscall() の詳細な分析

Syscall.RawSyscall() のパラメーターと戻り値

Go の Syscall.RawSyscall() 関数は 4 つの uintptr 型パラメータを取ります:

  • trap: これは syscall トラップ番号です。
  • a1、a2、および a3: これらは次の引数です。 syscall.

2 つの uintptr 値 r1 と r2、および Errno 値を返します:

  • r1 と r2: これらは syscall の戻り値です。
  • err: これは、syscall の実行中に発生した問題を示すエラー値です。

RawSyscall() のアセンブリ実装

RawSyscall() のアセンブリ実装) darwin/amd64 については、次のリンクにあります:

[https://golang.org/src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall](https://golang.org /src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall)

このファイルの 61 ~ 80 行目には、次のアセンブリ コードが含まれています。

<code class="assembly">61  TEXT ·RawSyscall(SB),7,
62      MOVQ    16(SP), DI
63      MOVQ    24(SP), SI
64      MOVQ    32(SP), DX
65      MOVQ    , R10
66      MOVQ    , R8
67      MOVQ    , R9
68      MOVQ    8(SP), AX   // syscall entry
69      ADDQ    x2000000, AX
70      SYSCALL
71      JCC ok1
72      MOVQ    $-1, 40(SP) // r1
73      MOVQ    , 48(SP)  // r2
74      MOVQ    AX, 56(SP)  // errno
75      RET
76  ok1:
77      MOVQ    AX, 40(SP)  // r1
78      MOVQ    DX, 48(SP)  // r2
79      MOVQ    , 56(SP)  // errno
80      RET</code>

このコードは基本的に次のことを実行します。タスク:

  • 引数を適切なレジスタに移動します。
  • SYSCALL 命令を使用して syscall を呼び出します。
  • 結果に基づいて戻り値と errno を設定します。ファイル名
の syscall.

zsyscall ファイル名 zsyscall_darwin_amd64.go の「z」プレフィックスは、特権のないプロセス用のシステム コール ラッパーが含まれていることを示します。これらのラッパーは、syscall を実行する前に、別のユーザーまたはスレッド ID への切り替えなどの追加タスクを処理します。

Syscall() と RawSyscall() の違い

Syscall() と RawSyscall の主な違い() は、Syscall() が syscall の実行前と実行後に runtime.entersyscall(SB) と runtime.exitsyscall(SB) をそれぞれ呼び出していることです。これらの関数により、ランタイム システムはゴルーチンのブロック ステータスを追跡できます。一方、RawSyscall() はこれらの呼び出しを行わないため、同じ方法でランタイム システムと対話しません。

Syscall() と RawSyscall() の使用法

Syscall() は通常、直接呼び出したい特定の syscall 番号と引数がある場合に使用されます。 RawSyscall() は、OS パッケージによって公開されていない syscall を呼び出す必要がある場合や、syscall のブロック ステータスを手動で処理する必要がある場合など、syscall の実行をさらに制御したい場合に便利です。

以上が## Go では `syscall.RawSyscall()` と `syscall.Syscall()` はどのように異なりますか? それぞれをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。