gpt4 book ai didi

linux - go package "Syscall()"中的 "syscall"是什么意思?

转载 作者:IT王子 更新时间:2023-10-29 01:25:22 27 4
gpt4 key购买 nike

在研究我的另一个问题时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;不要编辑,这些东西如何以及为什么通过不同的实现在特定平台上工作?以及 syscall 包如何生成这些接口(interface)?

如果有人能解释一个特定的函数,比如 Read()syscall 相关,可以帮助我更好地理解它,谢谢。

最佳答案

Go Darwin 系统调用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() attempts to read nbyte bytes of data from the object referenced by the descriptor fildes into the buffer pointed to by buf.

Go Darwin 系统调用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

关于linux - go package "Syscall()"中的 "syscall"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16525890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com