我一直在学习linux中的系统调用,以及GNU C库函数实际上只是最终调用实际系统调用的包装器。我还读过很多/其他一些语言实际上并没有进行自己的系统调用,而只是调用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,$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目前有文件表明支持以下各项:
也可以链接libc以获得不支持的组合或新端口,但go1.11.4 linux / amd64默认直接使用系统调用。