1

我一直在学习 linux 中的系统调用以及 GNU C 库函数实际上如何只是最终调用实际系统调用的包装器。我还读到很多/一些其他语言实际上并没有进行自己的系统调用,而是只是调用 C 并让 C 库为它进行系统调用。
所以我的问题是,是否有一种编程语言可以让系统调用自己而不与 C 库进行交互?像中断和设置寄存器等一样吗?
我试过查找一些,但要么没有信息,要么他们只是打电话给 C。
谢谢。

4

1 回答 1

1

Go (golang) 就是这样做的。这是设置寄存器的Go Linux AMD64 系统调用的部分源代码(x86_64 上的 Linux 使用syscall而不是int 0x80):

// func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
TEXT ·Syscall6(SB),NOSPLIT,$0-80
    CALL    runtime·entersyscall(SB)
    MOVQ    a1+8(FP), DI
    MOVQ    a2+16(FP), SI
    MOVQ    a3+24(FP), DX
    MOVQ    a4+32(FP), R10
    MOVQ    a5+40(FP), R8
    MOVQ    a6+48(FP), R9
    MOVQ    trap+0(FP), AX  // syscall entry
    SYSCALL
    CMPQ    AX, $0xfffffffffffff001
    JLS ok6
    MOVQ    $-1, r1+56(FP)
    MOVQ    $0, r2+64(FP)
    NEGQ    AX
    MOVQ    AX, err+72(FP)
    CALL    runtime·exitsyscall(SB)
    RET
ok6:
    MOVQ    AX, r1+56(FP)
    MOVQ    DX, r2+64(FP)
    MOVQ    $0, err+72(FP)
    CALL    runtime·exitsyscall(SB)
    RET

这有一个可以预见的缺点,即必须为每个内核约定乘以每个支持的体系结构编写和维护一个文件。该目录当前包含指示支持以下各项的文件:

  • aix_ppc64, darwin_386, darwin_amd64, darwin_arm, darwin_arm64, freebsd_arm, linux_386, linux_amd64, linux_arm, linux_arm64, linux_mips64x, linux_mipsx, linux_ppc64x, linux_s390x, nacl_386, nacl_amd64p32, nacl_arm, netbsd_arm, openbsd_arm, plan9_386, plan9_amd64, plan9_arm, solaris_amd64, unix_386, unix_amd64

也可以针对不受支持的组合或新端口链接 libc,但 go1.11.4 linux/amd64 默认直接使用系统调用。

于 2019-02-26T21:23:19.263 回答