[英]What does “Syscall()” means in go package “syscall”?
在研究我的另一個問題時, Go軟件包syscall conn.Read()是非阻塞的,並且導致CPU使用率很高 ,因此我讀取syscall
軟件包中的源代碼。
由於我在OS X 10.8.3上找到了我的最后一個問題,因此這里是相關的源代碼:
http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.go?h=Read#L898
我不知道Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))
是什么意思,實際上我不理解unsafe.Pointer
和Syscall()
。 它們如何運作?
此外,任何人都可以解釋評論// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
,這些事情如何以及為什么通過不同的實現在特定平台上起作用? 以及syscall
包如何生成這些接口?
如果有人可以解釋與syscall
相關的Read()
類的特定功能,可以幫助我更好地理解它,謝謝。
Go Darwin syscall
程序包func Read(fd int, p \\[\\]byte) (n int, err error)
函數正在進行read
( SYS_READ
)系統調用:
ssize_t read(int fildes, void *buf, size_t nbyte);
Read()
嘗試從描述符所fildes
的對象中讀取nbyte
字節的數據,並滲透到buf
。
Go Darwin syscall
程序包的Syscall
函數為:
// func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
// Trap # in AX, args in DI SI DX, return in AX DX
TEXT ·Syscall(SB),7,$0
CALL runtime·entersyscall(SB)
MOVQ 16(SP), DI
MOVQ 24(SP), SI
MOVQ 32(SP), DX
MOVQ $0, R10
MOVQ $0, R8
MOVQ $0, R9
MOVQ 8(SP), AX // syscall entry
ADDQ $0x2000000, AX
SYSCALL
JCC ok
MOVQ $-1, 40(SP) // r1
MOVQ $0, 48(SP) // r2
MOVQ AX, 56(SP) // errno
CALL runtime·exitsyscall(SB)
RET
ok:
MOVQ AX, 40(SP) // r1
MOVQ DX, 48(SP) // r2
MOVQ $0, 56(SP) // errno
CALL runtime·exitsyscall(SB)
RET
據我了解, syscall.Syscall()
只是調用某些系統特定的API的一種方式。
例如,Windows API通常使用__stdcall
約定,通常,如果沒有Go中的syscall.Syscall()
,我們將無法實現。
func Syscall(trap,a1,a2,a3 uintptr)(r1,r2 uintptr,err Errno)
trap
:我們要調用的API。
a1, a2, a3
:該API的參數。
r1, r2, err
:無論API返回什么。 一共有三個,但我們可能只會使用其中一個。
就是這樣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.