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中文網其他相關文章!