Go の `Syscall.RawSyscall()` と `Syscall.Syscall()` の違いは何ですか?

DDD
リリース: 2024-10-25 13:30:30
オリジナル
342 人が閲覧しました

What's the Difference Between `Syscall.RawSyscall()` and `Syscall.Syscall()` in Go?

Go の Syscall.RawSyscall() と Syscall.Syscall() について

Go の syscall パッケージを初めて使用する方のために、Syscall.RawSyscall () 関数と Syscall.Syscall() 関数は、気が遠くなる可能性があります。ニュアンスを明確にするために、詳細な概要を次に示します。

Syscall.RawSyscall()

  • パラメータ:

    • trap: 実行するシステム コールの数値コード
    • a1、a2、a3: システム コールに渡される最初の 3 つの引数
  • 戻り値:

    • r1、r2: システムコールの結果
    • err: システムコールが失敗した場合のエラーコード

アセンブリ コードの実装:

Darwin/amd64 システムの場合、Syscall.RawSyscall() のアセンブリ コードはここにあります: https://golang.org /src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall

  • 行 61 ~ 80: このセクションでは、システム コールの引数を設定し、実行し、エラー処理を処理します。
  • 行 76: ok1 ラベルはシステム コールが成功したことを示し、結果が返されます。

Syscall.Syscall()

Syscall.Syscall () は、システム コールの実行前後に runtime.entersyscall() 関数と runtime.exitsyscall() 関数を呼び出す点だけが Syscall.RawSyscall() と異なります。これにより、Go ランタイムは goroutine によるシステム コールの使用を追跡および制御できるようになります。

使用法:

通常、Syscall.RawSyscall の代わりに Syscall.Syscall() を使用する必要があります。 () ほとんどの目的に使用できます。 Syscall.Syscall() は、Goroutine コンテキストの切り替えを処理し、プリエンプションとマルチタスクを有効にします。ランタイム コンテキスト切り替えメカニズムをバイパスする特別な必要がある場合にのみ、Syscall.RawSyscall() を使用してください。

例:

独自の syscall 関数を作成するには、1 つの方法があります。

  1. オペレーティング システムのドキュメントから、使用するシステム コールの詳細を理解します。
  2. 特定のオペレーティング システムとアーキテクチャの呼び出し規則に従うアセンブリ関数を作成します。 .
  3. システム コール番号を uintptr に変換し、適切なパラメーターを指定して Syscall.RawSyscall() を呼び出します。

ただし、この例では、アセンブリ プログラミングとシステム レベルの深い知識が必要です。そのため、可能な限り Syscall.Syscall() を使用することをお勧めします。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!