Rec*_*Hou 3 unix assembly operating-system system-calls go
我现在正在阅读包中的源代码syscall,并遇到了一些问题:
因为我是一个完全的小白syscall和assembly,所以不要犹豫,分享你知道这件事:)
首先关于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
似乎它是由汇编(我无法理解)写的,你能解释61-80行中发生的事情,以及ok1:第76行下部分的含义是什么?
我还在http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.go中找到了一些代码zsyscall,它的文件名是什么意思?
syscall&之间有什么区别rawsyscall?
如果我想编写自己的系统调用函数,如何以及何时使用它们(是的,os包提供了很多选择,但仍然存在一些不包含的情况)?
这么多菜鸟问题,感谢您耐心阅读和回答:)
我将与您分享我减少的装配知识:
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
Run Code Online (Sandbox Code Playgroud)
ok1ok1.您在左侧的每一行上看到的短名称都被称为mnemonics并代表装配说明:
MOVQ 表示移动四字(64位数据).ADDQ 是添加四字.SYSCALL 有点明显JCC 条件是跳转(前一条指令设置的条件标志)RET 是回归在助记符的右侧,您将找到每个指令的参数,这些参数基本上是常量和寄存器.
SP 是堆栈指针AX 是累加器BX 是基本寄存器每个寄存器可以保存一定数量的数据.在64位CPU架构上,我相信它实际上是每个寄存器64位.
Syscall和之间的唯一区别RawSyscall是在第14,28和34行,其中Syscall将调用runtime·entersyscall(SB),runtime·exitsyscall(SB)而RawSyscall不会.我假设这意味着Syscall通知运行时它已切换到阻塞系统调用操作并且可以将CPU时间输出到另一个goroutine/thread,而RawSyscall只是阻塞.