【问题标题】:Languages that make system calls directly直接进行系统调用的语言
【发布时间】:2019-07-20 11:41:30
【问题描述】:

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

【问题讨论】:

  • c 也不能直接进行系统调用,有(内联)汇编代码。
  • -您的问题是否正确地改写为“是否有另一种编程语言的标准库不依赖于/用于 c 中的库进行系统调用”? - 它是特定于linux的吗?在氧化还原中,Rust 被用作主要的编程语言
  • @thejonny 是的,我会说这是改写它的好方法。我确实知道 C 中的程序集,所以你的询问方式也一样。

标签: linux system-calls c-libraries


【解决方案1】:

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 默认直接使用系统调用。

【讨论】:

  • 谢谢,这正是我一直在寻找但找不到的东西。一个后续问题 - 为什么 Go 甚至 C 使用汇编来进行系统调用?为什么他们不能用相同的语言(例如 C)编写它并让编译器将其转换为汇编?哪个gnu C已经做了。谢谢
  • 在某个时候,需要有人坐下来设计上面的汇编代码序列。如果您说库 dev 应该只使用编译器内部函数 __linux_arm64_syscall(....) 并让编译器生成该汇编代码,那么您只是将完全相同的工作推送到编译器后端 dev 上。如果你说库开发者应该写copyReg64(stack64[1], registers.DI); 等,那么你只是重新发明了一种更笨拙且紧密耦合的内联汇编语法。
猜你喜欢
  • 2022-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 2013-11-14
  • 1970-01-01
相关资源
最近更新 更多