[英]Details of Syscall.RawSyscall() & Syscall.Syscall() in 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 : darwin/amd64
似乎它是由匯編(我無法理解)寫的,你能解釋61-80行發生了什么, ok1:
的含義是ok1:
第76行的部分?
我還在http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.go中找到了一些代碼, zsyscall
在其文件名中的zsyscall
是什么?
syscall
和rawsyscall
什么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
ok1
的標簽 ok1
的條件跳轉。 您在左側每行顯示的短名稱稱為mnemonics
,代表匯編指令:
MOVQ
表示移動四字(64位數據)。 ADDQ
是Add ADDQ
。 SYSCALL
有點明顯 JCC
是條件跳轉(條件標志由前一條指令設置) RET
返回 在助記符的右側,您將找到每個指令的參數,這些參數基本上是常量和寄存器 。
SP
是堆棧指針 AX
是累加器 BX
是Base寄存器 每個寄存器可以保存一定數量的數據。 在64位CPU架構上,我相信它實際上是每個寄存器64位。
Syscall
和RawSyscall
之間的唯一區別在於第Syscall
和34行,其中Syscall
將調用runtime·entersyscall(SB)
和runtime·exitsyscall(SB)
而RawSyscall
則不會。 我假設這意味着Syscall
通知運行時它已切換到阻塞系統調用操作並且可以將CPU時間輸出到另一個goroutine / thread,而RawSyscall
將阻塞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.