Syscall.RawSyscall() und Syscall.Syscall() in Go verstehen
Für diejenigen, die das Syscall-Paket von Go noch nicht kennen: das Syscall.RawSyscall ()- und Syscall.Syscall()-Funktionen können entmutigend sein. Hier ist eine detaillierte Übersicht, um ihre Nuancen zu verdeutlichen:
Syscall.RawSyscall()
Parameter:
Rückgabewerte:
Assembly-Code-Implementierung:
Für Darwin/AMD64-Systeme finden Sie den Assembler-Code für Syscall.RawSyscall() hier: https://golang.org /src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall
Syscall.Syscall()
Syscall.Syscall () unterscheidet sich von Syscall.RawSyscall() nur durch den Aufruf der Funktionen runtime.entersyscall() und runtime.exitsyscall() vor und nach der Ausführung des Systemaufrufs. Dadurch kann die Go-Laufzeit die Verwendung von Systemaufrufen durch die Goroutine verfolgen und steuern.
Verwendung:
Syscall.Syscall() sollte normalerweise anstelle von Syscall.RawSyscall verwendet werden () für die meisten Zwecke. Syscall.Syscall() übernimmt den Goroutine-Kontextwechsel und ermöglicht so Preemption und Multitasking. Verwenden Sie Syscall.RawSyscall() nur, wenn Sie den Laufzeitkontextwechselmechanismus unbedingt umgehen müssen.
Beispiel:
Um Ihre eigene Systemaufruffunktion zu schreiben, gibt es einen Ansatz ist:
Dieses Beispiel erfordert jedoch fundierte Kenntnisse der Assemblerprogrammierung und der Systemebene Details, daher wird empfohlen, nach Möglichkeit Syscall.Syscall() zu verwenden.
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen „Syscall.RawSyscall()' und „Syscall.Syscall()' in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!