zoukankan      html  css  js  c++  java
  • 库函数调用和系统调用的区别


      库函数是语言本身的一部分,而系统函数是内核提供给应用程序的接口,属于系统的一部分。
      函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分。你要确保弄懂“trap(自陷)”这个关键字的含义。系统调用是在操作系统内核发现一个“trap”或中断后进行的(其中系统调用是软中断)

      函数库调用 VS 系统调用


    函数库调用

    系统调用

    在所有的ANSI C编译器版本中,C库函数是相同的

    各个操作系统的系统调用是不同的

    它调用函数库中的一段程序(或函数)

    它调用系统内核的服务

    与用户程序相联系

    是操作系统的一个入口点

    在用户地址空间执行

    在内核地址空间执行

    它的运行时间属于“用户时间”

    它的运行时间属于“系统”时间

    属于过程调用,调用开销较小

    需要在用户空间和内核上下文环境间切换,开销较大

    在C函数库libc中有大约300个函数

    在UNIX中大约有90个系统调用

    典型的C函数库调用:system fprintf malloc

    典型的系统调用:chdir fork write brk;


      库函数调用通常比行内展开的代码慢,因为它需要付出函数调用的开销。但系统调用比库函数调用还要慢很多,因为它需要把上下文环境切换到内核模式。

           

      系统调用和函数库的关系:

    ◆ 系统调用通过软中断int 0x80从用户态进入内核态。

    ◆ 函数库中的某些函数调用了系统调用。

    ◆ 函数库中的函数可以没有调用系统调用,也可以调用多个系统调用。

    ◆ 编程人员可以通过函数库调用系统调用。

    ◆ 高级编程也可以直接采用int 0x80进入系统调用,而不必通过函数库作为中介。

    ◆ 如果是在核心编程,也可以通过int 0x80进入系统调用,此时不能使用函数库。因为函数库中的函数是内核访问不到的。

      

      从用户调用库函数到系统调用执行的流程。

    1)  假设用户调用ssize_t write (int fields, cont void *buff, size_t nbytes);库函数。

    2) 库函数会执行int 0x80中断。因为中断使得进程从用户态进入内核态,所以参数通过寄存器传送。

    3) 0x80中断对应的中断例程被称为system call handler。其工作是:

    i.存储大多数寄存器到内核堆栈中。这是汇编代码写的。

    ii.执行真正的系统调用函数――system call service routine。这是C代码。

    iii.通过ret_from_sys_call ()返回,回到用户态的库函数。这是汇编代码。

    
  • 相关阅读:
    HDU 1114 Piggy-Bank
    HDU 2955 Robberies
    NTOJ 290 动物统计(加强版)
    POJ 3624 Charm Bracelet
    HDU 2602 Bone Collector
    POJ 1523 SPF(无向图割顶)
    HDU 5311 Hidden String
    HDU 1421 搬寝室
    HDU 1058 Humble Numbers
    POJ 3259 Wormholes(spfa判负环)
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4880011.html
Copyright © 2011-2022 走看看