golang 标准库里这种没有具体代码执行的函数是怎么回事?

//代码目录/usr/local/go/src/syscall/syscall_unix.go
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
已邀请:

astaxie - 创造、获取、分享、传播和应用Go

赞同来自: xwisen maxwell92

底层实现都是汇编了

stirlingx - https://github.com/liyue201

赞同来自:

就像C语言有动态库,静态库一样。编译好后给你调用,你是看不到源码的啊,只要暴露函数接口就可以了。

superzhoulin

赞同来自:

get

lik0914

赞同来自:

同样有这样的疑问, 新手看官方标准库文档,看不太懂,看源代码也看到这样的没有函数主题的方法了


// Provided by package runtime.
func now() (sec int64, nsec int32)

// Now returns the current local time.
func Now() Time {
sec, nsec := now()
return Time{sec + unixToInternal, nsec, Local}
}

silenceshell - ieevee.com

赞同来自:

感兴趣可以看看 /usr/local/go/src/syscall/asm_linux_386.s


#define INVOKE_SYSCALL  INT $0x80

TEXT ·Syscall(SB),NOSPLIT,$0-28
CALL runtime·entersyscall(SB)
MOVL trap+0(FP), AX // syscall entry
MOVL a1+4(FP), BX
MOVL a2+8(FP), CX
MOVL a3+12(FP), DX
MOVL $0, SI
MOVL $0, DI
INVOKE_SYSCALL
CMPL AX, $0xfffff001
JLS ok
MOVL $-1, r1+16(FP)
MOVL $0, r2+20(FP)
NEGL AX
MOVL AX, err+24(FP)
CALL runtime·exitsyscall(SB)
RET
ok:
MOVL AX, r1+16(FP)
MOVL DX, r2+20(FP)
MOVL $0, err+24(FP)
CALL runtime·exitsyscall(SB)
RET

AX为syscall的num,linux定义在/usr/include/asm/unistd_32.h,不过go自己定义了一份,在 /usr/local/go/src/syscall/zsysnum_linux_386.go
用户态和内核态通过syscall num约定具体是哪个系统调用,如SYS_OPEN = 5,通过int 0x80陷入内核系统调用(x86)。

jeson

赞同来自:

跟IDE下php标准库是一样 点击去只有类的声明 底层实现用c

要回复问题请先登录注册