草庐IT

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

coder 2023-06-27 原文

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

因为我对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行发生了什么吗,第76行下面的ok1:部分是什么意思?

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

syscallrawsyscall 有什么区别?

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

这么多菜鸟问题,感谢您的耐心阅读和回答:)

最佳答案

我将与您分享我简化的 assembly 知识:

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

您在左侧每一行看到的短名称称为助记符,代表汇编指令:

  • MOVQ 表示移动四字(64 位数据)。
  • ADDQ 是添加四字。
  • SYSCALL 有点明显
  • JCC is Jump if Condition (condition flag set by previous instruction)
  • RET 是返回

在助记符的右侧,您会发现每条指令的参数,它们基本上是常量和registers。 .

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

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

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

关于unix - Go 中 Syscall.RawSyscall() 和 Syscall.Syscall() 的详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16977988/

有关unix - Go 中 Syscall.RawSyscall() 和 Syscall.Syscall() 的详细信息?的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  4. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  5. ruby - what is - gets is a directory - 错误信息 - 2

    我遇到了这个奇怪的错误.../Users/gideon/Documents/ca_ruby/rubytactoe/lib/player.rb:13:in`gets':Isadirectory-spec(Errno::EISDIR)player_spec.rb:require_relative'../spec_helper'#theuniverseisvastandinfinite...itcontainsagame....butnoplayersdescribe"tictactoegame"docontext"theplayerclass"doit"musthaveahumanplay

  6. ruby-on-rails - 我需要一个真正的 UNIX RoR 开发环境 - 2

    从一开始,我就是一个Windows高手。我从MS-DOS开始。我安装了Windows2.1以及此后的所有Windows。现在,我家里有10台不同的Windows机器在运行,从Windows7Ultimate到各种版本的WindowsServer。我还没有完成Windows8,也不想去那里。我在服务器和各种软件方面都有UNIX经验,但它并不是我的首选环境。但是,我想我正在转换。我试图假装使用Cygwin和MSYS在Windows下运行UNIX。我的目的是搭建一个开发环境。两者都让我失望了。我花了比开发更多的时间来解决一系列技术问题。这是NotAcceptable。到目前为止,我的Ruby

  7. ruby - 尝试比较两个文本文件,并根据信息创建第三个 - 2

    我有两个文本文件,master.txt和926.txt。如果926.txt中有一行不在master.txt中,我想写入一个新文件notinbook.txt。我写了我能想到的最好的东西,但考虑到我是一个糟糕的/新手程序员,它失败了。这是我的东西g=File.new("notinbook.txt","w")File.open("926.txt","r")do|f|while(line=f.gets)x=line.chompifFile.open("master.txt","w")do|h|endwhile(line=h.gets)ifline.chomp!=xputslineendende

  8. ruby - 如何使用 Ruby 中的 `less` 之类的 Unix 寻呼程序? - 2

    假设我有一个名为very_long_string的字符串,我想将其内容发送到标准输出。但是由于字符串很长,我想使用less在终端上显示文本。当我使用`less#{very_long_string}`我收到Filenotfound错误消息,如果我使用:`less我收到意外重定向错误消息。那么,如何在Ruby内部使用less呢? 最佳答案 您可以打开一个管道并通过其标准输入将您的字符串提供给less。IO.popen("less","w"){|f|f.putsvery_long_string}(假设very_long_string是保存

  9. ruby - rspec: raise_error 用法来匹配错误信息 - 2

    我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme

  10. ruby - 为什么要使用嵌套的 Ruby 模块来获取版本信息? - 2

    我最近一直在查看一些gem的源代码。我经常看到的一个习惯用法是使用嵌套模块,其中包含连接到版本字符串中的版本常量,即围绕此类事物的变体:moduleChunkyBaconmoduleVersionMAJOR=0MINOR=6TINY=2endVERSION=[Version::MAJOR,Version::MINOR,Version::TINY].compact*'.'end以这种方式存储库版本信息有什么好处(如果有的话)?为什么不这样做:moduleChunkyBaconVERSION='0.6.2'.freezeend 最佳答案

随机推荐