了解Go 中的Syscall.RawSyscall() 和Syscall.Syscall()
簡介簡介
簡介
簡介
簡介
簡介
簡介
簡介- 簡介
- 介紹🎜 >Go中的Syscall套件提供了與作業系統的低階互動。該套件中兩個值得注意的函數是 RawSyscall() 和 Syscall(),它們提供了執行系統呼叫的不同方式。
RawSyscall
RawSyscall() 函數執行原始系統調用,採用以下參數:
- trap:要執行的系統調用號碼。
- a1、a2、a3:系統呼叫的參數。
它傳回以下內容:
r1, r2:系統呼叫的結果。
err:指示遇到的任何錯誤的錯誤值。
彙編程式碼
對於Darwin/amd64 系統,RawSyscall() 的彙編程式碼可以在http://golang.org/src/pkg/syscall /asm_darwin_amd64 找到.s。第61-80行實現系統呼叫:-
如果系統呼叫成功,第71行跳到標籤ok1。
- 第76行是ok1標籤,其中傳回值(AX和 DX) 儲存在回傳位址中。
Zsyscall
Zsyscall 是 Syscall 的子模組,提供某些系統呼叫的高效能實作。 Zsyscall 中的函數以字母 a 開頭的方式命名,例如 Zsyscall.AioRead()。它們遵循與普通 Syscall 函數相同的介面。
- Syscall 和RawSyscall 之間的差異
雖然Syscall 和RawSyscall 都可以執行系統調用,但存在細微差別:-
Syscall
:在啟動和結束系統呼叫時通知運行時。
RawSyscall:不通知運行時,允許它執行系統呼叫時無限期阻塞。
使用場景-
-
- Syscall
:用於run-of-the- mill 系統調用,運行時應該知道該調用。
RawSyscall:用於不應通知運行時且系統呼叫已知為阻塞的情況。 實作自訂系統呼叫函數要實現自訂系統呼叫函數:標識所需操作的系統調用號。 編寫遵循系統呼叫介面的組譯程式碼(類似RawSyscall)。 定義一個封裝彙編程式碼並提供易於使用的介面的Go函數。
以上是Go 中的「RawSyscall()」和「Syscall()」在運行時互動和使用場景方面有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!