2013-05-13 3 views
2

Lors de la recherche de mon autre question Go package syscall conn.Read() is non-blocking and cause high CPU usage, j'ai lu le code source dans syscall package.Que signifie "Syscall()" dans go package "syscall"?

Depuis que je trouve mon dernier numéro sur OS X 10.8.3, voici le code source lié:

http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.go?h=Read#L898

Je ne sais pas ce que Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) signifie, en fait, je ne comprends pas des étoffes comme unsafe.Pointer & Syscall(). Comment ça marche? En outre, peut-on expliquer le commentaire // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT, comment et pourquoi ces choses fonctionnent avec une plate-forme spécifique par différentes implémentations? Et comment le paquet syscall génère ces interfaces?

Si quelqu'un peut expliquer une fonction spécifique comme Read() liée à syscall pourrait être m'aider à mieux le comprendre, merci.

+1

syscall (...) ressemble à une édition Go-ish de la fonction ancienne syscall() de C. Cette (variadique) permet Vous pouvez effectuer des appels système arbitraires en fournissant le numéro de syscall (ici, il s'agit de SYS_READ) et un ensemble d'arguments. – fuz

+1

Je pense que [ce lien] (http://en.wikipedia.org/wiki/Syscall) clarifiera beaucoup pour vous. – thwd

+0

Le pack 'syscall' permet d'accéder aux appels système OS de bas niveau. Les versions en langage C sont dans 'man (2)' (donc 'man read' vous dira ce que syscall.Read fait) - Je pense qu'ils ont le même nom que les Go syscalls sauf sans la lettre capitale. Le fichier est probablement généré automatiquement, car il contient une grande quantité de fonctions Go presque identiques qui enveloppent différents appels système. –

Répondre

3

Le Go Darwin syscall paquet fonction func Read(fd int, p \[\]byte) (n int, err error) effectue un read (SYS_READ) appel système:

read Mac OS X Developer Tools Manual Page

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

Read() tentatives de lecture nbyte octets de données à partir de l'objet référencé par le descripteur fildes dans le tampon po inted par buf.

La fonction package Go Darwin syscallSyscall est: fonction

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