I\'m reading source code in package syscall
now, and met some problems:
Since I\'m totally a noob of syscall
and assembly
, so
I'll share my reduced assembly knowledge with you:
61 TEXT ·RawSyscall(SB),7,$0
62 MOVQ 16(SP), DI
63 MOVQ 24(SP), SI
64 MOVQ 32(SP), DX
65 MOVQ $0, R10
66 MOVQ $0, R8
67 MOVQ $0, R9
68 MOVQ 8(SP), AX // syscall entry
69 ADDQ $0x2000000, AX
70 SYSCALL
71 JCC ok1
72 MOVQ $-1, 40(SP) // r1
73 MOVQ $0, 48(SP) // r2
74 MOVQ AX, 56(SP) // errno
75 RET
76 ok1:
77 MOVQ AX, 40(SP) // r1
78 MOVQ DX, 48(SP) // r2
79 MOVQ $0, 56(SP) // errno
80 RET
81
ok1
ok1
.The short names you see on every line on the left side are called mnemonics
and stand for assembly instructions:
MOVQ
means Move Quadword (64 bits of data).ADDQ
is Add Quadword.SYSCALL
is kinda obviousJCC
is Jump if Condition (condition flag set by previous instruction)RET
is returnOn the right side of the mnemonics you'll find each instruction's arguments which are basically constants and registers.
SP
is the Stack PointerAX
is the AccumulatorBX
is the Base registereach register can hold a certain amount of data. On 64 bit CPU architectures I believe it's in fact 64 bits per register.
The only difference between Syscall
and RawSyscall
is on line 14, 28 and 34 where Syscall
will call runtime·entersyscall(SB)
and runtime·exitsyscall(SB)
whereas RawSyscall
will not. I assume this means that Syscall
notifies the runtime that it's switched to a blocking syscall operations and can yield CPU-time to another goroutine/thread whereas RawSyscall
will just block.