2013-05-13 22 views
2

在研究我的另一個問題Go package syscall conn.Read() is non-blocking and cause high CPU usage期間,我讀了syscall包的源代碼。什麼「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的評論,這些東西如何以及爲什麼通過不同的實現與特定平臺協同工作?以及如何生成這些接口的包?

如果有人可以解釋一個特定的功能,如Read()syscall有關可以幫助我更好地理解它,謝謝。

+1

系統調用(...)看起來像舊的系統調用()函數從C本(可變參數)功能允許轉到十歲上下版你通過提供系統調用號(這裏是SYS_READ)和一組參數來執行任意系統調用。 – fuz 2013-05-13 15:43:27

+1

我認爲[此鏈接](http://en.wikipedia.org/wiki/Syscall)將爲您澄清很多。 – thwd 2013-05-13 15:49:24

+0

'syscall'包提供對低級os系統調用的訪問。 C語言版本在man(2)中(所以'man read'會告訴你什麼是syscall.Read) - 我認爲它們和Go系統調用的名稱相同,除了沒有capitial字母。該文件可能是自動生成的,因爲它包含很多幾乎相同的Go函數,它們包裝不同的系統調用。 – 2013-05-13 16:49:53

回答

3

在GO達爾文syscallfunc Read(fd int, p \[\]byte) (n int, err error)功能正在作出readSYS_READ)系統調用:

read Mac OS X Developer Tools Manual Page

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

Read()嘗試從所引用的對象 讀nbyte個字節的數據由描述符fildes進入緩衝區po由buf登錄。

轉到達爾文syscallSyscall功能是:

// 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