Syscall.RawSyscall()&Syscall.Syscall()在Go的详细信息?

我正在阅读package syscall源代码,并遇到了一些问题:

由于我完全是syscallassembly的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是什么?

syscallrawsyscall什么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 
  • 第61行是例行的入口点
  • 第76行是一个名为ok1的标签
  • 第71行是一个条件跳转到标签ok1

您在左侧每行上看到的短名称称为mnemonics ,代表汇编指令:

  • MOVQ意味着移动四字(64位数据)。
  • ADDQ是添加四字。
  • SYSCALL有点明显
  • 如果条件(前一条指令设置的条件标志)
  • RET是回报

在助记符的右侧,你会发现每个指令的参数基本上是常量和寄存器 。

  • SP是堆栈指针
  • AX是累加器
  • BX是基址寄存器

每个寄存器可以容纳一定数量的数据。 在64位CPU架构上,我相信它实际上是每个寄存器64位。

SyscallRawSyscall之间的唯一区别是在第RawSyscall和34行,其中Syscall将调用runtime·entersyscall(SB)调用runtime·entersyscall(SB)runtime·exitsyscall(SB)RawSyscall则不会。 我认为这意味着Syscall通知运行时,它切换到阻塞系统调用操作,并可以产生CPU时间到另一个goroutine /线程,而RawSyscall只会阻塞。