首页 > 后端开发 > Golang > 正文

## Go 中 `syscall.RawSyscall()` 和 `syscall.Syscall()` 有什么不同,什么时候应该使用它们?

Barbara Streisand
发布: 2024-10-26 07:24:30
原创
743 人浏览过

## How do `syscall.RawSyscall()` and `syscall.Syscall()` differ in Go, and when should you use each?

Go 的 Syscall.RawSyscall() 和 Syscall.Syscall() 详细分析

Syscall.RawSyscall() 的参数和返回值

Go 中的 Syscall.RawSyscall() 函数采用四个 uintptr 类型参数:

  • trap:这是系统调用陷阱编号。
  • a1、a2 和 a3:这些是系统调用。

它返回两个 uintptr 值,r1 和 r2,以及一个 Errno 值:

  • r1 和 r2:这些是系统调用的返回值。
  • err:这是一个错误值,指示在执行系统调用期间遇到的任何问题。

RawSyscall() 的汇编实现

RawSyscall( 的汇编实现) ) for darwin/amd64 可以在以下链接找到:

[https://golang.org/src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall](https://golang.org /src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall)

此文件中的第 61-80 行包含以下汇编代码:

<code class="assembly">61  TEXT ·RawSyscall(SB),7,
62      MOVQ    16(SP), DI
63      MOVQ    24(SP), SI
64      MOVQ    32(SP), DX
65      MOVQ    , R10
66      MOVQ    , R8
67      MOVQ    , R9
68      MOVQ    8(SP), AX   // syscall entry
69      ADDQ    x2000000, AX
70      SYSCALL
71      JCC ok1
72      MOVQ    $-1, 40(SP) // r1
73      MOVQ    , 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    , 56(SP)  // errno
80      RET</code>
登录后复制

此代码本质上执行以下操作任务:

  • 将参数移动到适当的寄存器。
  • 使用 SYSCALL 指令调用系统调用。
  • 根据以下结果设置返回值和 errno系统调用。

文件名中的 zsyscall

文件名 zsyscall_darwin_amd64.go 中的“z”前缀表示它包含非特权进程的系统调用包装器。这些包装器处理其他任务,例如在执行系统调用之前切换到不同的用户或线程 ID。

Syscall() 和 RawSyscall() 之间的差异

Syscall() 和 RawSyscall 之间的主要区别()是Syscall()在执行syscall之前和之后分别调用runtime.entersyscall(SB)和runtime.exitsyscall(SB)。这些函数允许运行时系统跟踪 goroutine 的阻塞状态。另一方面,RawSyscall() 不会进行这些调用,因此它不会以相同的方式与运行时系统交互。

Syscall() 和 RawSyscall() 的用法

当您有特定的系统调用号和要直接调用的参数时,通常使用 Syscall()。当您想要更多地控制系统调用执行时,例如当您需要调用 os 包未公开的系统调用时,或者当您需要手动处理系统调用的阻塞状态时,RawSyscall() 非常有用。

以上是## Go 中 `syscall.RawSyscall()` 和 `syscall.Syscall()` 有什么不同,什么时候应该使用它们?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!