我一直在学习linux中的系统调用,以及GNU C库函数实际上只是包装器,最终导致调用实际的系统调用。我还了解到,很多其他语言实际上并没有进行自己的系统调用,而只是调用C并让C库来进行系统调用。
所以我的问题是,是否有一种编程语言可以使系统调用自身而不与C库进行交互?就像中断和设置寄存器一样吗?
我尝试查找一些信息,但是没有任何信息,或者它们只是调用C。
谢谢。
答案 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当前具有表明支持以下各项的文件:
还可以针对不支持的组合或新端口链接到libc,但是go1.11.4 linux / amd64默认情况下直接使用syscalls。