登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-02 15:35:34 134浏览 收藏

golang学习网今天将给大家带来《Go 中 Syscall.RawSyscall() 和 Syscall.Syscall() 的详细信息?》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到golang等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

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

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

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

如果我想编写自己的系统调用函数,如何以及何时使用它们(是的,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 行是到 label 的条件跳转ok1

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

  • MOVQ表示移动四字(64 位数据)。
  • ADDQ是添加四字。
  • SYSCALL有点明显
  • JCCis Jump if Condition(前一条指令设置的条件标志)
  • RET是回报

在助记符的右侧,您会发现每条指令的参数基本上是常量和[寄存器](http://tanmayonrun.blogspot.ch/2011/06/purposes- of-having-general-registers.html)。

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

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

Syscalland之间的唯一区别在于RawSyscall第 14、28 和 34 行 where Syscallwill callruntime路entersyscall(SB)runtime路exitsyscall(SB)while RawSyscallwill not。我假设这意味着Syscall通知运行时它已切换到阻塞系统调用操作,并且可以将 CPU 时间提供给另一个 goroutine/线程,而RawSyscall只会阻塞。

以上就是《Go 中 Syscall.RawSyscall() 和 Syscall.Syscall() 的详细信息?》的详细内容,更多关于golang的资料请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>