首页 文章

在linux机器上调用系统调用[重复]

提问于
浏览
1

这个问题在这里已有答案:

通常,系统提供位于正常程序和操作系统之间的库或API . 在类Unix系统中,该API通常是C库(libc)实现的一部分,例如glibc,它为提供包装函数 . 系统调用 . 现在C程序可以调用这些库函数,因为这些库函数是用C编写的并进行系统调用 . 像Cobol或任何其他基于编译器的语言的语言如何在Linux上进行系统调用?这些语言无法调用系统提供的API .

2 回答

  • 0

    编译语言被翻译(编译)成机器语言 . 操作系统在执行期间读取机器语言并进行适当的系统调用 .

    所以,我不会说它是C,或任何编译语言,这使得系统调用 . 操作系统根据编译器生成的机器语言执行系统调用 .

  • 0

    一个例子可能会有所帮助:如果我使用gfortran编译这样一个简单的Fortran程序:

    PROGRAM HELLO
    
      WRITE(*,*) "HELLO WORLD"
    
      END
    

    我得到的代码看起来像这样(在x86-64上):

    000000000040079d <MAIN__>:
      40079d:       55                      push   %rbp
      40079e:       48 89 e5                mov    %rsp,%rbp
      4007a1:       48 81 ec e0 01 00 00    sub    $0x1e0,%rsp
      4007a8:       48 c7 85 28 fe ff ff    movq   $0x4008e0,-0x1d8(%rbp)
      4007af:       e0 08 40 00 
      4007b3:       c7 85 30 fe ff ff 03    movl   $0x3,-0x1d0(%rbp)
      4007ba:       00 00 00 
      4007bd:       c7 85 20 fe ff ff 80    movl   $0x80,-0x1e0(%rbp)
      4007c4:       00 00 00 
      4007c7:       c7 85 24 fe ff ff 06    movl   $0x6,-0x1dc(%rbp)
      4007ce:       00 00 00 
      4007d1:       48 8d 85 20 fe ff ff    lea    -0x1e0(%rbp),%rax
      4007d8:       48 89 c7                mov    %rax,%rdi
      4007db:       e8 c0 fe ff ff          callq  4006a0 <_gfortran_st_write@plt>
      4007e0:       48 8d 85 20 fe ff ff    lea    -0x1e0(%rbp),%rax
      4007e7:       ba 0b 00 00 00          mov    $0xb,%edx
      4007ec:       be e7 08 40 00          mov    $0x4008e7,%esi
      4007f1:       48 89 c7                mov    %rax,%rdi
      4007f4:       e8 57 fe ff ff          callq  400650 <_gfortran_transfer_character_write@plt>
      4007f9:       48 8d 85 20 fe ff ff    lea    -0x1e0(%rbp),%rax
      400800:       48 89 c7                mov    %rax,%rdi
      400803:       e8 78 fe ff ff          callq  400680 <_gfortran_st_write_done@plt>
      400808:       c9                      leaveq 
      400809:       c3                      retq
    

    在那里,您可以看到对gfortran库函数的三次调用(例如 gfortran_transfer_character_write ) . 看起来像gfortran插入这些来实现 WRITE 语句 . 库函数是implemented in C,最终将通过C库包装器调用底层系统调用 .

    当编译器构造对这些函数的调用时,它必须遵循C调用约定并对调用语言的数据类型执行任何转换 . 除此之外,这里没有魔力 . 一旦进入运行时库,就可以调用其他C库(如libc) .

相关问题