2

在研究我的另一个问题Go package syscall conn.Read() is non-blocking and cause high CPU usagesyscall时,我阅读了包中的源代码。

由于我在 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可以帮助我更好地理解它,谢谢。

4

2 回答 2

4

Go Darwinsyscallfunc Read(fd int, p \[\]byte) (n int, err error)函数正在进行read( SYS_READ) 系统调用:

阅读 Mac OS X 开发者工具手册页

ssize_t read(int fildes, void *buf, size_t nbyte);

Read()尝试nbyte从描述符引用的对象中读取字节数据到 .fildes指向的缓冲区中buf

Go Darwinsyscall包的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
于 2013-05-13T16:45:40.333 回答
2

据我了解,syscall.Syscall()这只是一种调用某些系统特定 API 的方法。

例如,Windows API 通常使用约定,如果没有Go __stdcall,我们通常无法实现。syscall.Syscall()


func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)

trap:我们要调用的API。

a1, a2, a3: 该 API 的参数。

r1, r2, err:无论该 API 返回什么。有三个,但我们可能只使用其中一个。


就是这样。

于 2018-10-02T17:05:58.703 回答