英文:
What does "Syscall()" means in go package "syscall"?
问题
在研究我的另一个问题https://stackoverflow.com/questions/16516948/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
包是如何生成这些接口的?
如果有人能解释一个与syscall
相关的特定函数,比如Read()
,那将有助于我更好地理解它,谢谢。
英文:
During the research of my another question https://stackoverflow.com/questions/16516948/go-package-syscall-conn-read-is-non-blocking-and-cause-high-cpu-usage, I read source code in syscall
package.
Since I found my last issue on OS X 10.8.3, here is the source code related:
http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.go?h=Read#L898
I have no idea what Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))
means, actually I don't understand stuffs like unsafe.Pointer
& Syscall()
. How they works?
Besides, can anyone explain the comment // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
, how and why these things work with specific platform by different implementations? And how syscall
package generate these interfaces?
If someone can explain a specific function like Read()
related with syscall
could be help me understand it better, thanks.
答案1
得分: 4
Go Darwin syscall
包中的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()
尝试从由描述符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
英文:
The Go Darwin syscall
package func Read(fd int, p \[\]byte) (n int, err error)
function is making a read
(SYS_READ
) system call:
> 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
.
The Go Darwin syscall
package Syscall
function is:
// 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
答案2
得分: 2
从我理解的角度来看,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返回的内容。有三个返回值,但我们可能只使用其中一个。
就是这样。
英文:
From what I understand, syscall.Syscall()
is simply a way to call some system specific APIs.
For example, Windows APIs typically use the __stdcall
convention, which in general we would not be able to achieve without syscall.Syscall()
in Go.
> func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
trap
: The API we want to call.
a1, a2, a3
: Arguments to that API.
r1, r2, err
: Whatever that API returns. There are three, but we would probably use only one of them.
That's about it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论