首頁  >  文章  >  後端開發  >  ## 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() 的參數和傳回值

中的Syscall.RawSyscall() 函數採用四個uintptr 型別參數:

    trap:這是系統呼叫陷阱編號。
  • a1、a2 和 a3:這些是系統呼叫。
它傳回兩個 uintptr 值,r1 和 r2,以及一個 Errno 值:

    r1 和 r2:這些是系統呼叫的回傳值。
  • err:這是一個錯誤值,指示在執行系統呼叫期間遇到的任何問題。
RawSyscall() 的彙編實作

RawSyscall( 的彙編實作) ) for darwin/amd64 可以在下列連結中找到:

[://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 指令呼叫系統呼叫。
  • 根據下列結果設定回傳值和 errno系統呼叫。
  • 檔案名稱中的 zsyscall

檔案名稱 zsyscall_darwin_amd64.go 中的「z」前綴表示它包含非特權程序的系統呼叫包裝器。這些包裝器處理其他任務,例如在執行系統呼叫之前切換到不同的使用者或執行緒 ID。

Syscall() 和RawSyscall() 之間的差異

Syscall() 和RawSyscall 之間的主要差異()是Syscall()在執行syscall之前和之後分別呼叫runtime.entersyscall (SB)和runtime.exitsyscall(SB)。這些函數允許運行時系統追蹤 goroutine 的阻塞狀態。另一方面,RawSyscall() 不會進行這些調用,因此它不會以相同的方式與運行時系統互動。

Syscall() 和 RawSyscall() 的用法

當您有特定的系統呼叫號碼和要直接呼叫的參數時,通常會使用 Syscall()。當您想要更多地控制系統呼叫執行時,例如當您需要呼叫 os 套件未公開的系統呼叫時,或者當您需要手動處理系統呼叫的阻塞狀態時,RawSyscall() 非常有用。

以上是## Go 中 `syscall.RawSyscall()` 和 `syscall.Syscall()` 有什麼不同,什麼時候應該使用它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn