Go の Syscall.RawSyscall() 関数は 4 つの uintptr 型パラメータを取ります:
2 つの uintptr 値 r1 と r2、および Errno 値を返します:
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>
このコードは基本的に次のことを実行します。タスク:
zsyscall ファイル名 zsyscall_darwin_amd64.go の「z」プレフィックスは、特権のないプロセス用のシステム コール ラッパーが含まれていることを示します。これらのラッパーは、syscall を実行する前に、別のユーザーまたはスレッド ID への切り替えなどの追加タスクを処理します。
Syscall() と RawSyscall の主な違い() は、Syscall() が syscall の実行前と実行後に runtime.entersyscall(SB) と runtime.exitsyscall(SB) をそれぞれ呼び出していることです。これらの関数により、ランタイム システムはゴルーチンのブロック ステータスを追跡できます。一方、RawSyscall() はこれらの呼び出しを行わないため、同じ方法でランタイム システムと対話しません。
Syscall() は通常、直接呼び出したい特定の syscall 番号と引数がある場合に使用されます。 RawSyscall() は、OS パッケージによって公開されていない syscall を呼び出す必要がある場合や、syscall のブロック ステータスを手動で処理する必要がある場合など、syscall の実行をさらに制御したい場合に便利です。
以上が## Go では `syscall.RawSyscall()` と `syscall.Syscall()` はどのように異なりますか? それぞれをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。