直接进行系统调用的语言
Languages that make system calls directly
我一直在学习 linux 中的系统调用,以及 GNU C 库函数实际上只是最终调用实际系统调用的包装器。我还读到 lot/a 少数其他语言实际上并不进行自己的系统调用,而只是调用 C 并让 C 库为其进行系统调用。
所以我的问题是是否有一种编程语言可以让系统调用自己而不与 C 库交互?比如中断和设置寄存器等?
我已经尝试查找一些但是没有信息或者他们只是调用 C。
谢谢。
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,[=10=]-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, [=10=]xfffffffffffff001
JLS ok6
MOVQ $-1, r1+56(FP)
MOVQ [=10=], 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 [=10=], 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 link,但 go1.11.4 linux/amd64 默认直接使用系统调用。
我一直在学习 linux 中的系统调用,以及 GNU C 库函数实际上只是最终调用实际系统调用的包装器。我还读到 lot/a 少数其他语言实际上并不进行自己的系统调用,而只是调用 C 并让 C 库为其进行系统调用。
所以我的问题是是否有一种编程语言可以让系统调用自己而不与 C 库交互?比如中断和设置寄存器等?
我已经尝试查找一些但是没有信息或者他们只是调用 C。
谢谢。
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,[=10=]-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, [=10=]xfffffffffffff001
JLS ok6
MOVQ $-1, r1+56(FP)
MOVQ [=10=], 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 [=10=], 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 link,但 go1.11.4 linux/amd64 默认直接使用系统调用。