我正在阅读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行是例行的入口点
您在左侧每行上看到的短名称称为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] 举报,一经查实,本站将立刻删除。