繁体   English   中英

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

[英]Details of Syscall.RawSyscall() & Syscall.Syscall() in Go?

我现在正在读取syscall包中的源代码,并遇到了一些问题:

由于我完全是syscallassembly的小块,所以不要犹豫,分享你所知道的任何事情:)

首先关于func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) :它的参数trap, a1, a2, a3和返回值r1 r2是什么意思? 我搜索过文档和网站,但似乎缺乏对此的描述。

其次,因为我正在使用darwin/amd64所以我搜索了源代码并在此处找到它: httpdarwin/amd64

似乎它是由汇编(我无法理解)写的,你能解释61-80行发生了什么, ok1:的含义是ok1:第76行的部分?

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

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

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

  • MOVQ表示移动四字(64位数据)。
  • ADDQ是Add ADDQ
  • SYSCALL有点明显
  • JCC是条件跳转(条件标志由前一条指令设置)
  • RET返回

在助记符的右侧,您将找到每个指令的参数,这些参数基本上是常量和寄存器

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

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

SyscallRawSyscall之间的唯一区别在于第Syscall和34行,其中Syscall将调用runtime·entersyscall(SB)runtime·exitsyscall(SB)RawSyscall则不会。 我假设这意味着Syscall通知运行时它已切换到阻塞系统调用操作并且可以将CPU时间输出到另一个goroutine / thread,而RawSyscall将阻塞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM