微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Syscall.RawSyscall&Syscall.Syscall在Go的详细信息?

我正在阅读package syscall源代码,并遇到了一些问题:

由于我完全是syscall和assembly的noob,所以不要犹豫分享你所知道的任何东西:)

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

其次,因为我使用的是darwin/amd64我search了源代码在这里find它: http : darwin/amd64

使用golang映射Windows驱动器的最佳方式是什么?

主进程从systemd启动时不能分离subprocess

Goroutines 8kb和Windows操作系统线程1 mb

我需要使用Nginx还是Apache来使用Lets Encrypt?

去与非本地主机,活网站的狂欢框架

看来这是汇编写的(我不明白),你能解释一下61-80行是怎么回事, ok1:的含义是ok1: 76行下的部分是什么意思?

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

syscall和rawsyscall什么rawsyscall ?

如果我想写我自己的系统调用函数(是的,OS包提供了很多select,但仍然有一些它不包括的情况),如何以及何时使用它们?

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

如何在GO中实现跨平台文件locking

在Windows上运行高分辨率计时器(毫秒精度)

使用golang获取Windows中的terminal宽度

在Go中请求UAC提升

Unix的FIFO在去?

我会和你分享我的精简装配知识:

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是添加四字。

SYSCALL有点明显

如果条件(前一条指令设置的条件标志)

RET是回报

在助记符的右侧,你会发现每个指令的参数基本上是常量和寄存器 。

SP是堆栈指针

AX是累加器

BX是基址寄存器

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐