## Go에서 `syscall.RawSyscall()`과 `syscall.Syscall()`은 어떻게 다르며 언제 사용해야 합니까?

Barbara Streisand
풀어 주다: 2024-10-26 07:24:30
원래의
743명이 탐색했습니다.

## How do `syscall.RawSyscall()` and `syscall.Syscall()` differ in Go, and when should you use each?

Go의 Syscall.RawSyscall() 및 Syscall.Syscall() 상세 분석

Syscall.RawSyscall()의 매개변수 및 반환값

Go의 Syscall.RawSyscall() 함수는 4개의 uintptr 유형 매개변수를 사용합니다:

  • trap: 이것은 syscall 트랩 번호입니다.
  • a1, a2 및 a3: 다음은 인수입니다. syscall.

두 개의 uintptr 값인 r1과 r2와 Errno 값을 반환합니다.

  • r1과 r2: 이는 syscall의 반환 값입니다.
  • err: syscall 실행 중에 발생한 문제를 나타내는 오류 값입니다.

RawSyscall()의 어셈블리 구현

RawSyscall()의 어셈블리 구현( ) darwin/amd64에 대한 내용은 다음 링크에서 찾을 수 있습니다:

[https://golang.org/src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall](https://golang.org /src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall)

이 파일의 61-80행에는 다음 어셈블리 코드가 포함되어 있습니다.

<code class="assembly">61  TEXT ·RawSyscall(SB),7,
62      MOVQ    16(SP), DI
63      MOVQ    24(SP), SI
64      MOVQ    32(SP), DX
65      MOVQ    , R10
66      MOVQ    , R8
67      MOVQ    , R9
68      MOVQ    8(SP), AX   // syscall entry
69      ADDQ    x2000000, AX
70      SYSCALL
71      JCC ok1
72      MOVQ    $-1, 40(SP) // r1
73      MOVQ    , 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    , 56(SP)  // errno
80      RET</code>
로그인 후 복사

이 코드는 기본적으로 다음을 수행합니다. 작업:

  • 인수를 적절한 레지스터로 이동합니다.
  • SYSCALL 명령을 사용하여 syscall을 호출합니다.
  • 다음 결과에 따라 반환 값과 errno를 설정합니다. syscall.

파일 이름의 zsyscall

파일 이름 zsyscall_darwin_amd64.go의 "z" 접두사는 권한이 없는 프로세스에 대한 시스템 호출 래퍼가 포함되어 있음을 나타냅니다. 이러한 래퍼는 syscall을 실행하기 전에 다른 사용자 또는 스레드 ID로 전환하는 등의 추가 작업을 처리합니다.

Syscall()과 RawSyscall()의 차이점

Syscall()과 RawSyscall의 주요 차이점 ()는 Syscall()이 syscall 실행 전후에 각각 Runtime.entersyscall(SB)과 Runtime.exisyscall(SB)을 호출한다는 것입니다. 이러한 기능을 통해 런타임 시스템은 고루틴의 차단 상태를 추적할 수 있습니다. 반면 RawSyscall()은 이러한 호출을 하지 않으므로 동일한 방식으로 런타임 시스템과 상호 작용하지 않습니다.

Syscall() 및 RawSyscall() 사용

Syscall()은 일반적으로 직접 호출하려는 특정 syscall 번호와 인수가 있을 때 사용됩니다. RawSyscall()은 os 패키지에 의해 노출되지 않은 syscall을 호출해야 하거나 syscall의 차단 상태를 수동으로 처리해야 하는 경우와 같이 syscall 실행을 더 세밀하게 제어하려는 경우에 유용합니다.

위 내용은 ## Go에서 `syscall.RawSyscall()`과 `syscall.Syscall()`은 어떻게 다르며 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!