您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

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

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

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

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

Syscall和之间的唯一区别RawSyscall是在第14、28和34行上,在哪里Syscall调用runtime·entersyscall(SB)runtime·exitsyscall(SB)RawSyscall不会。我假设这意味着Syscall通知运行时它已切换为阻塞的系统调用操作,并且可能使cpu时间流向另一个goroutine /线程,而RawSyscall只是阻塞了。

Go 2022/1/1 18:14:59 有679人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶