一尘不染

Go中Syscall.RawSyscall()和Syscall.Syscall()的详细信息?

go

我正在阅读程序包中的源代码syscall,遇到了一些问题:

由于我完全是syscalland 的菜鸟assembly,所以请毫不犹豫地分享您所知道的任何信息:)

首先关于func 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

似乎它是由assemble编写的(我听不懂),您能解释一下61-80行中发生了什么ok1:吗,76行下的part 的含义是什么?

我还在http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.go中找到了一些代码zsyscall,它的文件名是什么意思?

syscall&和有rawsyscall什么区别?

如果我想编写自己的syscall函数,如何以及何时使用它们(是的,os包提供了很多选择,但是仍然有一些情况没有涵盖)?

如此众多的菜鸟问题,感谢您耐心阅读和回答:)


阅读 587

收藏
2020-07-02

共1个答案

一尘不染

我将与您分享我精简的装配知识:

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行是有条件跳转到label的行ok1

您在左侧每一行上看到的简称被称为mnemonics,代表汇编说明:

  • MOVQ 表示移动四字(64位数据)。
  • 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只是阻塞了。

2020-07-02