在研究我的另一个问题Go package syscall conn.Read() is non-blocking and cause high CPU usage期间,我阅读了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
,这些事情如何以及为什么通过不同的实现与特定平台一起工作?以及syscall
包如何生成这些接口?
如果有人可以解释与Read()
相关的syscall
等特定功能,可以帮助我更好地理解它,谢谢。
答案 0 :(得分:4)
Go Darwin syscall
包func Read(fd int, p \[\]byte) (n int, err error)
函数正在进行read
(SYS_READ
)系统调用:
read Mac OS X Developer Tools Manual Page
ssize_t read(int fildes, void *buf, size_t nbyte);
Read()
尝试从对象中读取nbyte
个字节的数据 由描述符fildes
引用到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
答案 1 :(得分:1)
据我了解,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返回什么。一共有三个,但我们可能只会使用其中一个。
就是这样。