簡體   English   中英

Go中的Syscall.RawSyscall()和Syscall.Syscall()的詳細信息?

[英]Details of Syscall.RawSyscall() & Syscall.Syscall() in Go?

我現在正在讀取syscall包中的源代碼,並遇到了一些問題:

由於我完全是syscallassembly的小塊,所以不要猶豫,分享你所知道的任何事情:)

首先關於func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) :它的參數trap, a1, a2, a3和返回值r1 r2是什么意思? 我搜索過文檔和網站,但似乎缺乏對此的描述。

其次,因為我正在使用darwin/amd64所以我搜索了源代碼並在此處找到它: httpdarwin/amd64

似乎它是由匯編(我無法理解)寫的,你能解釋61-80行發生了什么, ok1:的含義是ok1:第76行的部分?

我還在http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.go中找到了一些代碼, zsyscall在其文件名中的zsyscall是什么?

syscallrawsyscall什么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  
  • 第61行是例程入口點
  • 第76行是一個名為ok1的標簽
  • 第71行是標簽ok1的條件跳轉。

您在左側每行顯示的短名稱稱為mnemonics ,代表匯編指令:

  • MOVQ表示移動四字(64位數據)。
  • ADDQ是Add ADDQ
  • SYSCALL有點明顯
  • JCC是條件跳轉(條件標志由前一條指令設置)
  • RET返回

在助記符的右側,您將找到每個指令的參數,這些參數基本上是常量和寄存器

  • SP是堆棧指針
  • AX是累加器
  • BX是Base寄存器

每個寄存器可以保存一定數量的數據。 在64位CPU架構上,我相信它實際上是每個寄存器64位。

SyscallRawSyscall之間的唯一區別在於第Syscall和34行,其中Syscall將調用runtime·entersyscall(SB)runtime·exitsyscall(SB)RawSyscall則不會。 我假設這意味着Syscall通知運行時它已切換到阻塞系統調用操作並且可以將CPU時間輸出到另一個goroutine / thread,而RawSyscall將阻塞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM