2013-05-13 6 views
2

Во время исследования моего другого вопроса Go package syscall conn.Read() is non-blocking and cause high CPU usage, я читаю исходный код в syscall упаковке.Что означает «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, как и почему эти вещи работают с конкретной платформой с помощью разных реализаций? И как пакет syscall генерирует эти интерфейсы?

Если кто-то может объяснить конкретную функцию, такую ​​как Read(), связанный с syscall, может помочь мне понять ее лучше, спасибо.

+1

Системный вызов (...) выглядит как Go-иш издание функции старого системного вызова() из C. Это (VARIADIC) функция позволяет вы можете выполнить произвольные системные вызовы, указав номер syscall (здесь это SYS_READ) и набор аргументов. – fuz

+1

Я думаю [эта ссылка] (http://en.wikipedia.org/wiki/Syscall) многое прояснит для вас. – thwd

+0

Пакет 'syscall' обеспечивает доступ к низкоуровневым системным вызовам os. C-языковые версии находятся в 'man (2)' (поэтому 'man read' расскажет вам, что syscall.Read делает) - я думаю, что у них есть то же имя, что и для системных вызовов Go, за исключением без капитуляции. Файл, вероятно, автогенерируется, потому что он состоит из множества почти идентичных функций Go, обертывающих разные системные вызовы. –

ответ

3

The Go Darwin syscall пакет 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() попытки прочитать nbyte байт данных из объекта ссылка по дескриптору fildes в буфер po inted to buf.

The 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