直接进行系统调用的语言

问题描述 投票:1回答:1

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

linux system-calls c-libraries
1个回答
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默认直接使用系统调用。

© www.soinside.com 2019 - 2024. All rights reserved.