Go의 Syscall.RawSyscall() 함수는 4개의 uintptr 유형 매개변수를 사용합니다:
두 개의 uintptr 값인 r1과 r2와 Errno 값을 반환합니다.
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>
이 코드는 기본적으로 다음을 수행합니다. 작업:
파일 이름 zsyscall_darwin_amd64.go의 "z" 접두사는 권한이 없는 프로세스에 대한 시스템 호출 래퍼가 포함되어 있음을 나타냅니다. 이러한 래퍼는 syscall을 실행하기 전에 다른 사용자 또는 스레드 ID로 전환하는 등의 추가 작업을 처리합니다.
Syscall()과 RawSyscall의 주요 차이점 ()는 Syscall()이 syscall 실행 전후에 각각 Runtime.entersyscall(SB)과 Runtime.exisyscall(SB)을 호출한다는 것입니다. 이러한 기능을 통해 런타임 시스템은 고루틴의 차단 상태를 추적할 수 있습니다. 반면 RawSyscall()은 이러한 호출을 하지 않으므로 동일한 방식으로 런타임 시스템과 상호 작용하지 않습니다.
Syscall()은 일반적으로 직접 호출하려는 특정 syscall 번호와 인수가 있을 때 사용됩니다. RawSyscall()은 os 패키지에 의해 노출되지 않은 syscall을 호출해야 하거나 syscall의 차단 상태를 수동으로 처리해야 하는 경우와 같이 syscall 실행을 더 세밀하게 제어하려는 경우에 유용합니다.
위 내용은 ## Go에서 `syscall.RawSyscall()`과 `syscall.Syscall()`은 어떻게 다르며 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!