Языки, которые делают системные вызовы напрямую - PullRequest
0 голосов
/ 26 февраля 2019

Я узнал о системных вызовах в linux и о том, что функции библиотеки GNU C на самом деле являются просто обертками, которые в конечном итоге вызывают реальные системные вызовы.Я также читал, что многие / несколько других языков на самом деле не делают свои собственные системные вызовы, а просто вызывают C и заставляют библиотеку C делать системный вызов для этого.
Поэтому мой вопрос заключается в том, существует ли программированиеязык, который заставляет систему вызывать себя, вообще не взаимодействуя с библиотекой C?Например, прерывание и настройка регистров и т. Д.?
Я пытался найти несколько, но информации либо нет, либо они просто звонят на C.
Спасибо.

1 Ответ

0 голосов
/ 27 февраля 2019

Go (Голанг) делает это.Вот части исходного кода для системных вызовов Go Linux AMD64 , которые устанавливают регистры (Linux на x86_64 использует 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

Это предсказуемоНедостаток записи и поддержки одного файла для каждого соглашения ядра, умноженного на каждую поддерживаемую архитектуру. В каталоге в настоящее время есть файлы, указывающие поддержку для каждого из следующих:

  • aix_ppc64, darwin_386, darwin_amd64, darwin_arm, darwin_arm64, freebsd_arm, linux_386, linux_amd64, linux_arm, linux_6464, linux_6464, linux_6464, linux_6464linux_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 * 386 * unix_am
1014но в go1.11.4 linux / amd64 по умолчанию используется syscalls напрямую.
...