簡體   English   中英

go程序包“ syscall”中的“ Syscall()”是什么意思?

[英]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.PointerSyscall() 它們如何運作?

此外,任何人都可以解釋評論// 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)函數正在進行readSYS_READ )系統調用:

閱讀Mac OS X開發人員工具手冊頁

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM