我正在阅读package syscall
源代码,并遇到了一些问题:
由于我完全是syscall
和assembly
的noob,所以不要犹豫分享你所知道的任何东西:)
首先关于func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
:它的参数trap, a1, a2, a3
是什么trap, a1, a2, a3
和返回值r1 r2
是什么意思? 我search了文档和网站,但似乎缺乏对此的描述。
其次,因为我使用的是darwin/amd64
我search了源代码并在这里find它: http : darwin/amd64
看来这是汇编写的(我不明白),你能解释一下61-80行是怎么回事, ok1:
的含义是ok1:
76行下的部分是什么意思?
我还在http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.gofind了一些代码, zsyscall
在文件名中的zsyscall
是什么?
syscall
和rawsyscall
什么rawsyscall
?
如果我想写我自己的系统调用函数(是的,OS包提供了很多select,但仍然有一些它不包括的情况),如何以及何时使用它们?
这么多noob问题,感谢您的耐心阅读和回答:)
我会和你分享我的精简装配知识:
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
。 您在左侧每行上看到的短名称称为mnemonics
,代表汇编指令:
MOVQ
意味着移动四字(64位数据)。 ADDQ
是添加四字。 SYSCALL
有点明显 RET
是回报 在助记符的右侧,你会发现每个指令的参数基本上是常量和寄存器 。
SP
是堆栈指针 AX
是累加器 BX
是基址寄存器 每个寄存器可以容纳一定数量的数据。 在64位CPU架构上,我相信它实际上是每个寄存器64位。
Syscall
和RawSyscall
之间的唯一区别是在第RawSyscall
和34行,其中Syscall
将调用runtime·entersyscall(SB)
调用runtime·entersyscall(SB)
和runtime·exitsyscall(SB)
而RawSyscall
则不会。 我认为这意味着Syscall
通知运行时,它切换到阻塞系统调用操作,并可以产生CPU时间到另一个goroutine /线程,而RawSyscall
只会阻塞。