3

現在パッケージ内のソースコードを読んで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か?

独自の syscall 関数を作成する場合、それらをいつ、どのように使用すればよいですか (はい、os パッケージには多くの選択肢がありましたが、まだカバーされていない状況があります)。

非常に多くの初心者の質問です。読んで回答していただきありがとうございます:)

4

1 に答える 1

6

簡略化されたアセンブリの知識を共有します。

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 はルーチンのエントリ ポイントです。
  • Line 76 は、というラベルです。ok1
  • 行 71 は、 label への条件付きジャンプですok1

左側のすべての行に表示される短い名前は呼び出されmnemonics、組み立て手順を表します。

  • MOVQMove Quadword (64 ビットのデータ) を意味します。
  • ADDQAdd Quadword です。
  • SYSCALLちょっと明白です
  • JCCJump if Condition (前の命令で設定された条件フラグ)
  • RET戻ります

ニーモニックの右側には、基本的に定数とレジスタである各命令の引数があります。

  • SPスタックポインタです
  • AXアキュムレータです
  • BXベースレジスタです

各レジスタは一定量のデータを保持できます。64 ビット CPU アーキテクチャでは、実際にはレジスタあたり 64 ビットだと思います。

との唯一の違いはSyscallRawSyscall14 行目、28 行目、34Syscallruntime·entersyscall(SB)runtime·exitsyscall(SB)ですRawSyscallSyscallこれは、ブロックするsyscall操作に切り替えられ、CPU時間を別のゴルーチン/スレッドに譲ることができることをランタイムに通知することを意味すると思いますが、RawSyscallブロックするだけです。

于 2013-06-07T08:37:29.533 に答える