[英]Details of Syscall.RawSyscall() & Syscall.Syscall() in Go?
我现在正在读取syscall
包中的源代码,并遇到了一些问题:
由于我完全是syscall
和assembly
的小块,所以不要犹豫,分享你所知道的任何事情:)
首先关于func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
:它的参数trap, a1, a2, a3
和返回值r1 r2
是什么意思? 我搜索过文档和网站,但似乎缺乏对此的描述。
其次,因为我正在使用darwin/amd64
所以我搜索了源代码并在此处找到它: http : darwin/amd64
似乎它是由汇编(我无法理解)写的,你能解释61-80行发生了什么, ok1:
的含义是ok1:
第76行的部分?
我还在http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.go中找到了一些代码, zsyscall
在其文件名中的zsyscall
是什么?
syscall
和rawsyscall
什么rawsyscall
?
如果我想编写自己的系统调用函数,如何以及何时使用它们(是的,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
的标签 ok1
的条件跳转。 您在左侧每行显示的短名称称为mnemonics
,代表汇编指令:
MOVQ
表示移动四字(64位数据)。 ADDQ
是Add ADDQ
。 SYSCALL
有点明显 JCC
是条件跳转(条件标志由前一条指令设置) RET
返回 在助记符的右侧,您将找到每个指令的参数,这些参数基本上是常量和寄存器 。
SP
是堆栈指针 AX
是累加器 BX
是Base寄存器 每个寄存器可以保存一定数量的数据。 在64位CPU架构上,我相信它实际上是每个寄存器64位。
Syscall
和RawSyscall
之间的唯一区别在于第Syscall
和34行,其中Syscall
将调用runtime·entersyscall(SB)
和runtime·exitsyscall(SB)
而RawSyscall
则不会。 我假设这意味着Syscall
通知运行时它已切换到阻塞系统调用操作并且可以将CPU时间输出到另一个goroutine / thread,而RawSyscall
将阻塞。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.