首頁 >後端開發 >Golang >Go 中的 `Syscall.RawSyscall()` 和 `Syscall.Syscall()` 有什麼不同?

Go 中的 `Syscall.RawSyscall()` 和 `Syscall.Syscall()` 有什麼不同?

DDD
DDD原創
2024-10-25 13:30:30430瀏覽

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

了解Go 中的Syscall.RawSyscall() 和Syscall.Syscall()

對於那些剛接觸Go 系統調用包的人來說,Syscall.RawSyscall () 和Syscall.Syscall() 函數可能令人望而生畏。以下是澄清其細微差別的詳細概述:

Syscall.RawSyscall()

  • 參數:

    • trap:要執行的系統呼叫的數字代碼
    • a1、a2、a3:傳遞給系統呼叫的前三個參數
  • 回傳值:

    • r1, r2:系統呼叫結果
    • err:系統呼叫失敗時的錯誤代碼
  • 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 () 與Syscall.RawSyscall() 的不同之處僅在於執行系統呼叫之前和之後呼叫了runtime.entersyscall() 和runtime.exitsyscall() 函式。這允許 Go 運行時追蹤和控制 goroutine 對系統呼叫的使用。

用法:

通常應使用 Syscall.Syscall() 而不是 Syscall.RawSyscall () 對於大多數目的。 Syscall.Syscall() 處理 Goroutine 上下文切換,從而實現搶佔和多任務處理。僅當您有繞過運行時上下文切換機制的特定需求時才使用 Syscall.RawSyscall()。

範例:
  1. 要寫自己的系統呼叫函數,一種方法是:
  2. 從作業系統文件中了解要使用的系統調用的詳細資訊。
編寫遵循特定作業系統和架構的呼叫約定的彙編函數.

將系統呼叫號碼轉換為 uintptr 並使用適當的參數呼叫 Syscall.RawSyscall()。 但是,此範例需要深入了解彙編程式設計和系統級知識詳細信息,因此建議盡可能使用 Syscall.Syscall()。

以上是Go 中的 `Syscall.RawSyscall()` 和 `Syscall.Syscall()` 有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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