ホームページ > バックエンド開発 > Golang > ## Go では Syscall.RawSyscall() と Syscall.Syscall() のどちらを使用すべきですか?

## Go では Syscall.RawSyscall() と Syscall.Syscall() のどちらを使用すべきですか?

Patricia Arquette
リリース: 2024-10-26 09:17:29
オリジナル
1107 人が閲覧しました

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

Go の Syscall.RawSyscall() と Syscall.Syscall() を理解する

背景

Go 言語は、システム コールを利用して基礎となる言語と対話します。オペレーティング·システム。 syscall パッケージは、システム コールを実行するために必要な機能を提供します。このパッケージ内の 2 つの重要な関数は、Syscall.RawSyscall() と Syscall.Syscall() です。

Syscall.RawSyscall()

目的:
方法を提供しますシステム コールを直接実行し、きめ細かい制御が可能です。

パラメータ:

  • トラップ: システム コール番号。
  • a1 、a2、a3: システム コールに渡す引数。

戻り値:

  • r1、r2: システム コールからの戻り値.
  • err: 発生した問題を示すエラー コード。

Syscall.Syscall()

目的:
システムコールを実行し、呼び出し元に代わって下位レベルの詳細の一部を処理するための上位レベルのインターフェイス。

パラメータ:
Syscall.RawSyscall() に似ていますが、最初のパラメータとしてシステム コール名を受け入れます。

戻り値:

  • r1、r2: システム コールからの戻り値。
  • err: 発生した問題を示すエラー コード。

Syscall と RawSyscall の違い

2 つの関数の主な違いは、システム コールの実行を処理するアプローチにあります。 Syscall.Syscall() は、ランタイム ライブラリのヘルパー関数を利用して、ブロック操作に入っていることをスケジューラに通知し、スケジューラが別の goroutine またはスレッドに制御を譲ることができるようにします。対照的に、Syscall.RawSyscall() はこの通知を実行しません。つまり、現在の goroutine はシステム コールが完了するまでブロックされます。

アセンブリの考慮事項

Syscall.RawSyscall() の実装Darwin/amd64 のアセンブリは、システム コールの実行に使用される基礎となるアセンブリ命令についての洞察を提供します。

61  TEXT ·RawSyscall(SB),7,
62      MOVQ    16(SP), DI
63      MOVQ    24(SP), SI
...
70      SYSCALL
...
76  ok1:
...
80      RET
ログイン後にコピー
  • 行 61 ~ 68: 引数 (トラップ番号、引数) をロードします。
  • 70 行目: SYSCALL 命令を介してシステムコールを実行します。
  • 76 行目 (ok1): 条件付きジャンプラベルが使用されています。成功したシステム コールの実行を処理します。
  • 行 77 ~ 80: システム コールが成功した場合、呼び出し元に結果 (AX) を返します。

zsyscall および Custom Syscall 関数

zsyscall は、z/OS オペレーティング システムに固有のシステム コールのラッパーを提供する syscall 内のサブパッケージを指します。

独自の syscall 関数を作成する場合、通常は Syscall.Syscall() を使用し、システム コール名と引数をパラメータとして指定します。ただし、より正確な制御が必要な場合、または実行時のオーバーヘッドを回避したい場合は、Syscall.RawSyscall().

を選択できます。

以上が## Go では Syscall.RawSyscall() と Syscall.Syscall() のどちらを使用すべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート