直接进行系统调用的语言

时间:2019-02-26 20:46:57

标签: linux system-calls c-libraries

我一直在学习linux中的系统调用,以及GNU C库函数实际上只是包装器,最终导致调用实际的系统调用。我还了解到,很多其他语言实际上并没有进行自己的系统调用,而只是调用C并让C库来进行系统调用。
所以我的问题是,是否有一种编程语言可以使系统调用自身而不与C库进行交互?就像中断和设置寄存器一样吗?
我尝试查找一些信息,但是没有任何信息,或者它们只是调用C。
谢谢。

1 个答案:

答案 0 :(得分:2)

Go(golang)执行此操作。这是Go Linux AMD64 syscalls的部分源代码,用于设置寄存器(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

这具有可预见的缺点,即必须为每个内核约定乘以每个受支持的体系结构编写和维护一个文件。 The directory当前具有表明支持以下各项的文件:

  • 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默认情况下直接使用syscalls。