我正在阅读程序包中的源代码syscall,遇到了一些问题:
syscall
由于我完全是syscalland 的菜鸟assembly,所以请毫不犹豫地分享您所知道的任何信息:)
assembly
首先关于func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno):其参数trap, a1, a2, a3和返回值r1 r2意味着什么?我已经搜索了文档和站点,但似乎对此缺乏描述。
RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
trap, a1, a2, a3
r1 r2
其次,由于我正在使用,所以我darwin/amd64搜索了源代码并在此处找到它:http : //golang.org/src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall
darwin/amd64
似乎它是由assemble编写的(我听不懂),您能解释一下61-80行中发生了什么ok1:吗,76行下的part 的含义是什么?
ok1:
我还在http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.go中找到了一些代码zsyscall,它的文件名是什么意思?
zsyscall
syscall&和有rawsyscall什么区别?
rawsyscall
如果我想编写自己的syscall函数,如何以及何时使用它们(是的,os包提供了很多选择,但是仍然有一些情况没有涵盖)?
如此众多的菜鸟问题,感谢您耐心阅读和回答:)
我将与您分享我精简的装配知识:
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
您在左侧每一行上看到的简称被称为mnemonics,代表汇编说明:
mnemonics
MOVQ
ADDQ
SYSCALL
JCC
RET
在助记符的右侧,您会发现每条指令的参数,它们基本上是常量和寄存器。
SP
AX
BX
每个寄存器可以保存一定数量的数据。我相信在64位CPU架构上,每个寄存器实际上是64位。
Syscall和之间的唯一区别RawSyscall是在第14、28和34行上,在哪里Syscall调用runtime·entersyscall(SB),runtime·exitsyscall(SB)而RawSyscall不会。我假设这意味着Syscall通知运行时它已切换为阻塞的系统调用操作,并且可能使CPU时间流向另一个goroutine /线程,而RawSyscall只是阻塞了。
Syscall
RawSyscall
runtime·entersyscall(SB)
runtime·exitsyscall(SB)